精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-10-11
Hibernate3.0以前,Hibernate的性能不咋地。运行一段程序慢的要死,而且还不够稳定。但运行Hibernate3后发现性能改良了不少。其中一个主要的原因也是缓存的优化处理。Hibernate缓存的处理放在了源码的org.hibernate.cache目录下。下面我们就谈一谈这个目录: java 代码
这些缓存有些是Hibernate特有的,有些是第3方的。不过从另外的角度来说,缓存的策略基本都是一样的。打开Ehcache和Oscache比较一下就会发现。内容实现基本上一致的。因为基本都一致,所以当时开发Hibernate人员,认为加一是加,加十也是加。所以就都给加上了。这个只是我估计的。 (2)Cache的实现策略。以EhCache为例。实现第三方的缓存需要干两件事情。
另外一件事情就是实现缓存提供者,实现CacheProvider接口。实现代码如下: java 代码
实现这个接口就可以在配置文件中配置,表示Hibernate要采用这种类型的缓存。通过这个缓存我们也可以学到很多的东西。如start()方法。这个方法注释告诉我们,缓存的加载是在SessionFactory创建时加载的。为什么要在这个时候加载,把缓存和SessionFactory绑在一起。因为SessionFactory是二级缓存,Cache的处理级别也是二级缓存。 所以他们就搞到一块去了。再看看stop()方法,这个方法的注释也告诉我们一个很重要的信息,如果启用了Hibernate的二级缓存。在SessionFactory的创建期间是不会停止的。只有在SessionFactory关闭后,才可以启用停止方法。为什么呢?因为SessionFatory是线程安全的,Cache随便停止,对SessionFactory线程安全性是致命的。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-10-11
帖子没发完整?
|
|
返回顶楼 | |
发表时间:2007-10-15
继续啊
|
|
返回顶楼 | |
发表时间:2007-10-15
实在不好意思,我的排版出现了问题。刚才修改了一下,你们先看着。我正在准备,在加上有工作,希望大家谅解。
|
|
返回顶楼 | |
发表时间:2007-11-02
呵呵!"其实缓存在实现上只有添加和删除方法。没有更新方法。更新就是替换."就看懂这句话!
|
|
返回顶楼 | |
发表时间:2007-11-06
写的很好亚,支持~~~
可能水平有限,很多地方还是不太懂呢... 可以讲解一下缓存是怎么运作的吗? |
|
返回顶楼 | |
发表时间:2007-11-07
Cache因为大家不注意,所以对它往往会产生一种阴影。其实原理非常的简单。从根本上来说,就是需要一个能存能取得容器。针对楼上的问题我下面介绍一种Hibernate提供的更简单的cache-HashtableCache。这个Cache用Java的Hashtable映射变量来实现。下面先看一下代码:
public class HashtableCache implements Cache { private final Map hashtable = new Hashtable(); private final String regionName; public HashtableCache(String regionName) { this.regionName = regionName; } public String getRegionName() { return regionName; } public Object read(Object key) throws CacheException { return hashtable.get(key); } public Object get(Object key) throws CacheException { return hashtable.get(key); } public void update(Object key, Object value) throws CacheException { put(key, value); } public void put(Object key, Object value) throws CacheException { hashtable.put(key, value); } public void remove(Object key) throws CacheException { hashtable.remove(key); } public void clear() throws CacheException { hashtable.clear(); } public void destroy() throws CacheException { } public void lock(Object key) throws CacheException { // local cache, so we use synchronization } public void unlock(Object key) throws CacheException { // local cache, so we use synchronization } public long nextTimestamp() { return Timestamper.next(); } public int getTimeout() { return Timestamper.ONE_MS * 60000; //ie. 60 seconds } public long getSizeInMemory() { return -1; } public long getElementCountInMemory() { return hashtable.size(); } public long getElementCountOnDisk() { return 0; } public Map toMap() { return Collections.unmodifiableMap(hashtable); } public String toString() { return "HashtableCache(" + regionName + ')'; } |
|
返回顶楼 | |
发表时间:2007-11-07
以上代码非常的简单,开始先声明一个容器:
private final Map hashtable = new Hashtable();以后就是对一些接口的实现。但总的来说就是对map的简单的增加、删除或者取值。原理就是如此。在运行Hibernate时,Hibernate根据不同Cache的特点而采用不同的Cache,当然大部分是可以根据不同的情况选择的。 在所有的cache中,有一个cache也是我们需要注意的,那就是JndiBoundTreeCacheProvider。这个Cache是专门为Jboss准备的,因为Hibernate已经属于Jboss公司了,所以Jboss总会搞点特权。这个Cashe也是Hibernate唯一实现的JNDI类型的Cache,采用了TreeCache来实现的。对于TreeCache没有研究过,不过吹得到挺厉害,如果有时间,大家可以去看看,呵呵! |
|
返回顶楼 | |
发表时间:2007-11-07
对于缓存的运用,大家可以去参考相关的书籍,在应用方面Hibernate可以说应用的非常的好,但对于对象数据模式,还是有很多的不足之处。这个议题暂时先发表到这里。等有了新发现再继续。
|
|
返回顶楼 | |
浏览 8440 次