`
javaping2008
  • 浏览: 102760 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Hibernate缓存小记

阅读更多
                        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

 

写累了 有时间继续写了 收笔

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics