Hibernate的SESSION与SESSIONFACTORY

Hibernate在进行数据读取时会先在缓存里找,缓存中不存在时再去数据库查询,合理使用hibernate缓存能够有效的利用内存,减少物理数据库调用的次数.

 

ORM缓存策略

1.事务级缓存(session level cache)

session生命周期的缓存,关闭session即消亡

2.应用级/进程级缓存(sessionFactory level cache)

某个应用中的共享缓存,多个事务可以共享,在sessionFactory层实现,所有sessionFactory创建的session可以共享.

 

 

Hibernate数据缓存

1.内部缓存(session level)一级缓存

是事务级的缓存,session中维护的一个Map,Map的key是包含了数据类型和id,从数据库加载的数据都会进入Map缓存中,通过session加载数据时会先在session缓存里找,一级缓存是session的private数据,session实例消亡就清除了,在应用中就保持在一次请求的开始和结束之间.

一般由Hibernate自动维护,也支持手动维护

session.evit(Object obj) 将持久化对象从一级缓存中清除.

session.clear()  清空一级缓存

session.contains(Object obj) 判断指定的对象是否存在于一级缓存中. 

session.flush() 刷新一级缓存区的内容,使缓存与数据库数据保持同步. 

 

2.二级缓存(sessionFactory level)

包含了应用级和分布式的缓存,由本sessionFactory的所有session实例共享,session操作时会先查一级缓存,然后查二级缓存,最后再查物理数据库.要使用二级缓存必须要进行配置.

 

适合用缓存的数据

1.不会被其他应用修改

包括直接用JDBC修改等,因为其他应用修改了数据之后hibernate并不知道,不能自动更新缓存,不过可以手动更新缓存

2.数据大小可以接受,毕竟内存资源也不多

3.数据更新频率低(比如数据字典等常量数据)

4.可能被系统频繁使用

5.非关键的数据

6.不会被并发访问的数据

 

常用的二级缓存插件

EHCache  org.hibernate.cache.EhCacheProvider 

OSCache  org.hibernate.cache.OSCacheProvider 

SwarmCahe  org.hibernate.cache.SwarmCacheProvider 提供了分布式

JBossCache  org.hibernate.cache.TreeCacheProvider 提供了分布式

 

 

 

HIBERNATE的配置文件:

<bean id="SessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource" ref="DataSource" />
  <property name="configLocation">
   <value>classpath:/resources/hibernate.cfg.xml</value>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.generate_statistics">true</prop>
    <prop key="hibernate.connection.release_mode">auto</prop>
    <prop key="hibernate.autoReconnect">true</prop>
    <prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
    <prop key="hibernate.cache.use_query_cache">true</prop>      
    <prop key="hibernate.cache.provider_class">org.hibernate.cache.OSCacheProvider</prop>
    <prop key="hibernate.jdbc.fetch_size">50</prop>
    <prop key="hibernate.jdbc.batch_size">25</prop>
   </props>
  </property>
 </bean>

 

在映射文件***.hbm.xml中指定实体的缓存同步策略

<?xml version="1.0" encoding='UTF-8'?>  

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  

<hibernate-mapping>  

   <class>  

       <!-- 设置该持久化类的二级缓存并发访问策略-->  

       <cache usage="read-write"/>

<set name = "xxx">

<cache usage="read-only" />

    </set>

   </class>

</hibernate-mapping>  

 

在JAVA代码中通过下面的方式,将数据塞入二级缓存中:

getHibernateTemplate().setCacheQueries(true);

return getHibernateTemplate().find("from BjHealthDictionaryInfo");

猜你喜欢

转载自haroldxie.iteye.com/blog/1591370