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_---------------------------------------- */}}



 
 
 

 

 


 

原创粉丝点击