锁定老帖子 主题:关于Hibernate Cache
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-12-18
居然加粗不了,白忙活……
还好,可以关注一下false以上的话。可以看出来query cache没有缓存结果,…… 以前做过多个测试,结论是,二级缓存的使用,不会带来效能的副面影响,几乎是透明的。根据需要设定好过期时间,基本上不会遇到脏数据的事情。 |
|
返回顶楼 | |
发表时间: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。 |
|
返回顶楼 | |
发表时间: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曾介绍过这样的一篇文档,在论坛上找不到了)?不过按上述的参考文档,也没有特意提到这一点。 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2007-08-25
想问下楼主?
Hibernate 的 QueryCache 和 HSQLDB 的 Memory Table 如果执行相同的查询谁的性能会好点呢? |
|
返回顶楼 | |