Hibernate 之 二级缓存
来源:互联网 发布:js实现发表评论功能 编辑:程序博客网 时间:2024/05/22 03:03
在上篇文章中我们对缓存以及Hibernate的一级缓存进行了介绍,接下来的主要内容将是Hibernate的二级缓存.
二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享,换句话说就是一级缓存可以用二级缓存里的内容.二级缓存的生命周期和SessionFactory(重量级,一个数据库一个SessionFactory)的生命周期一致,SessionFactory可以管理二级缓存.
二级缓存在Hibernate中有自己的实现叫做HashTable,但是不建议用它进行商用,可以用来进行测试.Hibernate的二级缓存有专门的缓存策略提供商(Cache Providers),例如EHCache,OSCache等.在这篇文章中我们主要介绍一下Hibernate二级缓存EHCache的用法.
二级缓存EHCache的配置和使用.
*将ehcache.xml文件拷贝到src下(在Hibernate3\etc\ehcache.xml路进行.从hibernate相关的例子中找配置文件)如下图:
默认配置.
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
配置的解释如下:
<!--缺省配置 可以对类进行单独配置-->
<!--最大对象数目 -->
<!--是否过期 -->
<!--多长时间没有被访问 -->
<!--如果超过限制,则放入磁盘中 -->
可以进行单独配置
<cache name="sampleCache2"
maxElementsInMemory="1000"
eternal="true"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
overflowToDisk="false"
/>
*在hibernate.cfg.xml文件中加入缓存产品提供商
<propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
* 启用二级缓存,这也是它的默认配置,在hibernate.cfg.xml配置文件中进行启动二级缓存配置.
<propertyname="hibernate.cache.use_second_level_cache">true</property>
*指定哪些实体类使用二级缓存
可以在映射文件中采用<cache>标签指定或在hibernate.cfg.xml文件中统一指定
注意使用的策略,通常采用read-only和read-write.
例如在配置文件中统一进行配置.(此处笔者将对Student类进行配置)
<class-cacheusage="read-only" class="com.tgb.hibernate.Student"/>
*以上便完成了EHCache的基本配置,接下来便是在具体的代码中运用
例如在两个Session中发Load查询,因为我们配置了二级缓存,所以在第二次Load的过程中不在发出查询语句,而是直接从二级缓存中获取数据.
测试代码如下:
/** * 二级缓存测试代码 * */public class CacheTest extends TestCase {/** * 开启二级缓存 * 在两个session中发load查询 */public void testCache() {Session session = null;try {//获取sessionsession = HibernateUtils.getSession();//开启事务session.beginTransaction();//第一次用load查询id为1的学生Student student = (Student)session.load(Student.class, 1);System.out.println("student.name=" + student.getName());//提交session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {HibernateUtils.closeSession(session);}try {session = HibernateUtils.getSession();session.beginTransaction();第二次用load查询id为1的学生Student student = (Student)session.load(Student.class, 1);//不会发出查询语句,因为配置二级缓存,session可以共享二级缓存中的数据//二级缓存是进程级的缓存System.out.println("student.name=" + student.getName());session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {HibernateUtils.closeSession(session);}}}
以上便是Hibernate二级缓存的EHCache产品的使用方式.当然二级缓存有着自己适用的场景.
适合存放到第二级缓存中的数据?
1很少被修改的数据
2不是很重要的数据,允许出现偶尔并发的数据
3不会被并发访问的数据
4参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。
不适合存放到第二级缓存的数据?
1经常被修改的数据
2财务数据,绝对不允许出现并发
3与其他应用共享的数据。
总结
缓存是为性能而生,但不要想当然的以为缓存一定能提高性能,仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的,在不了解原理的情况下乱用,可能会有N+1的问题。不当的使用还可能导致读出脏数据。
- Hibernate 之 二级缓存
- Hibernate之二级缓存运用
- Hibernate 之 二级缓存
- hibernate小结之二级缓存
- Hibernate之二级缓存
- Hibernate开发之二级缓存
- hibernate之二级缓存
- Hibernate之二级缓存
- Hibernate 之 oscache实现二级缓存
- Hibernate 之 oscache实现二级缓存
- 温故知新之Hibernate二级缓存原理
- Hibernate进阶之SessionFactory二级缓存
- hibernate缓存学习之【二级缓存】
- hibernate进二阶之理解二级缓存
- Hibernate教程之八二级缓存
- Hibernate之Hibernate+EHCache配置二级缓存实战
- hibernate学习之旅之二级缓存
- Hibernate的二级缓存之查询缓存
- Mac下配置Android NDK环境并搭建Cocos2d-x环境并Eclipse正常编译运行Cocos2dX自带TestsDemo项目!
- test
- vi中怎么取消 查找 后的着色标记
- Binder通信流程图
- NYOJ-92:图像有用区域
- Hibernate 之 二级缓存
- 【VC报错】fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h
- 作为软件工程师,你必须知道的20个常识
- newLISP语法
- AS3.0易错点1———————————— TextFormat用法
- Flex 折线图中对折线手动设置显示问题
- Linux CURL的安装和使用
- 对于UITableViewStyleGrouped类型的UITableView的背景色设置问题
- 解决 项目报错java.net.bindexception: address already in use: jvm_bind:8080