面试hibernate缓存
来源:互联网 发布:淘宝上哪个冒菜好吃 编辑:程序博客网 时间:2024/06/04 00:56
hibernate是一个线程对应一个session,一个线程可以看成一个用户。也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和线程绑定了。
hibernate一级缓存生命周期很短,和session生命周期一样,一级缓存也称session级的缓存或事务级缓存。如果tb事务提交或回滚了,我们称session就关闭了,生命周期结束了。
缓存和连接池的区别:缓存和池都是放在内存里,实现是一样的,都是为了提高性能的。但有细微的差别,池是重量级的,里面的数据是一样的,比如一个池里放100个Connection连接对象,这个100个都是一样的。缓存里的数据,每个都不一样。比如读取100条数据库记录放到缓存里,这100条记录都不一样。
缓存主要是用于查询
//同一个session中,发出两次load方法查询
Student student = (Student)session.load(Student.class, 1);
System.out.println("student.name=" + student.getName());
//不会发出查询语句,load使用缓存
student = (Student)session.load(Student.class, 1);
System.out.println("student.name=" + student.getName());
第二次查询第一次相同的数据,第二次load方法就是从缓存里取数据,不会发出sql语句到数据库里查询。
//同一个session,发出两次get方法查询
Student student = (Student)session.get(Student.class, 1);
System.out.println("student.name=" + student.getName());
//不会发出查询语句,get使用缓存
student = (Student)session.get(Student.class, 1);
System.out.println("student.name=" + student.getName());
第二次查询第一次相同的数据,第二次不会发出sql语句查询数据库,而是到缓存里取数据。
Hibernate 二级缓存
二级缓存需要sessionFactory来管理,它是进初级的缓存,所有人都可以使用,它是共享的。
二级缓存比较复杂,一般用第三方产品。hibernate提供了一个简单实现,用Hashtable做的,只能作为我们的测试使用,商用还是需要第三方产品。
使用缓存,肯定是长时间不改变的数据,如果经常变化的数据放到缓存里就没有太大意义了。因为经常变化,还是需要经常到数据库里查询,那就没有必要用缓存了。
hibernate做了一些优化,和一些第三方的缓存产品做了集成。老师采用EHCache缓存产品。
和EHCache二级缓存产品集成:EHCache的jar文件在hibernate的lib里,我们还需要设置一系列的缓存使用策略,需要一个配置文件ehcache.xml来配置。这个文件放在类路径下。
//默认配置,所有的类都遵循这个配置
<defaultCache
//缓存里可以放10000个对象
maxElementsInMemory="10000"
//过不过期,如果是true就是永远不过期
eternal="false"
//一个对象被访问后多长时间还没有访问就失效(120秒还没有再次访问就失效)
timeToIdleSeconds="120"
//对象存活时间(120秒),如果设置永不过期,这个就没有必要设了
timeToLiveSeconds="120"
//溢出的问题,如果设成true,缓存里超过10000个对象就保存到磁盘里
overflowToDisk="true"
/>
我们也可以对某个对象单独配置:
<cache name="com.bjpowernode.hibernate.Student"
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="10000"
timeToLiveSeconds="10000"
overflowToDisk="true"
/>
还需要在hibernate.cfg.xml配置文件配置缓存,让hibernate知道我们使用的是那个二级缓存。
<!-- 配置缓存提供商 -->
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider</property>
<!-- 启用二级缓存,这也是它的默认配置 -->
<property name="hibernate.cache.use_second_level_cache">
true</property>
启用二级缓存的配置可以不写的,因为默认就是true开启二级缓存。
注意:二级缓存必须让sessionfactory管理,让sessionfactory来清除二级缓存。sessionFactory.evict(Student.class);//清除二级缓存中所有student对象,sessionFactory.evict(Student.class,1);//清除二级缓存中id为1的student对象。
如果在第一个session调用load或get方法查询数据后,把二级缓存清除了,那么第二个session调用load或get方法查询相同的数据时,还是会发出sql语句查询数据库的,因为缓存里没有数据只能到数据库里查询。
们查询数据后会默认自动的放到二级和一级缓存里,如果我们想查询的数据不放到缓存里,也是可以的。也就是说我们可以控制一级缓存和二级缓存的交换。
- 面试hibernate缓存
- hibernate的缓存机制(面试)
- JAVAEE面试之Hibernate缓存
- hibernate--一级缓存_二级缓存_查询缓存(面试)
- hibernate缓存
- Hibernate 缓存
- Hibernate 缓存
- hibernate 缓存
- hibernate 缓存
- Hibernate缓存
- hibernate缓存
- Hibernate 缓存
- hibernate 缓存
- Hibernate缓存~~~~~~
- Hibernate缓存
- Hibernate缓存
- Hibernate缓存
- Hibernate缓存
- 【Linux 入门笔记】文本处理工具
- 方(芳)格(哥)取数
- 【学习笔记】android API 实用工具
- VMware增加虚拟硬盘
- 十大OpenGL教程(转)
- 面试hibernate缓存
- 内存对齐
- C和指针第一章
- 初学Java,使用swicth与c#的不同(三)
- 面试
- nand
- java 将英文文章 按句子,标点符号分割,正则表达式
- 简介获取图片
- [LeetCode] Reverse Integer