论坛首页 Java企业应用论坛

关于Hibernate Cache

浏览 46815 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-12-18  
居然加粗不了,白忙活……
还好,可以关注一下false以上的话。可以看出来query cache没有缓存结果,……
以前做过多个测试,结论是,二级缓存的使用,不会带来效能的副面影响,几乎是透明的。根据需要设定好过期时间,基本上不会遇到脏数据的事情。
0 请登录后投票
   发表时间:2005-01-03  
Hibernate Iterator JCS分析
http://www.hibernate.org.cn/71.html

Hibernate Iterator JCS分析 写道

而Hibernate List方式是JDBC的简单封装,一次sql就把所有的数据都取出来了,它不会像Iterator那样先取主键,然后再取数据,因此List无法利用JCS。不过List也可以把从数据库中取出的数据填充到JCS里面去。

最佳的方式:第一次访问使用List,快速填充JCS,以后访问采用Iterator,充分利用JCS。
0 请登录后投票
   发表时间:2006-11-25  
hibernate版本:hibernate3.1 / hibernate 3.2.1 GA
问题:二级缓存正确设置后,没有发生作用

按照hibernate文档设置二级缓存后,cache确实已经填充,包括一对多set缓存也已经填充,但是当session.list时,查阅hibenrate cache 日志记录,发现hibernate没有击中cache,还是继续读取数据库;

部分日志内容
Hibernate: /* load one-to-many test.hibenrate.cache.Commodity.commodityPhotos */ select commodityp0_.STORE_NUM as STORE1_1_, commodityp0_.COMMODITY_NUM as COMMODITY2_1_, commodityp0_.COMMODITY_PHOTO_NUM as COMMODITY3_1_, commodityp0_.STORE_NUM as STORE1_12_0_, commodityp0_.COMMODITY_NUM as COMMODITY2_12_0_, commodityp0_.COMMODITY_PHOTO_NUM as COMMODITY3_12_0_, commodityp0_.COMMODITY_PHOTO_MIME_TYPE as COMMODITY4_12_0_, commodityp0_.COMMODITY_PHOTO_NAME as COMMODITY5_12_0_, commodityp0_.COMMODITY_PHOTO_SIZE as COMMODITY6_12_0_, commodityp0_.COMMODITY_PHOTO_CREATED as COMMODITY7_12_0_, commodityp0_.COMMODITY_PHOTO_SPEC as COMMODITY8_12_0_ from ToGo.dbo.COMMODITY_PHOTO commodityp0_ where commodityp0_.STORE_NUM=? and commodityp0_.COMMODITY_NUM=?
11-25 12:43:56.046 DEBUG [EhCache.java:68] key: test.hibenrate.cache.Commodity.commodityPhotos#test.hibenrate.cache.CommodityId@c588a95
11-25 12:43:56.046 DEBUG [EhCache.java:77] Element for test.hibenrate.cache.Commodity.commodityPhotos#test.hibenrate.cache.CommodityId@c588a95 is null

从上述日志,应该是说描述cache没有击中,但是,记录已经读取并写入缓存。

hibernate配置属性(没有启用查询缓存):
hibernate.cache.use_second_level_cache true
hibernate.cache.use_query_cache true
hibernate.cache.use_structured_entries true
hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider


典型的hibereate映射文件配置如下:
<hibernate-mapping>
    <class name="test.hibenrate.cache.Shop" table="SHOP">
    	<cache usage="read-write" include="all"/>
        <id name="shopNum" type="int">
            <column name="SHOP_NUM" />
            <generator class="increment" />
        </id>
        <many-to-one name="store" class="test.hibenrate.cache.Store">
            <column name="STORE_NUM" not-null="true" />
        </many-to-one>       
        <property name="shopMemo" type="string">
            <column name="SHOP_MEMO" />
        </property>
        <set name="shopHours" inverse="true" fetch="select">
        	<cache usage="read-write"/>
            <key>
                <column name="SHOP_NUM" not-null="true" />
            </key>
            <one-to-many class="test.hibenrate.cache.ShopHour" />
        </set>
        <set name="businessFloors" table="SHOP_BUSINESS_FLOOR" fetch="select" sort="unsorted">
        	<cache usage="read-write"/>
            <key column="SHOP_NUM"/>
            <many-to-many entity-name="test.hibenrate.cache.BusinessFloor" column="BUSINESS_FLOOR_NUM" outer-join="auto" />
        </set>
        <set name="activeCommodities" table="ACTIVE_COMMODITY" fetch="select" sort="unsorted">
        	<cache usage="read-write"/>
            <key column="SHOP_NUM"/>       
            <many-to-many entity-name="test.hibenrate.cache.Commodity">             
              	<column name="STORE_NUM" not-null="true"/>                   
                <column name="COMMODITY_NUM" not-null="true"/>                  
            </many-to-many>
        </set>                    
        <set name="activeCommodityRegulars" table="ACTIVE_COMMODITY_REGULAR" fetch="select" sort="unsorted">
        	<cache usage="read-write"/>
            <key column="SHOP_NUM" />
            <many-to-many entity-name="test.hibenrate.cache.CommodityRegular" column="COMMODITY_REGULAR_NUM" outer-join="auto"/>                   
        </set>    
    </class>


参考一篇介绍hibernate缓存文档http://www.informit.com/articles/article.asp?p=353736&seqNum=5&rl=1,我的配置应该和文档中一样,百思不得其解。

hibernate典型的二级缓存应用场景是怎么样的呢?难道一定要求第一次使用list读入,然后使用iterator读写才可以吗(记得以前robbin曾介绍过这样的一篇文档,在论坛上找不到了)?不过按上述的参考文档,也没有特意提到这一点。


0 请登录后投票
   发表时间:2006-11-25  
在代码中,我使用泛型实现Dao接口,并通过命名查询实现查询接口。
查询接口这么写:
		final Query namedQuery = prepareQuery(method, queryArgs);
		return (List<T>) namedQuery.list();


我希望第一次使用上述查询接口(list方式)读取数据,第二次再次使用查询接口读取数据时,hibernate能够直接读缓存而不是读数据,包括当前对象和set中的对象。

在调试中,我又将hibernate查询缓存打开,查询时,能够使用cache,但是一对多中的set对象还是读取数据库,没有一次是命中的。

仔细阅读了相关hibernate二级缓存的相关文档,我有一个疑惑,是不是要使用hibernate 二级缓存,一定需要使用load方法来读呢?如果是这样的话,hibernate二级缓存在那些场合会有用呢,难道真的必须要第一次使用list方法全部读取数据,以后每次使用load方法读取。


泛型参考IBM中<不要重复的Dao>:
http://www-128.ibm.com/developerworks/cn/java/j-genericdao.html


0 请登录后投票
   发表时间:2007-08-25  
想问下楼主?
Hibernate 的 QueryCache 和 HSQLDB 的 Memory Table 如果执行相同的查询谁的性能会好点呢?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics