Hibernate中缓存机制
来源:互联网 发布:apache评分与死亡率 编辑:程序博客网 时间:2024/06/05 12:49
Session的缓存(一级缓存):
当使用session操作对象(保存或更新),
session会将该对象放到缓存中
当使用非list()方法进行查询,session首先到缓存中
查找,如果没有,则发送查询语句到数据库中查找
SessionFactory的缓存(二级缓存,优先级比一级缓存高):
缓存中数据的生命周期与SessionFactory相同
即使session关闭,数据依然存在缓存中
使用二级缓存:
在hibernate.cfg.xml中配置
* 打开二级缓存的开关
<property name="hibernate.cache.use_second_level_cache">
true
</property>
* 使用的缓存的类
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
选择缓存处理的开发商,依赖第三方技术(OsCache,EhCache)
* 搭建EhCache的环境
拷贝hibernate3.5/project/etc/ehcache.xml到src下
hibernate3.5/lib/optional/ehcache/ehcache-1.5.0.jar
* 配置选择使用二级缓存的对象
<class-cache usage="read-only" class="com.tarena.demo.po.User"/>
具体案例:
package com.tarena.test;import java.util.Iterator;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.junit.Test;import com.tarena.demo.po.User1;import com.tarena.demo.util.HibernateUtils;/** *测试Session的缓存 * */public class TestSessionCache {/** * get方法会将该对象放到缓存中 * session首先到缓存中查找对象,如果没有找到,再到数据库中查找(发送select语句) */@Testpublic void test01(){Session session = HibernateUtils.getSession();User1 user1 = (User1)session.get(User1.class, 6);System.out.println(user1.getUserName());System.out.println("---------------");User1 user2 = (User1)session.get(User1.class, 6);System.out.println(user2.getUserName());HibernateUtils.close(session);/** * 运行结果:Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?李四---------------李四 */}/** * 测试list() * 发送一条SQL语句 * 该方法没有到缓存中查找数据的功能 */@Testpublic void test02(){Session session = HibernateUtils.getSession();String hql = "from User1";Query query = session.createQuery(hql);List<User1> list = query.list();for (User1 user1 : list) {System.out.println(user1.getUserName()+"**"+user1.getUserPassword());}System.out.println("-----------------");list = query.list();for (User1 user1 : list) {System.out.println(user1.getUserName()+"**"+user1.getUserPassword());}HibernateUtils.close(session);/** * 运行结果: * Hibernate: select user1x0_.uid as uid0_, user1x0_.userName as userName0_, user1x0_.userPassword as userPass3_0_ from t_user user1x0_ 诸葛亮**111 诸葛亮**111 诸葛亮**111 张三**123456 李四**123456 李四**123456 李四**123456 李四**123456 李四**123456 李四**123456 张三1**123456 ----------------- Hibernate: select user1x0_.uid as uid0_, user1x0_.userName as userName0_, user1x0_.userPassword as userPass3_0_ from t_user user1x0_ 诸葛亮**111 诸葛亮**111 诸葛亮**111 张三**123456 李四**123456 李四**123456 李四**123456 李四**123456 李四**123456 李四**123456 张三1**123456 */}/** * 测试iterate() * 会发出N+1条SQL语句 * 首先会发出查询所有记录id的SQL语句 * 然后根据id查询所有记录 * * 该方法具备到缓存中查找数据的功能 * 首先会发出查询所有记录id的SQL语句 * 在缓存找根据id查找对象 */@Testpublic void test03(){Session session = HibernateUtils.getSession();String hql = "from User1";Query query = session.createQuery(hql);Iterator<User1> it = query.iterate();while(it.hasNext()){User1 user = it.next();System.out.println(user.getUserName()+":"+user.getUserPassword());}session.clear();System.out.println("----------------");it = query.iterate();while(it.hasNext()){User1 user = it.next();System.out.println(user.getUserName()+":"+user.getUserPassword());}HibernateUtils.close(session);/** * 运行结果: * Hibernate: select user1x0_.uid as col_0_0_ from t_user user1x0_Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?诸葛亮:111Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?诸葛亮:111Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?诸葛亮:111Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?张三:123456Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?李四:123456Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?李四:123456Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?李四:123456Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?李四:123456Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?李四:123456Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?李四:123456Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?张三1:123456----------------Hibernate: select user1x0_.uid as col_0_0_ from t_user user1x0_诸葛亮:111诸葛亮:111诸葛亮:111张三:123456李四:123456李四:123456李四:123456李四:123456李四:123456李四:123456张三1:123456 */}/** * 测试其他方法对缓存的使用 * save()方法,saveOrUpdate方法,update方法,get()方法,load()方法,iterate()方法 * 数据量比较庞大的时候不用hibernate,因为save()的时候,会往缓存中放 * 缓存可能会出现溢出。 */@Testpublic void test04(){Session session = HibernateUtils.getSession();for(int i=1;i<=10;i++){User1 user = new User1();user.setUserName("www");user.setUserPassword("tarena");session.save(user);session.beginTransaction().commit();//if(i%5 == 0){//session.clear(); 如果数据太多,可以采取这种方式清除session中的缓存数据//}}User1 user2 = (User1)session.load(User1.class, 60);//不到数据库中去查询System.out.println(user2);HibernateUtils.close(session);/** * 运行结果: * Hibernate: insert into t_user (userName, userPassword) values (?, ?)Hibernate: insert into t_user (userName, userPassword) values (?, ?)Hibernate: insert into t_user (userName, userPassword) values (?, ?)Hibernate: insert into t_user (userName, userPassword) values (?, ?)Hibernate: insert into t_user (userName, userPassword) values (?, ?)Hibernate: insert into t_user (userName, userPassword) values (?, ?)Hibernate: insert into t_user (userName, userPassword) values (?, ?)Hibernate: insert into t_user (userName, userPassword) values (?, ?)Hibernate: insert into t_user (userName, userPassword) values (?, ?)Hibernate: insert into t_user (userName, userPassword) values (?, ?)com.tarena.demo.po.User1@fa39d7 * */}/** * 测试2级缓存 */@Testpublic void test05(){Session session = HibernateUtils.getSession();User1 user1 = (User1)session.load(User1.class, 6);System.out.println(user1.getUserName());HibernateUtils.close(session);System.out.println("----------");session = HibernateUtils.getSession();User1 user2 = (User1)session.load(User1.class, 6);System.out.println(user1.getUserName());HibernateUtils.close(session);/** * 运行结果: * Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?李四----------李四 */}/** * 测试懒加载 * 使用对象才到数据库查询,不使用,hibernate会返回一个代理对象。 * 如果将User1类改为final类,即不可以继承子类。则不会生成代理对象 * load iterate()方法支持懒加载 */@Testpublic void test06(){Session session = HibernateUtils.getSession();User1 user1 = (User1)session.load(User1.class, 6);System.out.println(user1.getClass().getName());System.out.println("-------------------------");HibernateUtils.close(session);/** * 运行结果: * com.tarena.demo.po.User1_$$_javassist_0------------------------- */}/** * 测试iterate()方法支持懒加载 */@Testpublic void test07(){Session session = HibernateUtils.getSession();Iterator<User1> it = session.createQuery("from User1").iterate();System.out.println("-------------------------");while(it.hasNext()){System.out.println(it.next().getUserName());}System.out.println("-----------以下是list()方法-------------");List<User1> users = session.createQuery("from User1").list();System.out.println("----------------------------------------");HibernateUtils.close(session);/** * 运行结果: * Hibernate: select user1x0_.uid as col_0_0_ from t_user user1x0_-------------------------Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?诸葛亮Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?诸葛亮Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?诸葛亮Hibernate: select user1x0_.uid as uid0_0_, user1x0_.userName as userName0_0_, user1x0_.userPassword as userPass3_0_0_ from t_user user1x0_ where user1x0_.uid=?-----------以下是list()方法-------------Hibernate: select user1x0_.uid as uid0_, user1x0_.userName as userName0_, user1x0_.userPassword as userPass3_0_ from t_user user1x0_---------------------------------------- */}}
- Hibernate中缓存机制
- hibernate中session一级缓存机制
- Hibernate缓存机制介绍
- Hibernate:缓存机制解析
- Hibernate:缓存机制解析
- Hibernate的缓存机制
- Hibernate的缓存机制
- Hibernate的缓存机制
- HIbernate缓存机制
- Hibernate的缓存机制
- hibernate的缓存机制
- Hibernate缓存机制
- Hibernate缓存机制2
- Hibernate缓存机制介绍
- Hibernate缓存机制
- hibernate缓存机制
- hibernate 缓存机制
- hibernate缓存机制
- springMVC教程
- 序
- 字母重排 stl
- HDU 2084(数塔)
- 字符设备 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()函数的区别
- Hibernate中缓存机制
- 【转】精明的程序员——小程大爱
- httpclient 状态码
- 二叉树
- 四舍六入五成双
- 动静始然
- QuickSort/快速排序/快排
- 集合链表解析
- 嵌入式Linux操作系统学习规划