Hibernate性能优化2

来源:互联网 发布:latex 算法 for 编辑:程序博客网 时间:2024/06/15 08:21
1、二级缓存的管理
二级缓存是SessionFactory级别的缓存,它的使用过程如下:
1)执行条件查询的时候,发出“select * from table_name where …”这样的SQL语句查询数据库,一次获得所有的数据对象。
2)把获得的所有数据对象根据ID放入到二级缓存中。
3)当Hibernate根据ID访问数据对象时,首先从Session缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;还没查到,再查询数据库,把结果按照ID放入到二级缓存。
4)删除、更新和增加数据的时候,同时会更新到二级缓存中。
Hibernate的二级缓存策略是针对ID查询的缓存策略,对于调节查询则毫无作用。为此,hibernate提高了单独针对条件查询的查询缓存。

适合存放到二级缓存中的数据有:
1)很少被修改的数据。
2)不是很重要的数据,允许出现偶尔的并发的数据。
3)很多系统模块都要用到
4)不是私有的数据,是共享的

什么样的数据不适合放在二级缓存中???
财务数据  安全性的数据 也就是不想让别人看到的数据和特别重要的数据

2、查询缓存
如果在实际使用中对于某个条件查询语句经常使用相同的条件值进行查询,就可以启用查询缓存。
Hibernate的查询缓存策略的过程如下。
1)在第一次执行条件查询时,Hibernate首先根据这些条件值组成一个Query key,Query key包括条件查询的请求信息。
2)在后续的过程中用相同的条件值执行这个查询是,Hibernate就先根据这个Query key到查询缓存中查找对应的结果列表,如果存在,返回。如果不存在,查数据库,再把结果列表根据Query 可以存放在查询缓存中。
所以,只有当经常使用相同的参数值进行相同的条件查询时,才能从查询缓存策略中得到好处。

使用查询缓存的步骤
1.配置查询缓存
Hibernate提供了3种与查询相关的缓存区域。
默认的查询缓存区域:org.hibernate.cache.StandardQueryCache
用户自定义的查询缓存区域
时间戳缓存区域:org.hibernate.cache.UpdateTimestampCache

在ehcache的配置文件ehcache.xml中设置查询缓存区域的属性。

<ehcache>
<!-- 设置默认的查询缓存区域的属性 -->
    <cache name="org.hibernate.cache.StandardQueryCache"
    maxElementsInMemory="50"
    eternal="false"
    overflowToDisk="true"
    timeToIdleSeconds="3600"
    timeToLiveSeconds="7200"
    />
  
 <!-- 设置时间戳缓存区域的属性 -->
 <cache name="org.hibernate.cache.UpdateTimestampsCache"
   maxElementsInMemory="500"
   eternal="true"
   overflowToDisk="true"
   />
   
    <!-- 设置自定义命名查询缓存区域的属性 -->
    <cache name="myCacheRegion"
        maxElementsInMemory="1000"
        eternal="false"
        overflowToDisk="true"
        timeToIdleSeconds="3600"
        timeToLiveSeconds="7200"
        />
</ehcache>
3、

打开查询缓存
在hibernate的全局配置文件中添加如下配置来启动查询缓存。
<!--启用查询缓存 -->
 <property name="cache.use_query_cache">true</property>

在应用程序代码中使用查询缓存
虽然按以上步骤设置好查询缓存,但hibernate在执行条件查询时默认是忽略查询缓存的。如果希望启用查询缓存,应该调用Query接口的setCacheeable(true)方法。

 

二、配置连接池

<!-- 配置C3p0连接池 -->
 <!-- 启用c3p0连接池  设置连接池提供的供应商 -->
 <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
 <!-- 最大连接数 -->
 <property name="c3p0.max_size">20</property>
 <!-- 最小连接数 -->
 <property name="c3p0.min_size">5</property>
 <!-- 每次请求连接的数目 -->
 <property name="c3p0.acquire_increment">5</property>
 <!-- 设置过期时间,以秒为单位,如果连接池中 -处于空闲状态的连接超过了这个时间,该连接就会从连接池中删除-->
 <property name="c3p0.timeout">120</property>
 <!-- 每个3000秒检查连接池中的空闲连接  -->
 <property name="c3p0.idle_test_period">3000</property>
 
三、Hibernate不适合的场景

不适合OLAP(On-Line Analytical Processing联机分析处理),以查询分析数据为主的系统;适合OLTP(on-line transaction processing联机事务处理)。
对于些关系模型设计不合理的老系统,也不能发挥hibernate优势。
数据量巨大,性能要求苛刻的系统,hibernate也很难达到要求, 批量操作数据的效率也不高。

四、在Web应用程序中使用Hibernate

1.Hibernate 整合Struts
       Hibernate框架主要使用在持久层中,完成实体类的CRUD操作。
2. 泛型DAO模式Hibenate实现
3.OpenSessionInView模式


 

五、总结:

Hibernate HQL查询、Criteria查询、调用存储过程
Hibernate事务管理和并发控制
Hibernate 延迟加载策略、抓取策略、一级二级缓存管理
Hibernate整合Struts

 


 


 

原创粉丝点击