Hibernate ehcache缓存配置详解+实战 (底部含C3P0)

本文详细介绍了Hibernate的二级缓存配置,包括依赖管理、ehcache.xml配置、缓存字段解析及缓存逻辑。同时,讲解了Hibernate查询缓存的使用,并展示了如何在实体类上添加注解。此外,还涵盖了C3P0数据库连接池的配置,包括各项参数的解释。最后,提到了二级缓存和查询缓存适用的数据类型及其模式。
摘要由CSDN通过智能技术生成

依赖管理

		<dependency>
		    <groupId>org.hibernate</groupId>
		    <artifactId>hibernate-core</artifactId>
		    <version>5.0.2.Final</version>
		</dependency>
		<dependency>
		    <groupId>org.hibernate</groupId>
		    <artifactId>hibernate-ehcache</artifactId>
		    <version>5.0.2.Final</version>
		</dependency>
		<!-- c3p0数据库连接池 -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-c3p0</artifactId>
			<version>5.0.2.Final</version>
		</dependency>

ehcache.xml配置详解

<ehcache>  
  <!-- 
  指定二级缓存存放在磁盘上的位置,可以使用磁盘目录,也可以使用Java System Property目录,user.home是用户目录、user.dir是用户当前工作目录、java.io.tmpdir是默认临时文件路径 
  -->
   <diskStore path="java.io.tmpdir/cache"/>

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

  <!--可以给每个实体类指定一个配置文件,通过name属性指定,要使用类的全名-->
    <cache name="com.teemo.entity.User"
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"
        overflowToDisk="true"
        />

    <cache name="sample"
        maxElementsInMemory="1000"
        eternal="true"
        timeToIdleSeconds="0"
        timeToLiveSeconds="0"
        overflowToDisk="false"
        />
</ehcache>

cache字段说明:

  • name:Cache的唯一标识。
  • maxElementsInMemory:内存中最大缓存对象数。
  • eternal:Element是否永久有效,一旦设置true,timeout将不起作用。
  • timeToIdleSeconds:设置Element在失效前的允许闲置时间。仅当element不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
  • timeToLiveSeconds:设置Element在失效前允许存活时间。最大时间介于创建时间和失效时间之间。仅当element不是永久有效时使用,默认是0.,也就是element存活时间无穷大。
  • overflowToDisk:配置此属性,当内存中Element数量达到maxElementsInMemory时,Ehcache将会Element写到磁盘中。
  • maxElementsOnDisk:磁盘中最大缓存对象数,若是0表示无穷大。
  • memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略
  • 去清理缓存中的内容。默认策略是LRU(最近最少使用),你也可以设置为FIFO(先进先出)或是LFU(较少使用)

Hibernate二级缓存逻辑:

  • 会先根据entity的region到ehcache的缓存区域查找缓存,region对应的是ehcache配置中的name字段,如果找不到,会使用entity的全类名来查找缓存,如果还找不到会使用default设置

Hibernate缓存设置
xml配置如下:

<!-- 开启二级缓存 -->
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<!-- 开启查询缓存 -->
<prop key="hibernate.cache.use_query_cache">true</prop>
<!-- 高速缓存提供程序 -->
<!-- Hibernate4.0 以前使用该设置<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop>-->
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>

实体类注解:

@Cache(region = "sample", usage = CacheConcurrencyStrategy.READ_WRITE)
public class User {
    @Cache(region = "all", usage = CacheConcurrencyStrategy.READ_WRITE)
    private Set<Role> roles = new HashSet<Role>();
}

usage提供的事务隔离级别有NONE, READ_ONLY, NONSTRICT_READ_WRITE, READ_WRITE, TRANSACTIONAL,但是ehcache不支持TRANSACTIONAL。
使用并测试缓存效果

二级缓存适用于以下数据:

  • 很少被修改,大量查询的
  • 不是很重要的数据,允许出现偶尔并发访问的

Hibernate的缓存模式

  • Hibernate的二级缓存只会根据ID进行缓存,也就是使用get/load方法会将查询对象缓存,如果需要对HQL或SQL进行缓存,则需要在代码中指定setCacheable(true)。
  • 查询缓存所缓存的key值就是查询所使用的HQL或SQL语句,需要注意的是:查询缓存不仅要求所使用的HQL语句、SQL语句相同,甚至是要求所传入的参数也相同,Hibernate才能从缓存中查去数据。

更多资料参见 : https://blog.csdn.net/u011404265/article/details/54315248

Hibernate 5.x 配置 C3P0 连接池

<?xml version='1.0' encoding='UTF-8'?>  
<!DOCTYPE hibernate-configuration PUBLIC  
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
          "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">  
<hibernate-configuration>
    <session-factory>
		<!--C3P0配置 -->
	    <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
	    <property name="hibernate.c3p0.max_size">20</property>
	    <property name="hibernate.c3p0.min_size">5</property>
	    <property name="hibernate.c3p0.timeout">120</property>
	    <property name="automaticTestTable">Test</property>
	    <property name="hibernate.c3p0.max_statements">100</property>
	    <property name="hibernate.c3p0.idle_test_period">120</property>
	    <property name="hibernate.c3p0.acquire_increment">1</property>
	    <property name="c3p0.testConnectionOnCheckout">true</property>
	    <property name="c3p0.idleConnectionTestPeriod">18000</property>
	    <property name="c3p0.maxIdleTime">25000</property>
	    <property name="c3p0.idle_test_period">120</property>
	    
		<!-- ... 其它省略 -->

	</session-factory>
</hibernate-configuration>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值