hibernate二级缓存

hibernate二级缓存

二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享
二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存

二级缓存的配置和使用:
* 将echcache.xml文件拷贝到src下
* 开启二级缓存,修改hibernate.cfg.xml文件(其实默认就是开启的)
<property name="hibernate.cache.use_second_level_cache">true</property>
* 指定缓存产品提供商,修改hibernate.cfg.xml文件
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
* 指定那些实体类使用二级缓存(两种方法)
* 在映射文件中采用<cache>标签(放在ID标签前面)
* 在hibernate.cfg.xml文件中,采用<class-cache>标签(推荐使用这个方法)

二级缓存是缓存实体对象的

了解一级缓存和二级缓存的交互


=======================================================
一 级缓存是伴随着session一起的,session消亡了,对应的一级缓存也就没有了,而二级缓存则不一样,不同的session是可以共享二级缓存 的!下面的程序,如果没有开启二级缓存,则会发两次sql,但开启后只会发一次,如果将下面的load换成get效果也是一样的
  1. /**
  2. *开启两个session,分别调用load,(get和load也一样)
  3. */
  4. publicvoidtestCache1(){
  5. Sessionsession=null;
  6. try{
  7. session=HibernateUtils.getSession();
  8. session.beginTransaction();
  9. //get和load也一样
  10. Studentstudent=(Student)session.load(Student.class,1);
  11. System.out.println("student.name="+student.getName());
  12. session.getTransaction().commit();
  13. }catch(Exceptione){
  14. e.printStackTrace();
  15. session.getTransaction().rollback();
  16. }finally{
  17. HibernateUtils.closeSession(session);
  18. }
  19. try{
  20. session=HibernateUtils.getSession();
  21. session.beginTransaction();
  22. //不会发出sql,因为开启了二级缓存,session是共享二级缓存的
  23. Studentstudent=(Student)session.load(Student.class,1);
  24. System.out.println("student.name="+student.getName());
  25. session.getTransaction().commit();
  26. }catch(Exceptione){
  27. e.printStackTrace();
  28. session.getTransaction().rollback();
  29. }finally{
  30. HibernateUtils.closeSession(session);
  31. }
  32. ================================================================
  33. /**
  34. *开启两个session,分别调用load,在使用SessionFactory清除二级缓存
  35. */
  36. publicvoidtestCache3(){
  37. Sessionsession=null;
  38. try{
  39. session=HibernateUtils.getSession();
  40. session.beginTransaction();
  41. Studentstudent=(Student)session.load(Student.class,1);
  42. System.out.println("student.name="+student.getName());
  43. session.getTransaction().commit();
  44. }catch(Exceptione){
  45. e.printStackTrace();
  46. session.getTransaction().rollback();
  47. }finally{
  48. HibernateUtils.closeSession(session);
  49. }
  50. //管理二级缓存
  51. SessionFactoryfactory=HibernateUtils.getSessionFactory();
  52. //factory.evict(Student.class);  在这种情况下,会将所有的二级缓存全部清除,下面的只会清除指定的
  53. factory.evict(Student.class,1);
  54. try{
  55. session=HibernateUtils.getSession();
  56. session.beginTransaction();
  57. //会发出查询sql,因为二级缓存中的数据被清除了
  58. Studentstudent=(Student)session.load(Student.class,1);
  59. System.out.println("student.name="+student.getName());
  60. session.getTransaction().commit();
  61. }catch(Exceptione){
  62. e.printStackTrace();
  63. session.getTransaction().rollback();
  64. }finally{
  65. HibernateUtils.closeSession(session);
  66. }
  67. }
  68. /**
  69. *一级缓存和二级缓存的交互
  70. */
  71. publicvoidtestCache4(){
  72. Sessionsession=null;
  73. try{
  74. session=HibernateUtils.getSession();
  75. session.beginTransaction();
  76. //仅向二级缓存读数据,而不向二级缓存写数据
  77. session.setCacheMode(CacheMode.GET);
  78. Studentstudent=(Student)session.load(Student.class,1);
  79. System.out.println("student.name="+student.getName());
  80. session.getTransaction().commit();
  81. }catch(Exceptione){
  82. e.printStackTrace();
  83. session.getTransaction().rollback();
  84. }finally{
  85. HibernateUtils.closeSession(session);
  86. }
  87. try{
  88. session=HibernateUtils.getSession();
  89. session.beginTransaction();
  90. //发出sql语句,因为session设置了CacheMode为GET,所以二级缓存中没有数据
  91. Studentstudent=(Student)session.load(Student.class,1);
  92. System.out.println("student.name="+student.getName());
  93. session.getTransaction().commit();
  94. }catch(Exceptione){
  95. e.printStackTrace();
  96. session.getTransaction().rollback();
  97. }finally{
  98. HibernateUtils.closeSession(session);
  99. }
  100. try{
  101. session=HibernateUtils.getSession();
  102. session.beginTransaction();
  103. //只向二级缓存写数据,而不从二级缓存读数据
  104.    // 如果此处不设置cachemode,但它不会发Sql因为上一个已经存了数据,它已经放到了二级缓存中,
  105.    //默认的情况下,是可以读取的,貌似此处的每一次设置cachemode只针对当前的session有效??
  106. session.setCacheMode(CacheMode.PUT);
  107. //会发出查询sql,因为session将CacheMode设置成了PUT
  108. Studentstudent=(Student)session.load(Student.class,1);
  109. System.out.println("student.name="+student.getName());
  110. session.getTransaction().commit();
  111. }catch(Exceptione){
  112. e.printStackTrace();
  113. session.getTransaction().rollback();
  114. }finally{
  115. HibernateUtils.closeSession(session);
  116. }
  117. }
  118. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值