hibernate关于c3p0数据库连接池和二级缓存详解

hibernate配置c3p0

<!-- 	配置c3p0数据库连接池我们可以在etc文件夹中找到所有的配置文件
	#hibernate.c3p0.max_size 2 //数据库最大连接数
#hibernate.c3p0.min_size 2   最小连接数
#hibernate.c3p0.timeout 5000 最大连接时间
#hibernate.c3p0.max_statements 100  最大的PreparedStatement的数量
#hibernate.c3p0.idle_test_period 3000  每隔3000秒检查连接池里的空闲连接 ,单位是秒
#hibernate.c3p0.acquire_increment 2  当连接池里面的连接用完的时候,c3p0连接池增长的个数
#hibernate.c3p0.validate false   每次都验证连接是否可用   -->
<property name="hibernate.c3p0.max_size">15</property>
<property name="hibernate.c3p0.min_size">3</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.acquire_increment">3</property>
<property name="hibernate.c3p0.validate">true</property>


同志们不要忘记到入c3p0的相关jar包

配置 hibernate二级缓存,这里采用org.hibernate.cache.EhCacheRegionFactory

<!-- 配置hibernate二级缓存类型,指定二级缓存的实现类 
这个类时hibernate自己的简单实现类
-->

        <property name="cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</property>
<!--         加载二级缓存的配置文件 -->
        <property name="net.sf.ehcache.configurationResourceName">/ehcache.xml</property>
<property name="hibernate.cache.use_second_level_cache">true</property>  

<!-- 指定查询缓存,list.itreate()方法都要开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>

<!-- 指定使用二级缓存的类,以及缓存策略 -->
<class-cache usage="read-only" class="hibernate_second_cache.Employee"/>



Hibernate二级缓存详解
与Session相对的是,SessionFactory也提供了相应的缓存机制。SessionFactory缓存可以依据功能和目的的不同而划分为内置缓存和外置缓存。
       SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的副本,而预定义SQL语句是在 Hibernate初始化阶段根据映射元数据推导出来的。SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义 SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。

       SessionFactory的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据 的副本,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的二级缓存。

       Hibernate的二级缓存的实现原理与一级缓存是一样的,也是通过以ID为key的Map来实现对对象的缓存。

       由于Hibernate的二级缓存是作用在SessionFactory范围内的,因而它比一级缓存的范围更广,可以被所有的Session对象所共享。

14.2.3.1    二级缓存的工作内容

       Hibernate的二级缓存同一级缓存一样,也是针对对象ID来进行缓存。所以说,二级缓存的作用范围是针对根据ID获得对象的查询。

       二级缓存的工作可以概括为以下几个部分:

●   在执行各种条件查询时,如果所获得的结果集为实体对象的集合,那么就会把所有的数据对象根据ID放入到二级缓存中。

●   当Hibernate根据ID访问数据对象的时候,首先会从Session一级缓存中查找,如果查不到并且配置了二级缓存,那么会从二级缓存中查找,如果还查不到,就会查询数据库,把结果按照ID放入到缓存中。

●   删除、更新、增加数据的时候,同时更新缓存。

14.2.3.2    二级缓存的适用范围

       Hibernate的二级缓存作为一个可插入的组件在使用的时候也是可以进行配置的,但并不是所有的对象都适合放在二级缓存中。

       在通常情况下会将具有以下特征的数据放入到二级缓存中:

●   很少被修改的数据。

●   不是很重要的数据,允许出现偶尔并发的数据。

●   不会被并发访问的数据。

●   参考数据。

       而对于具有以下特征的数据则不适合放在二级缓存中:

●   经常被修改的数据。

●   财务数据,绝对不允许出现并发。

●   与其他应用共享的数据。

       在这里特别要注意的是对放入缓存中的数据不能有第三方的应用对数据进行更改(其中也包括在自己程序中使用其他方式进行数据的修改,例如,JDBC),因为那样Hibernate将不会知道数据已经被修改,也就无法保证缓存中的数据与数据库中数据的一致性。

14.2.3.3    二级缓存组件

       在默认情况下,Hibernate会使用EHCache作为二级缓存组件。但是,可以通过设置 hibernate.cache.provider_class属性,指定其他的缓存策略,该缓存策略必须实现 org.hibernate.cache.CacheProvider接口。

       通过实现org.hibernate.cache.CacheProvider接口可以提供对不同二级缓存组件的支持。

       Hibernate内置支持的二级缓存组件如表14.1所示。
<img src="http://img.blog.csdn.net/20160409203421085?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />


14.2.3.4    二级缓存的配置

       在使用Hibernate的二级缓存时,对于每个需要使用二级缓存的对象都需要进行相应的配置工作。也就是说,只有配置了使用二级缓存的对象才会被放置在二级缓存中。二级缓存是通过<cache>元素来进行配置的。<cache>元素的属性定义说明如下所示:

      

<cache 

           usage="transactional|read-write|nonstrict-read-write|read-only"               (1)

           region="RegionName"                                                                                                   (2)

           include="all|non-lazy"                                                                                                   (3)

/>

       <cache>




usage

指定缓存策略,可选的策略包括:transactional,read-write,nonstrict-read-write或read-only

Y

(2)

region

指定二级缓存区域名

N

(3)

include

指定是否缓存延迟加载的对象。all,表示缓存所有对象;non-lazy,表示不缓存延迟加载的对象

N

all

   二级缓存的策略

       当多个并发的事务同时访问持久化层的缓存中的相同数据时,会引起并发问题,必须采用必要的事务隔离措施。

       在进程范围或集群范围的缓存,即第二级缓存,会出现并发问题。因此可以设定以下4种类型的并发访问策略,每一种策略对应一种事务隔离级别。

●   只读缓存(read-only)

       如果应用程序需要读取一个持久化类的实例,但是并不打算修改它们,可以使用read-only缓存。这是最简单,也是实用性最好的策略。

对于从来不会修改的数据,如参考数据,可以使用这种并发访问策略。

●   读/写缓存(read-write)

       如果应用程序需要更新数据,可能read-write缓存比较合适。如果需要序列化事务隔离级别,那么就不能使用这种缓存策略。

对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读这类的并发问题。

●   不严格的读/写缓存(nonstrict-read-write)

       如果程序偶尔需要更新数据(也就是说,出现两个事务同时更新同一个条目的现象很不常见),也不需要十分严格的事务隔离,可能适用nonstrict-read-write缓存。

对于极少被修改,并且允许偶尔脏读的数据,可以采用这种并发访问策略。

●   事务缓存(transactional)

       transactional缓存策略提供了对全事务的缓存,仅仅在受管理环境中使用。它提供了Repeatable Read事务隔离级别。对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读和不可重复读这类的并发问题。

       在上面所介绍的隔离级别中,事务型并发访问策略的隔离级别最高,然后依次是读/写型和不严格读写型,只读型的隔离级别最低。事务的隔离级别越高,并发性能就越低。

 在开发中使用二级缓存

       在这一部分中,将细致地介绍如何在Hibernate中使用二级缓存。在这里所使用的二级缓存组件为EHCache。

       关于EHCache的详细信息请参考http://ehcache.sourceforge.net上的内容。

       在Hibernate中使用二级缓存需要经历以下步骤:

●   在Hibernate配置文件(通常为hibernate.cfg.xml)中,设置二级缓存的提供者类。

●   配置EHCache的基本参数。

●   在需要进行缓存的实体对象的映射文件中配置缓存的策略。


●  大家需要注意的是session中list的方法是不支持二级缓存的,但是如果我们想使用缓存,可通过设置setCacheable(true)例如List list=session.createQuery("FROM Employee e").setCacheable(true).list();来设置条件缓存,如同字面意思,保存的只是条件,哪怕要查找的对象已经在二级缓存中,只要条件不一致也会去查找数据库

session的iterate()方法例如:Iterator<Employee > iterator=session.createQuery("FROM Employee e").iterate();是支持二级缓存的


在使用二级缓存的时候注意导入相应的jar包:注意3.x和4.x之间的jar包,一定使用同一版本的缓存jar包
二级缓存配置文件模板:
<ehcache>

 
    <diskStore path="c:/leige/"/>


    <defaultCache
        maxElementsInMemory="10"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        />


</ehcache>

你可能感兴趣的:(hibernate关于c3p0数据库连接池和二级缓存详解)