Hibernate缓存原理与查询缓存的组合探究

本文探讨了Hibernate中的二级缓存和查询缓存的工作原理及其组合使用的效果。通过对比load和list方法在不同缓存配置下的表现,揭示了如何有效利用这两种缓存来提升应用性能。

来源:http://www.javaeye.com/topic/431603


0.前言

         由于对Hibernate的二级缓存和查询缓存的区别不了解,也不知道它们起什么作用。于是动手做了一些实验,对它们的组合使用有了一个表面的认识。

1.前提

         1) 不使用一级缓存(Session级别)的情况。因为大部分api对session的操作都进行n层封装,用完session就close,一般很少使用到一级缓存。

         2) 开启hibernate.show_sql=true,根据sql的是否输出来判断是否访问了数据库。

2.基础

2.1.二级缓存

         二级缓存是SessionFactory级别的全局缓存,它为每个类(或集合)提供缓存。凡是调用二级缓存的查询方法都会从中受益,比如load,list,iterate等方法(注意,get和find不使用缓存,直接访问数据库)。

         开启条件:

         1)hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider(这里指定了ehcache)

         2)hbm.xml配置<cache usage="read-write"/>

         3)ehcache.xml定义该类的cache

         简单地说,二级缓存是用来保存类对象的,并且填充它的所有属性值。

2.2.查询缓存

         查询缓存保存的是查询方法(list和iterate等)查询的sql语句和结果集,跟load这种装载对象的方法没有关系。也就是说,使用load方法,查询缓存不理睬。

         并且这个结果集只是对象id列表,对象的其他属性值不保存。例如,list执行的时候,先根据查询缓存中的sql语句,获取对象id列表,然后再load(id)来取对象。

         开启条件:

         1) hibernate.cache.use_query_cache=true

         2)Query或者Criteria使用时,设置setCacheable(true)

         简单地说,查询缓存是用来保存sql执行后获取的对象id列表。下一次执行同一条sql时,可直接从查询缓存中获取到对象id列表。

3.实验

         以下对最常用的load和list方法进行二级缓存和查询缓存的组合测试。load和list执行的结果,都是返回同一个对象。

3.1.四种组合

         二级缓存和查询缓存的组合,根据开启和不开启两种情况,划分为四种组合(√代表开启,×代表不开启):

        

组合

二级缓存

查询缓存

1

×

2

×

3

4

×

×

3.2.load实验

         对同一个id,使用load执行两次,观察sql的输出现象,也就是判断第二次load是否访问了数据库。其中√代表输出,×代表未输出:

 

组合

第一次sql

第二次sql

结论

1

×

与查询缓存无关

2

3

×

4

 

         当开启了二级缓存,load先从缓存中获取对象,于是组合1和3的第二次sql都未输出,即第二次查询没有访问数据库。

         当没有开启二级缓存,load总是直接访问数据库的。也证明了,查询缓存与load方法无关。

3.3.list实验

         对同一条sql语句,使用list执行两次,观察sql的输出现象。其中√代表输出,×代表未输出:

 

组合

第一次sql

第二次sql

结论

1

list每次访问数据库都会填充二级缓存,相当于二级缓存无效

2

√(不一样)

这两条sql语句不一样,第一条是list的,第二条是load的

3

×

 

4

 

 

         对组合1现象的解释:

         当没有开启查询缓存时,list每次都会直接访问数据库,然后把二级缓存给重新填充。也就是说,list在不开启查询缓存的情况下,根本就没有利用到二级缓存的好处。

         对组合2现象的解释:

         第一条sql是list正常访问数据库的,但第二次执行list时,由于有了查询缓存,直接根据第一条sql获取对象的id,此时由于没有开启二级缓存,load(id)后也没法从二级缓存中拿数据,只好再次访问数据库。但在组合3中,load(id)可以从二级缓存中拿数据,所以不用访问数据库。

3.4.小结

         在load和list方法中,使用二级缓存和查询缓存的不同组合,效果出现了差别。特别强调的是,由于很多操作是基于list的,如果没有开启查询缓存,根本就使用不了二级缓存的数据,也就提高不了性能了(但是iterate可以使用到二级缓存)。

         另外,从表格中可以看出来,同时开启二级缓存和查询缓存,效果是最好的,第二次查询都不需要访问数据库。



4.维护

         当存在除hibernate之外的改变数据库数据的方式时,维护二级缓存和查询缓存是很麻烦的。比如使用jdbc或者第三方系统修改了数据库,hibernate都不知道,也就没法自行维护缓存了。这时需要手动维护,如果存在第三方系统,还需要让第三方系统发消息通知hibernate。

         维护手段也就是evict(清除某个类的二级缓存)和evictQuery(清除查询缓存)。针对数据修改的三种形式,分别维护:

         1)insert:evictQuery

         2)delete:evict和evictQuery

         3)update:evict


Hibernate 不能实时获取数据库中更新的记录问题解决



可以先看这个理解一下(N+1 问题,,,,

Hibernate二级缓存与查询缓存的组合探究



一般来讲ORM中的缓存分为以下几类:
         1: 事务级缓存:即在当前事务范围内的数据缓存. 就Hibernate来讲, 事务级缓存是基于Session的生命周期实现的,每个Session内部会存在一个数据缓存,它随着 Session的创建而存在,随着Session的销毁而灭亡,因此也称为Session Level Cache.
         2: 应用级缓存: 即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享(数据库事务或应用事务),事务之间的缓存共享策略与应用的事务隔离 机制密切相关.在Hibernate中 ,应用级缓存由SessionFactory实现,所有由一个SessionFactory创建的 Session实例共享此缓存,因此也称为SessionFactory Level Cache.
         3: 分布式缓存:即在多个应用实例,多个JVM间共享的缓存策略.分布式缓存由多个应用级缓存实例组成,通过某种远程机制(RMI,JMS)实现各个缓存实例间的数据同步,任何一个实例的数据修改,将导致整个集群间的数据状态同步.

Hibernate缓存体系之查询缓存http://www.ylzx8.cn/zonghe/other/999827.html

  Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache

查询缓存,缓存的key是hql语句,缓存的value是满足hql语句的记录的主键值。也就是说,查询缓存,只是缓存数据库记录的主键值,并不会缓存记录的所有字段值。

 

    默认hibernate不会开启查询缓存,这是因为查询缓存只有在hql/hql语句语义完全一致的时候,才能命中。而实际查询场景下,查询条件、分页、 排序等构成的复杂查询sql语句很难完全一致。可能是hibernate觉得命中率低,所以默认关闭了查询缓存。我们可以根据实际使用情况,决定是否开启 查询缓存,唯一的原则就是命中率要尽可能的高。如果针对A表的查询,查询sql语句基本都是完全一致的情况,就可以针对A使用查询缓存;如果B表的查询条 件经常变化,很难命中,那么就不要对B表使用查询缓存。这可能就是hibernate使用查询缓存的时候,既要在hibernate.cfg.xml中进 行配置,也需要query.setCacheable(true)的原因。

     查询缓存只对list有用,对iterate方式无用。iterate不会读也不会写查询缓存,list会读也会写查询缓存。查询缓存中的key是 sql语句(这些sql语句会被hibernate解析,保证语义相同的sql,能够命中查询缓存),缓存的value是记录的主键值

Q:什么样的数据适合存放到第二级缓存中?

    1.很少被修改的数据

    2.不是很重要的数据,允许出现偶尔并发的数据

    3.不会被并发访问的数据

    4.参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

 不适合存放到第二级缓存的数据?

    1 经常被修改的数据

    2 财务数据,绝对不允许出现并发

    3 与其他应用共享的数据。


 hibernate缓存的数据实时性思考?当数据变化时hibernate缓存是否能自动更新?

下面是测试例子,经过测试hibernate查询缓存能“监听”到当前缓存实体的数据变化,即当对这个实体进行增加,删除,修改时,查询缓存将重新去数据库获得最新的数据然后再缓存起来。


前置配置:

http://www.360doc.com/content/14/0801/16/1073512_398635409.shtml

注意在实体映射文件中配置:<!--二级缓存一般设置为只读--><cache usage="read-only" />

实验:返回的是list

测试代码:

 DAO层的一个方法:

 public void testSession(){
        Session session=this.getSession();
    //List<TUser>    ls=session.createQuery("from TUser where username like '%h%'").setFirstResult(0).setMaxResults(2).list();
      List<TUser>    ls=session.createQuery("from TUser where username like ? ").setCacheable(true).setParameter(0, "%h%").setFirstResult(0).setMaxResults(30).list();
        for (TUser tUser : ls) {
            System.out.println(tUser.getUsername()+"=="+tUser.getId());
        }
    }

junit单元测试的一个方法:

    @Test
    public void testCache() {
        
        System.out.println("=====第一次读取=======");
        userManager.testCache();
        System.out.println("====第二次读取========");
        userManager.testCache();
        System.out.println("====添加一个用户=======");
        TUser user=new TUser();
        user.setUsername("htt");
        user.setPassword("123");
        userManager.saveUser(user);
        System.out.println("====添加用户后第一次读取======");
        userManager.testCache();
        System.out.println("====添加用户后第二次读取======");
        userManager.testCache();
        System.out.println("====修改用户=====");
        TUser user2=new TUser();
        user2.setId("1061");
        user2.setUsername("h22");
        user2.setPassword("123");
        userManager.update(user2);
        System.out.println("====修改用户后第一次读取======");
        userManager.testCache();
        System.out.println("====修改用户后第二次读取======");
        userManager.testCache();
        System.out.println("====删除用户=====");
        TUser user3=new TUser();
        user3.setId("1061");
        userManager.deleteUser(user3);
        System.out.println("====删除用户后第一次读取======");
        userManager.testCache();
        System.out.println("====删除用户后第二次读取======");
        userManager.testCache();
    }

场景一:开启“查询缓存”,关闭二级缓存。结果如下

=====第一次读取=======
Hibernate: select * from ( select tuser0_.ID as ID1_, tuser0_.USERNAME as USERNAME1_, tuser0_.PASSWORD as PASSWORD1_, tuser0_.EMAIL as EMAIL1_, tuser0_.MOBILE as MOBILE1_ from hzc.T_USER tuser0_ where tuser0_.USERNAME like ? ) where rownum <= ?
htt==1081
htt==1087
htt==1086
htt==1084
hcc==1010
hzc==1004
h22==1061
htt==1082
htt==1083
htt==1085
====第二次读取========
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
htt==1081
htt==1087
htt==1086
htt==1084
hcc==1010
hzc==1004
h22==1061
htt==1082
htt==1083
htt==1085
====添加一个用户=======
Hibernate: select SEQ_USER.nextval from dual
Hibernate: insert into hzc.T_USER (USERNAME, PASSWORD, EMAIL, MOBILE, ID) values (?, ?, ?, ?, ?)
====添加用户后第一次读取======
Hibernate: select * from ( select tuser0_.ID as ID1_, tuser0_.USERNAME as USERNAME1_, tuser0_.PASSWORD as PASSWORD1_, tuser0_.EMAIL as EMAIL1_, tuser0_.MOBILE as MOBILE1_ from hzc.T_USER tuser0_ where tuser0_.USERNAME like ? ) where rownum <= ?
htt==1081
htt==1087
htt==1086
htt==1084
hcc==1010
hzc==1004
h22==1061
htt==1082
htt==1083
htt==1085
htt==1088
====添加用户后第二次读取======
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
htt==1081
htt==1087
htt==1086
htt==1084
hcc==1010
hzc==1004
h22==1061
htt==1082
htt==1083
htt==1085
htt==1088
====修改用户=====
Hibernate: update hzc.T_USER set USERNAME=?, PASSWORD=?, EMAIL=?, MOBILE=? where ID=?
====修改用户后第一次读取======
Hibernate: select * from ( select tuser0_.ID as ID1_, tuser0_.USERNAME as USERNAME1_, tuser0_.PASSWORD as PASSWORD1_, tuser0_.EMAIL as EMAIL1_, tuser0_.MOBILE as MOBILE1_ from hzc.T_USER tuser0_ where tuser0_.USERNAME like ? ) where rownum <= ?
htt==1081
htt==1087
htt==1086
htt==1084
hcc==1010
hzc==1004
h22==1061
htt==1082
htt==1083
htt==1085
htt==1088
====修改用户后第二次读取======
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
htt==1081
htt==1087
htt==1086
htt==1084
hcc==1010
hzc==1004
h22==1061
htt==1082
htt==1083
htt==1085
htt==1088
====删除用户=====
Hibernate: delete from hzc.T_USER where ID=?
====删除用户后第一次读取======
Hibernate: select * from ( select tuser0_.ID as ID1_, tuser0_.USERNAME as USERNAME1_, tuser0_.PASSWORD as PASSWORD1_, tuser0_.EMAIL as EMAIL1_, tuser0_.MOBILE as MOBILE1_ from hzc.T_USER tuser0_ where tuser0_.USERNAME like ? ) where rownum <= ?
htt==1081
htt==1087
htt==1086
htt==1084
hcc==1010
hzc==1004
htt==1082
htt==1083
htt==1085
htt==1088
====删除用户后第二次读取======
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
Hibernate: select tuser0_.ID as ID1_0_, tuser0_.USERNAME as USERNAME1_0_, tuser0_.PASSWORD as PASSWORD1_0_, tuser0_.EMAIL as EMAIL1_0_, tuser0_.MOBILE as MOBILE1_0_ from hzc.T_USER tuser0_ where tuser0_.ID=?
htt==1081
htt==1087
htt==1086
htt==1084
hcc==1010
hzc==1004
htt==1082
htt==1083
htt==1085
htt==1088

场景一:开启“查询缓存”,开启二级缓存。结果如下

log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).
log4j:WARN Please initialize the log4j system properly.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
=====第一次读取=======
Hibernate: select * from ( select tuser0_.ID as ID1_, tuser0_.USERNAME as USERNAME1_, tuser0_.PASSWORD as PASSWORD1_, tuser0_.EMAIL as EMAIL1_, tuser0_.MOBILE as MOBILE1_ from hzc.T_USER tuser0_ where tuser0_.USERNAME like ? ) where rownum <= ?
htt==1081
htt==1087
htt==1086
htt==1084
htt==1089
hcc==1010
hzc==1004
htt==1082
htt==1083
htt==1085
htt==1088
====第二次读取========
htt==1081
htt==1087
htt==1086
htt==1084
htt==1089
hcc==1010
hzc==1004
htt==1082
htt==1083
htt==1085
htt==1088
====添加一个用户=======
Hibernate: select SEQ_USER.nextval from dual
Hibernate: insert into hzc.T_USER (USERNAME, PASSWORD, EMAIL, MOBILE, ID) values (?, ?, ?, ?, ?)
====添加用户后第一次读取======
Hibernate: select * from ( select tuser0_.ID as ID1_, tuser0_.USERNAME as USERNAME1_, tuser0_.PASSWORD as PASSWORD1_, tuser0_.EMAIL as EMAIL1_, tuser0_.MOBILE as MOBILE1_ from hzc.T_USER tuser0_ where tuser0_.USERNAME like ? ) where rownum <= ?
htt==1081
htt==1087
htt==1086
htt==1084
htt==1089
hcc==1010
hzc==1004
htt==1082
htt==1083
htt==1085
htt==1088
htt==1090
====添加用户后第二次读取======
htt==1081
htt==1087
htt==1086
htt==1084
htt==1089
hcc==1010
hzc==1004
htt==1082
htt==1083
htt==1085
htt==1088
htt==1090
====修改用户=====




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值