hibernate缓存机制

来源:互联网 发布:淘宝怎么看店铺排行 编辑:程序博客网 时间:2024/06/05 21:57

先看一个例子:
假设我的工程中有个与user类(实体类,与数据库映射),userDao(继承自 AbstractHibernateDao),userService。在userService中运行这段代码:

void saveUser(user us){   //设us中name属性为a   userDao.save(us);   us.setName("b");}

运行后数据库表中user表的name属性变为了”b”,新手的我觉得很奇怪,明明我修改us后没有对它进行保存,为什么会自动保存在数据库表中?
后来上网查找,发现了个hibernate缓存机制这个东西。
先介绍一下hibernate缓存机制,摘自

http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html

一、why(为什么要用Hibernate缓存?)

Hibernate是一个持久层框架,经常访问物理数据库。

为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。

缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。

看到介绍,就基本明白了刚刚问题发生的原因,我在save(us)时hibernate并没有即时叫数据提交至数据库中,而是放入缓存,而us.setName(“b”)运行修改了缓存中的us对象,而等事务结束后,再将缓存的数据存储至数据库中,如果想即时存储,应调用session.flush()方法,把缓存的数据存入数据库中。

摘抄点源博客的东西:

缓存有Session缓存和SessionFactory缓存,Session缓存是默认加载使用的,SessionFactory是一个可配置的插件。

缓存的使用:
1. 一级缓存的管理:

evit(Object obj) 将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象。

clear() 将一级缓存中的所有持久化对象清除,释放其占用的内存资源。

contains(Object obj) 判断指定的对象是否存在于一级缓存中。

flush() 刷新一级缓存区的内容,使之与数据库数据保持同步。

2.一级缓存应用: save()。当session对象调用save()方法保存一个对象后,该对象会被放入到session的缓存中。 get()和load()。当session对象调用get()或load()方法从数据库取出一个对象后,该对象也会被放入到session的缓存中。 使用HQL和QBC等从数据库中查询数据。
3.二级缓存的管理:

evict(Class arg0, Serializable arg1)将某个类的指定ID的持久化对象从二级缓存中清除,释放对象所占用的资源。

sessionFactory.evict(Customer.class, new Integer(1));

evict(Class arg0) 将指定类的所有持久化对象从二级缓存中清除,释放其占用的内存资源。

sessionFactory.evict(Customer.class);

evictCollection(String arg0) 将指定类的所有持久化对象的指定集合从二级缓存中清除,释放其占用的内存资源。

sessionFactory.evictCollection(“Customer.orders”);

4.二级缓存的配置

常用的二级缓存插件

EHCache org.hibernate.cache.EhCacheProvider

OSCache org.hibernate.cache.OSCacheProvider

SwarmCahe org.hibernate.cache.SwarmCacheProvider

JBossCache org.hibernate.cache.TreeCacheProvider

0 0
原创粉丝点击