当前位置: 首页 > 知识库问答 >
问题:

如何使用hibernate ehcache缓存列表

彭坚壁
2023-03-14

我在我的web应用程序中使用hibernate ehcache。我缓存了列表,如下所示。

model.put("projecttype",sessionfactory.getCurrentSession().createCriteria(TblProjectType.class).list());
         System.out.println("Fetch Count="+ stats.getEntityFetchCount());
        System.out.println("Second Level Hit Count="+ stats.getSecondLevelCacheHitCount());
        System.out.println("Second Level Miss Count="+ stats.getSecondLevelCacheMissCount());
        System.out.println("Second Level Put Count="+ stats.getSecondLevelCachePutCount());

EHCACHE.xml

<cache
    name="com.uniphore.timesheet.domain.TblProjectType"
    maxElementsInMemory="1000"
    eternal="false"
    timeToIdleSeconds="300"
    timeToLiveSeconds="600"
    overflowToDisk="true" statistics="true"/>
TblProjectType table has 5 rows only.

我的输出:

--First---
Fetch Count=0
Second Level Hit Count=0
Second Level Miss Count=0
Second Level Put Count=0
--Second---
Fetch Count=0
Second Level Hit Count=0
Second Level Miss Count=0
Second Level Put Count=11
---Third--
Fetch Count=0
Second Level Hit Count=0
Second Level Miss Count=0
Second Level Put Count=22

我的Ebtity Class:

 @Entity
    @Table(name="tblProjectType")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @Repository
    public class TblProjectType  implements java.io.Serializable {

        private static final long serialVersionUID = -1798070786993154681L;
         @Id
         @GeneratedValue
         @Column(name ="ID")
         private short id;
         @Column(name ="TypeName")
         private String typeName;
         @Column(name="CreatedDate")
         private Date createdDate;
         @Column(name="ModifiedDate")
         private Date modifiedDate;
         @OneToMany(fetch = FetchType.LAZY, mappedBy = "tblProjectType", cascade = CascadeType.ALL)
         private Set<TblStage> tblStages = new HashSet<TblStage>(0);
         @OneToMany(fetch = FetchType.LAZY, mappedBy = "tblProjectType", cascade = CascadeType.ALL)
         private Set<TblProject> tblProjects = new HashSet<TblProject>(0);

        //getters and setters 



    }

每次放置计数增加 11。但没有其他值更改。为什么第二级缓存未命中?

为什么每次都执行查询而不是从二级缓存中获取结果?

为什么第二级放置计数在我命中它应该更新而不是插入的同一查询时增加?任何帮助都将不胜感激!!!

共有1个答案

邓元白
2023-03-14

尝试两件事。

>

  • 在实体类中指定缓存区域

    @Entity
    @Table(name="tblProjectType")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, region="yourcacheregion")
    @Repository
    public class TblProjectType  implements java.io.Serializable {
    }
    

    将条件查询标记为可缓存

    model.put("project type",sessionfactory.getCurrentSession(). createCriteria(TblProjectType.class)... setCacheable(true). list());

    我假设您具有如下所示的Hibernate配置

    <property name="hibernate.cache.use_second_level_cache" value="true"/>
    <property name="hibernate.cache.use_query_cache" value="true"/>
    <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>
    <property name="hibernate.generate_statistics" value="true"/>
    

  •  类似资料:
    • 我有javaSpring启动应用程序。我想对经常读取的数据使用缓存。为此,我在我的jar中包含了以下依赖项 我还使用了@EnableCaching注释 使用@Cacheable注释和返回要缓存的数据的函数 但我仍然无法缓存数据。有什么我遗漏的吗?

    • 我的@cacheable方法有下一个签名: 该过滤器使用reporisoty,以limit作为分页参数,返回实体列表。我正在尝试在向系统添加实体时更新缓存: java.lang.ClassCastException:不能将com.java.domain.Entity强制转换为java.util.List

    • 问题内容: 我已经使用了C#Redis缓存。 但我想像这样存储数据 这样一键就可以存储所有客户列表,并且可以轻松地在该列表内搜索,分组,过滤客户数据 欢迎使用或回答 问题答案: 您可以使用ServiceStack.Redis高级IRedisTypedClient Typed API 来管理丰富的POCO类型。 首先为具有以下条件的客户获取类型化的Redis客户端: 这将解决用于管理客户POCO的高

    • 我调用服务器数据通过使用ajax在index.html.它是完美的获取这些数据。现在,我正在和服务人员一起工作。我可以缓存所有的静态资产(图像,js,css),并在Chrome开发工具的应用程序选项卡中的缓存存储中检查这些缓存的资产。我可以在网络选项卡中看到这些资产也被缓存(磁盘缓存)。 现在,我想使用ServiceWorker缓存这些ajax响应(图像文件数组)。在“网络”选项卡中,我可以看到它

    • 问题内容: 我对Docker的层缓存表现出色感到惊讶,但我也想知道它如何确定是否可以使用缓存的层。 让我们以这些构建步骤为例: 例如,它如何知道可以使用缓存的层,但可以为其创建新层呢? 问题答案: 在Dockerfile最佳实践构建缓存部分中相当详尽地解释了构建缓存过程。 * 从缓存中已存在的基本映像开始,将下一条指令与从该基本映像派生的所有子映像进行比较,以查看是否其中一个是使用完全相同的指令构

    • classpath : herosphp\cache\CacheFactory herophp的缓存是通过缓存工厂来管理的,CacheFactory 负责创建缓存,默认采用的是单例模式,也就是同一类型的缓存在应用中只会存再一个实例。 $cacher = CacheFactory::create('file', true); 我们为缓存工具定义了一个 ICache接口,它定义了以下接口方法: get