`

读一博文时的随想记录

阅读更多

这段时间想系统地研究下ehcache,就开始搜相关方面的博客/帖子,今天看到这篇博文(http://hi.baidu.com/eclipse256/blog/item/5443b35196623b1c367abebd.html)后有些不解之处,记录下来.

        1.1. 数据库访问只有当检索的数据不在cache里可用时才必要。hibernate可以用两种不同的对象缓存:first-level cache 和 second-level cache。first-level cache和Session对象关联,而second-level cache是和Session Factory对象关联。
                     ?1, 当DB中的数据有更后怎么处理? Hibernate自身好像有些配置可以做到.. 但做到的也只是用配置把缓存的时间缩短.也不能做到当DB中有数据变化时Hibernate来自动更新吧?
                     ?2, 上面说first-levelCache跟Session关联的,而second-levelCache跟SessionFactory对象关联,这两种不同的关联有什么不同?在配置上有什么不同?

                     ?3, " Hibernate用first-level cache主要是减少在一个事务内的sql查询数量。例如,如果一个对象在同一个事务内被修改多次,hibernate将只生成一个包括所有修改的 UPDATE SQL语句。为了减少数据流动,second-level cache在Session Factory级的不同事务之间保持load的对象,这些对象对整个应用可用,不只是对当前用户正在运行的查询。这样,每次查询将返回已经load在缓存里的对象,避免一个或更多潜在的数据库事务。"

                                first-level cache主要是针对一个单独事务做的缓存, 而second-level cache就是对整个Application做的缓存了. 那这两个层面的缓存都有同样的问题:若DB中数据有更新而缓存中数据还没有expire,这样就造成数据的不一致了.
                                这个问题的所帮助的是: 所有更新都是通过Hibernate自身的一级缓存来更新的,这样是否能顺手把缓存中的数据也更新下? 这样一来问题又变成Ehcache中的数据能否更新?如何配置?
                                还有一个问题就是: Hibernate会自动更新缓存里的数据,但这也仅仅是针对一个Session中的一个事务而言的,那若一个Session关闭后其缓存的数据不也就失去其意义了?对别的session又没有影响.
        1.2 还是第一次对Jar包做整体的Mapping:

                <property name="mappingJarLocations">
                     <list><value>file:dist/appfuse-dao.jar</value></list>
                </property>

        1.3 对hibernate获取的数据原来还可以有选择地配置: 默认是只对load来的数据有缓存,配置了hibernate.cache.use_query_cache true后才能对别的像findAll(),list(),createQueryt()这样方法返回的数据有缓存.那么一个问题是: 这样的方法命名有无规律? 比如说像convention over configuration这样的规则? 还是随意的?毕竟这些方法最终都转化为sql的select语句.这样Hibernate就可以对那样最终转化为sql中select语句的方法进行缓存了,而不仅仅是对load做缓存.

        1.4 <cache usage="read-only"/> 既然有read-only,那也应该就有相应的"writable"配置.这个配置是有哪个文件中?ehcache的配置文件里?还是hibernate自身的配置文件里?

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics