tx=session.beginTransaction(); S s=(S)session.get(Student.class,new Integer(1)); session.evict(s); Query query=sesion.createQuery("form S"); Iterator it=query.list().iterator(); session.clear();
自己对hibernate的缓存一直模糊的很,有时候项目紧,直接配置XML,也没有考虑从到底有什么好处。今天没事干,就看了些这方面资料,顺便回忆了下。缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了,打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去DB中取,也省了很多事。
hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,应该就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。
我自己感觉如果拿servlet里面的seesion对象来理解hibernate中的session比较容易去贯通,因为一级缓存中的session事物进别进行数据的预存取,数据在各个session的上下文中存在(注意单例),session关闭,整个所有session范围内的数据全部清空,session.close();二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二二级缓存只有一个区域 ,我画个图 比较容易理解
| 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|
| | | |
| | | |
---------------------------------------------------------------------------------------------------
sessionFactroy级别的二级缓存
-------------------------------------------------------------------------------------------------------------------
|
|
|
------------------------------------
DB
-----------------------------------------
一级缓存的生命周期是随着sesion的关闭而over,二级缓存的生命周期伴随着进程的整个周期,进程终止,二级缓存也消亡,二级缓存可以灵活设置存亡时间这些information
evict clear管理一级缓存,evict方法从缓存中清楚指定的持久化对象,clear方法清楚所有持久化对象,就是我一开始写的那几行代码。
二级缓存有4种数据库并发策略(自己一般都禁止并发,采用默认级别,似乎暂时还没感觉效率有什么低,主要不涉及关键数据,所以有时候没必要追究的那么详细(*^__^*) )
Transactional:事物型策略,指定了可串行话的事物隔离级别
read-write:读写策略,当应用程序需要读写数据,并且对读写数据的并发性要求不是很高的情况下,可以实用这种策略
nonstrice-read-write:非常严格的读写策略,如果程序不需要非常严格的事务隔离级别,并且事务只是偶尔对数据库进行写操作,可以此阿勇这种策略
read-only:这个都比较清楚了,只读策略,如果数据不打算修改,就用这个
Hiberante的二级缓存是一个插件,其实
EhCache,SwarmCache, JBossCache, OpenSynphony,OSCache 这几个也是常用的缓存插件
Ehcache是hibernate默认插件,支持所有策略
它的适用也比较简单
1.在配置文件中加入EhCache缓存插件的提供类
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhcacheProvider</property>
hibenate的hiberante3.jar包已经包含了Ehcache的实现,不需要在安装这个
2.拷贝ehcache.xml 文件到类路径下,chcache.xml位于安装目录etc下,拷贝这个文件到项目工程的src下
3.对S类进行测试
<class name="hiberante.s" table="S" catalog="slog">
<cache usage="nonstrice-read-write"/>
infor settingfactory:209 second-level cache:enabled
info settingsFactory :213 query cache :disacled
info settingsFactory:325 cache provider:org.hiberante.cache.ehcache.provider
写累了 有时间继续写了 收笔