什么是缓存:我们在内存中开辟一块空间,把本来应该存储在硬盘上的东西,然后给它放在内存里,将来要读的时候从内存中读,这个部分就叫做缓存。
在hibernate有三种缓存,一级缓存,二级缓存和查询缓存。
一级缓存是session级别的缓存。
例子:
Hibernate:
select
category0_.id as id0_0_,
category0_.name as name0_0_
from
Category category0_
where
category0_.id=?
c0
c0
取了两次Category_1,但是只发出1条sql语句,第二次拿数据是从缓存中拿。
测试2:
Hibernate:
select
category0_.id as id0_0_,
category0_.name as name0_0_
from
Category category0_
where
category0_.id=?
c0
Hibernate:
select
category0_.id as id0_0_,
category0_.name as name0_0_
from
Category category0_
where
category0_.id=?
c0
发出两条sql语句去取数据。
证明一个session是不能去拿另外一个session的缓存的。
假如利用多线程取数据,每次数据都从不同的session中取,这样就导致每一次查询都会访问数据库。如何解决?
解决方案:每个session都有各自的缓存,那么我何不弄一个大的缓存,把所有的缓存信息都存在这个大的缓存里。到查询信息的时候,去大缓存中去查找,找不到了再去数据库查找。这个缓存我们称之为二级缓存。
在hibernate有三种缓存,一级缓存,二级缓存和查询缓存。
一级缓存是session级别的缓存。
例子:
@Test public void testHuanCun(){ Session session = sf.openSession(); session.beginTransaction(); Category c=(Category)session.load(Category.class,1); System.out.println(c.getName()); Category c2=(Category)session.load(Category.class,1); System.out.println(c2.getName()); session.getTransaction().commit(); session.close(); }测试结果:
Hibernate:
select
category0_.id as id0_0_,
category0_.name as name0_0_
from
Category category0_
where
category0_.id=?
c0
c0
取了两次Category_1,但是只发出1条sql语句,第二次拿数据是从缓存中拿。
测试2:
@Test public void testHuanCun2(){ Session session = sf.openSession(); session.beginTransaction(); Category c=(Category)session.load(Category.class,1); System.out.println(c.getName()); session.getTransaction().commit(); session.close(); Session session2 = sf.openSession(); session2.beginTransaction(); Category c2=(Category)session2.load(Category.class,1); System.out.println(c2.getName()); session2.getTransaction().commit(); session2.close(); }测试结果:
Hibernate:
select
category0_.id as id0_0_,
category0_.name as name0_0_
from
Category category0_
where
category0_.id=?
c0
Hibernate:
select
category0_.id as id0_0_,
category0_.name as name0_0_
from
Category category0_
where
category0_.id=?
c0
发出两条sql语句去取数据。
证明一个session是不能去拿另外一个session的缓存的。
假如利用多线程取数据,每次数据都从不同的session中取,这样就导致每一次查询都会访问数据库。如何解决?
解决方案:每个session都有各自的缓存,那么我何不弄一个大的缓存,把所有的缓存信息都存在这个大的缓存里。到查询信息的时候,去大缓存中去查找,找不到了再去数据库查找。这个缓存我们称之为二级缓存。
二级缓存在下一个文档里:http://blog.csdn.net/acmman/article/details/44132207
转载请注明出处:http://blog.csdn.net/acmman/article/details/44132153