首页 > 其他分享 >hibernate二级缓存(包括注解方式)

hibernate二级缓存(包括注解方式)

时间:2023-05-06 16:03:09浏览次数:29  
标签:hibernate 对象 cache 查询 二级缓存 缓存 注解 属性


二级缓存配置(spring+hibernate)

说明:本人不建议使用查询缓存,因为查询缓存要求完全相同的查询sql语句才会起作用,所说的查询缓存是针对第二次查询时 sql语句与第一次sql语句完全相同 那么就可以从缓存中取数据而不去数据库中取数据了,在不启用查询缓存的情况下 每次的查询数据也会缓存到二级缓存的 只不过每次查询都会去查询数据库(不包括根据ID查询),启用查询缓存很麻烦 需要每次查询时 调用Query.setCacheable(true)方法才可以,如:List<OrgiData> orgiDatas = (List<OrgiData>) s.createQuery("from OrgiData").setCacheable(true).list();

因此建议将查询缓存设置为如下:
hibernate.cache.use_query_cache=false


还有就是最重要的一点:对于经常修改或重要的数据不宜进行缓存,因为多并发时会造成数据不同步的情况。


首先增加ehcache-1.4.1.jar和backport-util-concurrent-3.1.jar或oscache-2.1.jar

一、spring配置

<bean id="sessionFactory" 

 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 

 <property name="dataSource" ref="dataSource" /> 

 <property name="mappingResources"> 

 <list> 

 <value>com/handpay/core/merchant/bean/MerchGroupBuy.hbm.xml 

 </value> 

 </list> 

 </property> 

 <property name="hibernateProperties"> 

 <value> 

 hibernate.dialect=org.hibernate.dialect.SQLServerDialect 

 hibernate.show_sql=true 

 hibernate.format_sql=true 

 hibernate.hbm2ddl.auto=update 

[color=red] hibernate.cache.use_second_level_cache=true 

 hibernate.cache.use_query_cache=false 

 hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider[/color] </value> 

 </property> 

 </bean> 


<!---红色字体是二级缓存相关的设置-> 


二、hbm.xml文件示例 


<?xml version="1.0"?> 

<!DOCTYPE hibernate-mapping PUBLIC 

 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 

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


<hibernate-mapping package="com.handpay.core.merchant.bean"> 

 <class name="MerchGroupBuy" table="merch_group_buy"> 

 <cache usage="read-write" region="com.handpay.core.merchant.bean.MerchGroupBuy"/> 

 <id name="id"> 

 <generator class="native" /> 

 </id> 

 <property name="code" /> 

 <property name="createTime"/> 

 <property name="minNum"/> 

 <property name="status"> 

 </property> 

 <property name="title"/> 

 <property name="typeCode"/> 

 <property name="updateTime"/> 

 </class> 

</hibernate-mapping>



三、注解示例

@Entity 

[color=red]@Cache(usage = CacheConcurrencyStrategy.READ_ONLY) [/color] 

@Table(name = "alcor_t_countries", catalog = "alcorweb") 

public class AlcorTCountries implements java.io.Serializable{。。。。}




四、配置文件参数详解

ehcache.xml是ehcache的配置文件,并且存放在应用的classpath中。下面是对该XML文件中的一些元素及其属性的相关说明:

<diskStore>元素:指定一个文件目录,当EHCache把数据写到硬盘上时,将把数据写到这个文件目录下。 下面的参数这样解释:

user.home – 用户主目录

user.dir – 用户当前工作目录

java.io.tmpdir – 默认临时文件路径

<defaultCache>元素:设定缓存的默认数据过期策略。

<cache>元素:设定具体的命名缓存的数据过期策略。



<cache>元素的属性

name:缓存名称。通常为缓存对象的类名(非严格标准)。

maxElementsInMemory:设置基于内存的缓存可存放对象的最大数目。

maxElementsOnDisk:设置基于硬盘的缓存可存放对象的最大数目。

eternal:如果为true,表示对象永远不会过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false;

timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期。当对象过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态。

timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期。当对象过期,EHCache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义。

overflowToDisk:如果为true,表示当基于内存的缓存中的对象数目达到了maxElementsInMemory界限后,会把益出的对象写到基于硬盘的缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。

memoryStoreEvictionPolicy:缓存对象清除策略。有三种:

1 FIFO ,first in first out ,这个是大家最熟的,先进先出,不多讲了

2 LFU , Less Frequently Used ,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。

2 LRU ,Least Recently Used ,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。


五 、查看 二级缓存数据

1、使用sessionFactory直接获取

Map cacheEntries = sessionFactory().getStatistics() 

 .getSecondLevelCacheStatistics("cacheRegionName") 

 .getEntries();




其中 cacheRegionName 既是 ehcache.xml配置中的<cache 标签的name属性值

2、让log4j打印缓存信息(生成环境下请注释掉,以免影响性能)
log4j.logger.org.hibernate.cache=debug


[color=red]
附件是:最新研究过结果及完整的ehcache.xml配置,请参考!!![/color]

标签:hibernate,对象,cache,查询,二级缓存,缓存,注解,属性
From: https://blog.51cto.com/u_7450530/6250454

相关文章

  • spring-transaction源码分析(2)EnableTransactionManagement注解
    概述(Javadoc)该注解开启spring的注解驱动事务管理功能,通常标注在@Configuration类上面用于开启命令式事务管理或响应式事务管理。@Configuration@EnableTransactionManagementpublicclassAppConfig{@BeanpublicFooRepositoryfooRepository(){//c......
  • struts2+Spring+Hibernate+Jquery (json)
          Struts2文件的上传和下载http://wing929.javaeye.com/blog/216118基于struts+spring+hibernate+jquery的jmesa的分页实现样例http://wing929.javaeye.com/blog/216292http://hi.baidu.com/angel_lishiwen/blog/item/cf266627fcb59327d4074288.html stru......
  • swagger3 常用注解
    swagger2OpenAPI3注解位置@Api@Tag(name=“接口类描述”)Controller类上@ApiOperation@Operation(summary=“接口方法描述”)Controller方法上@ApiImplicitParams@ParametersController方法上@ApiImplicitParam@Parameter(description=“参数描......
  • 缓存----Ibatis /Hibernate
    iBatis缓存的使用方法及解释:以iBatis2.3为例,做以下配置即可实现对某些查询进行缓存1、<settingslazyLoadingEnabled="false" cacheModelsEnabled="true" enhancementEnabled="true"/>   注释:       lazyLoadingEnabled延迟加载数据;cacheModelsEna......
  • Spring @Scheduled注解的理解
    一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。按顺序依次为:1.秒(0~59)2.分钟(0~59)3.小时(0~23)4.天(月)(0~31,但是你需要考虑你月的天数)5.月(0~11)6.天(星期)(1~71=SUN或SUN,MON,TUE,WED,THU,FRI,SAT)7.年份(1970-2099)在子表达式(月)里表示每个月的含义,“”在子表达式(天(星期))表示星期......
  • Spring17_注解开发7
    一、Spring原始注解Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。Spring原始注解主要是替代<Bean>的配置注入的3个注解用来替代property注入的。注意:使用注解进行开发时,需要在a......
  • @enableFeignClients注解的basePackages属性的作用
    basePackages属性是@EnableFeignClients注解的一个可选属性,它用于指定需要扫描的包路径。通过设置该属性,可以告诉Spring在哪些包下查找用@FeignClient注解标记的接口。basePackages中的包可以指定其他模块的包。在多模块的项目中,如果你想要在一个模块中使用另一个模块的......
  • springboot 切面注解方式 记录日志
    1.定义GateOpLogimportjava.lang.annotation.*;/***操作日志记录*@authorcodefulture*/@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceGateOpLog{/***说明*/Strin......
  • lombok的@Builder注解
    lombok的@Builder注解:链式构建一个对象Student.builder().sno("001").sname("admin").sage(18).sphone("110").build();......
  • @Import注解原理源码分析
    文章结构@Import注解源码的入口位置@Import注解原理收集@Import注解处理收集的imports@Import注解源码的入口位置源码的入口位置在ConfigurationClassParser#doProcessConfigurationClass方法中,至于为什么是这个位置,先按下不表后续会填坑完善。Spring如何解析配置类先简单看下Spr......