Hibernate性能优化

来源:互联网 发布:网站建设.国风网络 编辑:程序博客网 时间:2024/05/18 12:02


hibernate的查询优化:
在hibernate中的Query的list() 和 iterate() 方法都可以执行HQL的查询,但是list()方法会直接的执行SQL语句访问数据库,
而iterate()方法则会根据主键的字段到一,二级缓存当中寻找是否有已经存在的相应的对象数据,如果有就加入到查询结果中,
没有找到才是额外的执行SQL查询语句。

应用级缓存:
缓存被应用进程内的所有事务共享,这些可能会并发的访问缓存,在这种情况下就需要采用事务级的隔离机制了。
在bibernate 中应用级缓存是由SessionFactory来实现的,所有同一由SessionFactory创建的Session对象共享此缓存,
在在个应用程序中,SessionFactory对象是单例的,程序启动后只会创建一个SessionFactory 会话工厂。
也就是也就是说所在访问同一个数据库的情况下,所有的Session可以共享此缓存中的资源对象。

hibernate 二级缓存:
hibernate 的二级缓存不应用或分布式范围的缓存。Session在进行数据查询操作时,首先在内部的一级缓存中进行查找,
如果一级缓存中没有找到想应用对象则进行二级缓存的查找,查找到就返回数据,如果没有找到就会操作数据库执行SQL语句。
hibernate 本身没有提供二级缓存的实现,而是为第三方的缓存提供了实现接口。缓存的实现有多种:
EHCache:作为应用范围内的缓存。
OSCache:作为应用范围内的缓存。
BOCache:人微言轻分布式范围内的缓存

在hibernate中使用EHCache二级缓存时首先要在配置文件中做如下的配置:
<property name="hibernate.cache.EhCacheProvider">true</property>
<property name="cache.provider_class">
 org.hibernate.cache.EhCacheProvider
</property>
<property name="hibernate.cache.use_query_cache">true</property>

同时还要编写配置文件"ehcache.xml"来针对缓存实现进行本身的配置。
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<diskStore path="d:/cache"/>      //启用磁盘缓存的位置,(当内存占满时)
<defaultCache         
   maxElementsInMemory="1000"    //缓存允许保存的最大对象数量
   eternal="false"       //缓存中数据是否为常量,(是否可被修改)
   overflowToDisk="true"     //当内存不足时是否启用磁盘缓存
   timeToIdleSeconds="180"     //缓存数据的钝化时间,(将该数据排列到缓存容器的底部,在寻找时速度较慢)
   timeToLiveSeconds="300"    //缓存数据的生命周期,(到时被缓存容器销毁)
  diskPersistent="false"      //是否disk store在虚拟机启动时持久化。默认为false
  diskExpiryThreadIntervalSeconds= "120" />//运行disk终结线程的时间,默认为120秒
  </ehcache>

最后需要在映射文件指定映射实体的缓存策略:
<hibernate-mapping>
 <class>
  <cache usage="read-write"/>
  .......
  <set>
  <cache usage="read-only"/>
  </set>
 </class>
</hibernate-mapping>

缓存同步策略决定了数据对象在缓存中的存取规则,同时也使得缓存的调度遵循着正确的应用组事务隔离机制。
hibernate 提供了四种缓存同步策略:
read-only:只读,应用于不会发生改变的数据。
nonstrict-read-write:非严格读写,不保证缓存数据与数据库数据的一致性。
read-write:严格可读定,用于数据同步很严格的情况下。
transactional:事务型缓存。

查询缓存:
<property name="hibernate.cache.use_query_cache">true</property>

使用查询缓存,如果查询结果集中包含实体,二级缓存中内会存放实体OID。
如果查询部分属性,则二级缓存会存放所有的属性值。

绝大多数的查询并不能从查询缓存中受益, 所以hibernate 默认是不进行查询缓存的。
如果需要进行缓存,可调用Query.setCacheable(true)方法。这个调用会让查询在执行过程中时先从缓存
中查找想应的结果,若有取出,若无则将执行SQL操作并将返回的结果存放到缓存当中,供下一次调用。

原创粉丝点击