1启用Hibernate二级缓存

Hibernate二级缓存分为两部分,class缓存和查询缓存,其获取对象的方式有所不同,但两者也有联系,查询缓存必须以class缓存为基础才能起作用,否则只会使效率更低。

我们这里使用的二级缓存是通过ehcache第三方插件实现的。

1.1配置Hibernate.cfg.xml

启用class缓存:

<property name="hibernate.cache.provider_class">

org.hibernate.cache.EhCacheProvider

</property>

启用查询缓存:

<property name="hibernate.cache.use_query_cache">true</property>

1.2配置Spring框架中的hibernate

启用class缓存:

<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>

启用查询缓存:

<prop key="hibernate.cache.use_query_cache">true</prop>

1.3配置ehcache

Ehcache配置文件为ehcache.xml,默认配置为:

<ehcache>

<diskStore path="java.io.tmpdir"/>

<defaultCache

maxElementsInMemory="10000"

eternal="false"

timeToIdleSeconds="1800"

timeToLiveSeconds="1800"

overflowToDisk="true"

/>

</ehcache>

其中各项内容的含义为:

1         diskStore:代表当二级缓存对象数据在内存中溢出,如果需要写入文件系统时的文件目录。

2         defaultCache:默认的calss缓存配置,如果某个对象没有其专有的配置时,ehcache一律启用默认配置。

3         maxElementInMemory:对象在内存中可存放的最大数量。

4         eternal:表示对象永不过期,如果选true则5,6两项无效。

5         timeToIdleSeconds:对象的空闲状态过期时间,单位为秒,0为可以无限制空闲。

6         timeToLiveSeconds:对象存在的最长时间,单位为秒(注意,如果该项比5项要小,则第5项无意义),0为永不过期。

7         overflowToDisk:当对象在内存中的数量超过maxElementInMemory值时,如果该项为true,则ehcahe会把对象数据写入diskStore项指定的目录。

如果需要对某个具体对象进行单独配置时,可以加上一组cache配置,例如:

<cache name="com.juyee.mp.bean.SysCodelist"

maxElementsInMemory="10000"

eternal="true"

timeToIdleSeconds="1800"

timeToLiveSeconds="0"

overflowToDisk="true"

/>

另外还有两个特殊的cache配置:

<cache name="org.hibernate.cache.UpdateTimestampsCache"

maxElementsInMemory="5000"

eternal="true"

timeToIdleSeconds="1800"

timeToLiveSeconds="0"

overflowToDisk="true"/>

<cache name="org.hibernate.cache.StandardQueryCache"

maxElementsInMemory="10000"

eternal="false"

timeToIdleSeconds="1800"

timeToLiveSeconds="0"

overflowToDisk="true"/>

这两个cache配置对应查询缓存,具体作用如下(摘用别人的描述):

“当hibernate更新数据库的时候,它怎么知道更新哪些查询缓存呢? hibernate在一个地方维护每个表的最后更新时间,其实也就是放在上面UpdateTimestampsCache所指定的缓存配置里面。

当通过hibernate更新的时候,hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时间和这个缓存所查询的表,当hibernate查询一个缓存是否存在的时候,如果缓存存在,它还要取出缓存的生成时间和这个缓存所查询的表,然后去查找这些表的最后更新时间,如果有一个表在生成时间后更新过了,那么这个缓存是无效的。

可以看出,只要更新过一个表,那么凡是涉及到这个表的查询缓存就失效了,因此查询缓存的命中率可能会比较低。”

当然,如果没有这两个配置,则ehcache将为查询缓存启用默认配置。

2如何使用class缓存

2.1对象缓存

Class缓存的作用主要是在内存中保存某个具体对象,当用户第一次通过get、iterator方式取出对象时,系统会先从class缓存中去找,如果没有再通过sql语句去数据库中查找相关记录,并将查询到的对象放入内存中。

实例:对某个对象使用二级缓存,只需要在该对象的hbm文件中配置即可

<cache usage="read-write"/>

我们注意到其中usage这个选项,它有多个选择,对应不同的含义,经常有这两种种:

1         read-only:只对缓存中的对象进行读操作。

2         read-write:当对象被update时,缓存中和数据库中一同被修改(缓存不支持事务回滚)。

2.2关联缓存

目前我们仅仅实现了对一个对象的缓存,那如何对该对象的关联对象集合进行缓存呢?

实例:对某个对象的关联对象集合的二级缓存,需要在该对象的hbm文件中set配置进行修改

<set name="children" lazy="true" order-by="treeid asc">

<cache usage="read-write"/>

<key column="PARENTID"/>

<one-to-many class="SysCodelist"/>

</set>

注意:

1         只对one-to-many有效,而且仅仅缓存的是关联对象的id集合,如果需要实现完全缓存,则需要对关联的对象也配置成使用二级缓存。

2         集合缓存是独立的,不受关联对象添加、删除的影响,如果要修改集合内容,必须对这个集合本身进行修改,例如:codelist.getChildren().add()。

3如何使用查询缓存

查询缓存,目的是为了将通过list()方法的查询结果存入缓存中,并实现对语句的缓存,如果下次用户在使用这条语句进行查询时,将直接从缓存中获取对象数据。

这里要注意的是,查询缓存必须配合class缓存使用,如果只启用查询缓存,不对查询对象启用二级缓存,则会大大降低查询效率。

因为,当第一次通过启用查询缓存的session进行语句查询时,系统只执行一次数据库查询将所有的记录取出,并将对象存入class缓存,语句及id集合存入查询缓存;而当用户第二次查询该语句时,系统将先执行去查询缓存中查找,取出所有符合条件的id集合,如果这时候该对象的class缓存没启用或在class缓存中已过期,系统将根据id,一个个去数据库load,实际上是进行了1+N次查询。

实际上,在我们系统中,并不是对所有对象都要进行二级缓存,而spring框架中提供的hibernate方法,虽然有getHibernateTemplate().setCacheQueries(),但该方法影响的是全局的配置,一旦启用,将会对不需要缓存的查询造成不良影响。

于是,我自己在hibernateService()中添加了一个方法:

public List findByCachedQuery(final String hql)

{

return (List) getHibernateTemplate().execute(new HibernateCallback() {

public Object doInHibernate(Session session) throws HibernateException {

Query queryObject = session.createQuery(hql);

queryObject.setCacheable(true);

if (getHibernateTemplate().getQueryCacheRegion() != null) {

queryObject.setCacheRegion(getHibernateTemplate().getQueryCacheRegion());

}

return queryObject.list();

}

}, true);

}

这样,将只在session范围内启用查询缓存,一旦该session结束了,那么查询缓存也将回复默认配置。

注意:使用时只支持hql。

4注意事项

在使用二级缓存时,注意,所有对数据库的修改都必须走hibernate,如果从其他系统来或使用sql语句来修改数据库相关记录,那么将对二级缓存的数据不会造成影响,换句话说,缓存中的对象数据将和数据库中的不一致。

转载于:https://blog.51cto.com/sunl2014/1426793

Hibernate二级缓存的使用相关推荐

  1. Hibernate 二级缓存使用

    1启用Hibernate二级缓存 Hibernate二级缓存分为两部分,class缓存和查询缓存,其获取对象的方式有所不同,但两者也有联系,查询缓存必须以class缓存为基础才能起作用,否则只会使效率 ...

  2. Hibernate EHCache - Hibernate二级缓存

    Hibernate EHCache - Hibernate二级缓存 欢迎使用Hibernate二级缓存示例教程.今天我们将研究Hibernate EHCache,它是最受欢迎的Hibernate二级缓 ...

  3. 配置Hibernate二级缓存步骤

    配置Hibernate二级缓存步骤: 加入二级缓存的jar包及配置文件 jar包位置:hibernate-release-4.1.8.Final\lib\optional\ehcache下所有jar包 ...

  4. Hibernate二级缓存问题

    相关概念和定义 1.缓存的意义 把一些不常修改,但是又经常用的数据存放到内存中,这样能减少与数据库的交互,提升程序的性能 2.Hibernate中提供了两级缓存: 第一级别的缓存是Session级别的 ...

  5. HibernateEHCache –Hibernate二级缓存

    Welcome to the Hibernate Second Level Cache Example Tutorial. Today we will look into Hibernate EHCa ...

  6. hibernate二级缓存(三) 自定义实现一个简单的hibernate二级缓存

    hibernate二级缓存(三) 自定义实现一个简单的hibernate二级缓存 前面我们已经提及过hibernate内部为二级缓存的扩展做了很多的实现.我们只需要实现RegionFactoryTem ...

  7. spring boot 2.1.4 hibernate二级缓存 Hazelcast实现(一)

    Hazelcast优势网上都可以查到,默认的分布式缓存,使用Hazelcast替换ehcache优势比较明显,也方便项目从单机到发展分布式,而不用再引入其他组件也达到了性能要求,按照springboo ...

  8. Hibernate二级缓存详解(转)

    Hibernate二级缓存详解(转) 本文转载 http://www.blogjava.net/supercrsky/articles/238580.html 与Session相对的是,Session ...

  9. ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存

    ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate  : Hibernate是一个持久层框架,经常访问物理数据库 ...

最新文章

  1. mysql 安装更改目录权限设置密码_mysql-8.0 安装教程(自定义配置文件,密码方式已修改)...
  2. 如何确定电脑主板坏了_光纤收发器容易坏吗?如何判断光纤收发器的故障?
  3. 堆 和 栈的 区别(经典)
  4. 充分发挥bpl包的作用
  5. 会签是什么意思_后宫为什么要争宠·六
  6. 二叉树先序,中序,后序,层次遍历(数据结构)
  7. nvidia驱动崩了 ubuntu_Ubuntu 16.04安装nVidia驱动失败!
  8. 【大数据】Hadoop入门预告版
  9. python集合操作班级干部竞选演讲稿_精选竞选班干部的演讲稿集合7篇
  10. 基于jquery响应式网站图片无限加载瀑布流布局
  11. PHP如何关闭notice级别的错误提示
  12. 解决Google Chrome添加快捷方式图标模糊
  13. C#-钉钉开发H5应用-事件订阅
  14. 一些javascript内容
  15. mysql分区表 缓存_Mysql 分区表-分区操作
  16. 使用Photoshop2022给图片制作出精彩的渐变效果
  17. 方式SingleTask 启动Intent设置 不能如愿打开需要的Activity
  18. 二分查找的相关内容(详细)
  19. 信息学奥赛一本通C++语言-----2036:【例5.3】开关门
  20. Android 收音机相关知识

热门文章

  1. How Vmware snapshots works
  2. Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)
  3. 127 - Accordian Patience
  4. RESTful三理解
  5. keil 器件是空的,Keil的Device为空,不能选择器件
  6. u32和字符串的转换函数
  7. “桥铁”旅行团春节昌旺 业界称成港人出游新模式
  8. 电子书下载:Moving to Microsoft Visual Studio 2010
  9. [ Nowcoder Contest 165 #D ] 合法括号序列
  10. 从各方面数据来看《猎场》为什么收官后热度依旧