hibernate一级二级缓存


指定实体类 <class-cache usage="read-write" class="java.com.Department">

<class-cache usage="read-write" class="java.com.Emplyoee">

<collection-cache usage="read-write" class="java.com.Department.emplyoee">



举得是一对多的例子  

如果没有开启二级缓存,和指定类实体的情况下


get获取department时此时一级缓存只是保存了除emplyoee属性的其他属性信息,当在执行department.employee时此时由于缓存中没有员工信息,所以仍会再执行一次语句通过departmentId来查询员工信息的

1.当save()时 会缓存department的所有信息


2.当开启了二级缓存,并且指定了实体类Department和指定了员工集合 并未指定实体类Emplyoeen

如果初次department.emplyoee正常执行

另外一个department.emplyoee时

get获取department时此时一级缓存只是保存了除emplyoee属性的其他属性信息,二级缓存也是保存一级缓存同样信息,当在执行department.employee时此时由于一级缓存中没有员工信息但有department的ID,缓存机制第一次利用departmentID查到了department对象却没有员工信息,此时会利用员工emplyoeeId一个一个查询,当在一级缓存中cache.get()没有查询到会在二级cache.get()耳机没有查询到,所以会直接利用员工ID在数据库查询,有多少个员工执行多少句sql语句


3.当在2的基础上也指定了员工类此时员工信息也会缓存到二级一级缓存内,所以当别的seesionf调用department.emplyoee时直接在二级缓存获取不再执行语句


4.creatquery().list

默认不会使用缓存但是他会把数据放在缓存中


开启缓存  creatquery().setcacheable(true).list() //使用查询缓存   和配置文件中的<property  suag="cache.use_query_cache">true</property>//查询缓存的开关

但两次seesion查询的语句必须一样此时缓存才有效

5.creatquery.iterate()迭代器

会使用缓存  如果条件语句是emplyoee.id<10;  此时会1,2,3......9一个一个的查询因为缓存机制是利用ID缓存的所以会一个个的查询并缓存  此时执行 10次语句  一次总的9次分开的

另外一个seesion查询时会执行一次总语句然后在缓存里的不再执行,不再缓存里的继续去数据库查询执行语句 

语句 总的+不在缓存去数据库执行的语句

6.如果第一个session在get时二级一级都缓存时,中间执行了一次createquery()对缓存中缓存的对象所在数据库的信息进行更新,会是二级缓存的数据失效,对一级缓存没有影响,当另外一个session从二级缓存中获取时由于二级缓存数据失效,会重新执行查询语句找到最新的数据

所以仍会再执行一次语句通过departmentId来查询员工信息的

猜你喜欢

转载自blog.csdn.net/sunboylife/article/details/80217693