




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hibernate3+Ehcache配置二级缓存和查询缓存必须步骤:通过Maven把Hibernate3、Ehcache的jar包分别引入。以下提供一份成功的pom.xml。第一步:在Spring配置文件,比如context.core.xml添加sessionFactory元素(因为二级缓存是针对sessionFactory的,被全局Session所共享)以及CacheManager元素,其中高亮部分为重点。 classpath*:conf/hibernate.*.cfg.xml $hibernate.dialect $hibernate.show_sql $hibernate.generate_statistics $vider_class $hibernate.cache.use_second_level_cache $hibernate.cache.use_query_cache 第二步:配置一个properties文件以存放hibernate的属性信息,比如vider_class=org.hibernate.cache.EhCacheProviderhibernate.cache.use_second_level_cache=truehibernate.cache.use_query_cache=truehibernate.dialect=org.hibernate.dialect.Oracle10gDialect第三步:在perties日志属性文件里,添加显示缓存信息的设置。正式运行可以关闭已提高性能。.hibernate.cache = DEBUG第四步:在类路径classes目录下新建一个ehcache.xml文件,并配置缓存对象和策略。(注意:ehcache.xml必须在类路径一级目录下,否则ehcache找不到文件,会直接读取ehcache.jar里的ehcache-failsafe.xml里的defaultCache配置)参考文件如下: !- .其他省略第五步:如果使用hibernate注解方式使用hibernate映射数据表,会在类路径下有一个hibernate.xxx.cfg.xml文件,以配置实体类映射。并可以在该文件配置哪些实体类需要使用二级缓存,或者可以通过注解的方式配置哪些实体需要使用二级缓存。总共两种方式:第一种是hibernate.xxx.cfg.xml 配置文件里指定(建议这种,少侵入式代码): 第二种是直接注解设置(未经测试过):EntityCache(usage = CacheConcurrencyStrategy.READ_ONLY)Table(name = alcor_t_countries, catalog = alcorweb)public class AlcorTCountries implements java.io.Serializable。第六步:通过使用hibernate的API使用二级缓存。必须获取Query对象并使用setCacheable(true)方式。(注意:不能使用原生态SQL的update、delete操作,这样会导致hibernate清空所有缓存区域。如果非要写原生态SQL的update、delete操作,需要特殊的api处理。) /不使用缓存的方式 public List find(String hql, Object. values) return this.find(hql, false, values); /使用缓存的方式 public List find(String hql, boolean isNeedCache, Object. values) return this.createQuery(hql, values).setCacheable(isNeedCache).list(); public T findUnique(String hql, Object. values) return this.findUnique(hql, false, values); public T findUnique(String hql, boolean isNeedCache, Object. values) return this.createQuery(hql, values).setCacheable(isNeedCache).uniqueResult(); private Query createQuery(String queryString, Object. values) Assert.hasText(queryString, queryString不能为空); Query query = this.getSession().createQuery(queryString); if(values != null) for(int i = 0; i values.length; +i) query.setParameter(i, valuesi); return query; 注意:因为使用hibernate操作实体的update或remove操作,会自动清空特定区域(region)的缓存的。比如以下方式: public void save(T object) this.getSession().save(object); public void update(T object) this.getSession().update(object); public void remove(PK id) Assert.notNull(id, id不应为空!); Object object = this.getSession().get(this.persistentClass, id); this.getSession().delete(object); public void remove(T object) Assert.notNull(object, 要删除的对象不应为空!); this.getSession().delete(object); public int updateByHQLWithParams(String hql, Map params, Map paramsList) Query sqlQuery = this.getQuery(hql, params, paramsList); return sqlQuery.executeUpdate(); 但是如果直接使用原生态SQL的话,hibernate不能确定要影响到哪些缓存区域,为了确保数据的一致性,只能清空所有区域的缓存对象。控制台会频繁的CacheEventListener的notifyRemoveAll方法以及输出以下日志执行:Invalidating space T_ACCOUNT_LOGIN, timestamp: 6054554173321216 或 Pre-invalidating space T_YSKM上述说明摘自Hibernate论坛:Hibernate cant know what you are doing and therefore it cant know what caches need to be invalidated. As long as hibernate doesnt know which caches are affected it must assume that all data is invalid to ensure data consistency. This means that hibernate will invalidate all caches.参考笔记:Impact of native sql queries on hibernates second level cache如果非要使用原生态SQL进行update或remove,需要使用特殊的API方法,使它与具体的实体的缓存区域关联起来,这样hibernate就知道要清空哪里的region区域了:SQLQuery sqlQuery = this.getSession().createSQLQuery(sql) .addSynchronizedEntityClass(Pjxx.class) /实体类 .addSynchronizedEntityName(com.todaytech.gfmis.system.publicManage.domain.Pjxx) /实体类路径 .addSynchronizedQuerySpace(PJXX_SPACE); /实体的缓存区域名,一般使用实体的类路径较好以下是PWP BaseRepImp.class封装的方法: public int updateBySQLWithParams(String sql, Map params, Map paramsList) SQLQuery sqlQuery = this.getSession().createSQLQuery(sql).addSynchronizedEntityClass(this.persistentClass).addSynchronizedEntityName(this.persistentClass.getName().addSynchronizedQuerySpace(this.persistentClass.getName(); Iterator i$; String key; if(params != null) i$ = params.keySet().iterator(); while(i$.hasNext() key = (String)i$.next(); sqlQuery.setParameter(key, params.get(key); if(paramsList != null & paramsList.size() 0) i$ = paramsList.keySet().iterator(); while(i$.hasNext() key = (String)i$.next(); sqlQuery.setParameterList(key, (Object)paramsList.get(key); return sqlQuery.executeUpdate(); 如果是对于原生态的Select查询,也关联实体的缓存区域的话,可以通过以下方式:/因为查询不涉及更新实体对象的信息,所以不需要清空缓存。所以addSynchronized使用不存在的实体和空缓存region区域即可。SQLQuery sqlQuery = this.getSession().createSQLQuery(sql).addSynchronizedEntityClass(NOTHTNG.getClass().addSynchronizedEntityName(NOTHING).addSynchronizedQuerySpace( );第七步:验证。通过打印信息验证是否使用了缓存。第一次ReceipType的查询:控制台打印出以下日志信息:并没有在缓存中找到,所以会执行一次hibernate sql语句查询,并将结果放在缓存里。2016-11-10 16:31:21 2016-11-10 16:31:21,557 - INFO IncomeCommonServiceImpl( 926 ) - getSSDlType方法查询用时:8ms2016-11-10 16:31:21 2016-11-10 16:31:21,557 - INFO IncomeCommonServiceImpl( 608 ) - nontaxCoreService.getSfxmFcjbTypeByZsdwId用时:10ms2016-11-10 16:31:21 2016-11-10 16:31:21,594 - DEBUG StandardQueryCache( 125 ) - checking cached query results in region: org.hibernate.cache.StandardQueryCache2016-11-10 16:31:21 2016-11-10 16:31:21,595 - DEBUG EhCache( 74 ) - key: sql: select distinct receipttyp3_.TYPEID as TYPEID8_, receipttyp3_.AMOUNT as AMOUNT8_, receipttyp3_.BUY_RADIX as BUY3_8_, receipttyp3_.BUY_RADIX_UNIT as BUY4_8_, receipttyp3_.DESCR as DESCR8_, receipttyp3_.EXPIREYEAR as EXPIREYEAR8_, receipttyp3_.HASCHECKCODE as HASCHECK7_8_, receipttyp3_.HASTYPECODE as HASTYPEC8_8_, receipttyp3_.HASYEARCODE as HASYEARC9_8_, receipttyp3_.IN_STORE_MIN_COUNT as IN10_8_, receipttyp3_.IS_ONLINE as IS11_8_, receipttyp3_.ISTAXRECEIPT as ISTAXRE12_8_, receipttyp3_.LENOFPREFIX as LENOFPR13_8_, receipttyp3_.LENOFSEQ as LENOFSEQ8_, receipttyp3_.LOCK_PRINT_NOTICE_ID as LOCK15_8_, receipttyp3_.NAME as NAME8_, receipttyp3_.NEED_VERIFY as NEED17_8_, receipttyp3_.OLD_MAX_PRINT_NO as OLD18_8_, receipttyp3_.PRINT_NO_LOCK as PRINT19_8_, receipttyp3_.PRINT_NO_LOCK_TIME as PRINT20_8_, receipttyp3_.PRINT_NO_LOCK_USER as PRINT21_8_, receipttyp3_.PROCTM as PROCTM8_, receipttyp3_.RECEIPTKIND as RECEIPT23_8_, receipttyp3_.ROWCOUNT as ROWCOUNT8_, receipttyp3_.RT_BUY_TYPE as RT25_8_, receipttyp3_.SFZDSX as SFZDSX8_, receipttyp3_.SHEET as SHEET8_, receipttyp3_.SHORT_NAME as SHORT28_8_, receipttyp3_.STATUS as STATUS8_, receipttyp3_.TEMPLATEID as TEMPLATEID8_, receipttyp3_.TYPENO as TYPENO8_, receipttyp3_.USED_MAX_NUM as USED32_8_, receipttyp3_.YEARCODE as YEARCODE8_ from T_XTZYSQ xtzysq0_, T_SFXM sfxm1_, T_XTZYSQ xtzysq2_, RECEIPTTYPE receipttyp3_ where xtzysq0_.SQZYLX=? and xtzysq0_.BSQZYLX=? and xtzysq2_.SQZY_ID=xtzysq0_.BSQZY_ID and xtzysq0_.BSQZY_ID=sfxm1_.XM_ID and sfxm1_.BBZT=? and sfxm1_.ZT=? and xtzysq2_.SQZYLX=? and xtzysq2_.BSQZYLX=? and xtzysq2_.BSQZY_ID=receipttyp3_.TYPEID and sfxm1_.XMBM=? and xtzysq0_.SQZY_ID=? and (receipttyp3_.RECEIPTKIND in (? , ? , ?) or receipttyp3_.TYPENO=(select xtcs4_.CSZ from T_XTCS xtcs4_ where xtcs4_.CSDM=?) and xtzysq0_.ZT=? and xtzysq2_.ZT=?; parameters: 1, 1, 1, 1, 2, 2, 164009, 10020701, 2, 3, 4, YDPJ_RT_NO, 1, 1, ; named parameters: 2016-11-10 16:31:21 2016-11-10 16:31:21,596 - DEBUG EhCache( 83 ) - Element for sql: select distinct receipttyp3_.TYPEID as TYPEID8_, receipttyp3_.AMOUNT as AMOUNT8_, receipttyp3_.BUY_RADIX as BUY3_8_, receipttyp3_.BUY_RADIX_UNIT as BUY4_8_, receipttyp3_.DESCR as DESCR8_, receipttyp3_.EXPIREYEAR as EXPIREYEAR8_, receipttyp3_.HASCHECKCODE as HASCHECK7_8_, receipttyp3_.HASTYPECODE as HASTYPEC8_8_, receipttyp3_.HASYEARCODE as HASYEARC9_8_, receipttyp3_.IN_STORE_MIN_COUNT as IN10_8_, receipttyp3_.IS_ONLINE as IS11_8_, receipttyp3_.ISTAXRECEIPT as ISTAXRE12_8_, receipttyp3_.LENOFPREFIX as LENOFPR13_8_, receipttyp3_.LENOFSEQ as LENOFSEQ8_, receipttyp3_.LOCK_PRINT_NOTICE_ID as LOCK15_8_, receipttyp3_.NAME as NAME8_, receipttyp3_.NEED_VERIFY as NEED17_8_, receipttyp3_.OLD_MAX_PRINT_NO as OLD18_8_, receipttyp3_.PRINT_NO_LOCK as PRINT19_8_, receipttyp3_.PRINT_NO_LOCK_TIME as PRINT20_8_, receipttyp3_.PRINT_NO_LOCK_USER as PRINT21_8_, receipttyp3_.PROCTM as PROCTM8_, receipttyp3_.RECEIPTKIND as RECEIPT23_8_, receipttyp3_.ROWCOUNT as ROWCOUNT8_, receipttyp3_.RT_BUY_TYPE as RT25_8_, receipttyp3_.SFZDSX as SFZDSX8_, receipttyp3_.SHEET as SHEET8_, receipttyp3_.SHORT_NAME as SHORT28_8_, receipttyp3_.STATUS as STATUS8_, receipttyp3_.TEMPLATEID as TEMPLATEID8_, receipttyp3_.TYPENO as TYPENO8_, receipttyp3_.USED_MAX_NUM as USED32_8_, receipttyp3_.YEARCODE as YEARCODE8_ from T_XTZYSQ xtzysq0_, T_SFXM sfxm1_, T_XTZYSQ xtzysq2_, RECEIPTTYPE receipttyp3_ where xtzysq0_.SQZYLX=? and xtzysq0_.BSQZYLX=? and xtzysq2_.SQZY_ID=xtzysq0_.BSQZY_ID and xtzysq0_.BSQZY_ID=sfxm1_.XM_ID and sfxm1_.BBZT=? and sfxm1_.ZT=? and xtzysq2_.SQZYLX=? and xtzysq2_.BSQZYLX=? and xtzysq2_.BSQZY_ID=receipttyp3_.TYPEID and sfxm1_.XMBM=? and xtzysq0_.SQZY_ID=? and (receipttyp3_.RECEIPTKIND in (? , ? , ?) or receipttyp3_.TYPENO=(select xtcs4_.CSZ from T_XTCS xtcs4_ where xtcs4_.CSDM=?) and xtzysq0_.ZT=? and xtzysq2_.ZT=?; parameters: 1, 1, 1, 1, 2, 2, 164009, 10020701, 2, 3, 4, YDPJ_RT_NO, 1, 1, ; named parameters: is null2016-11-10 16:31:21 2016-11-10 16:31:21,600 - DEBUG StandardQueryCache( 130 ) - query results were not found in cacheHibernate: select distinct receipttyp3_.TYPEID as TYPEID8_, receipttyp3_.AMOUNT as AMOUNT8_, receipttyp3_.BUY_RADIX as BUY3_8_, receipttyp3_.BUY_RADIX_UNIT as BUY4_8_, receipttyp3_.DESCR as DESCR8_, receipttyp3_.EXPIREYEAR as EXPIREYEAR8_, receipttyp3_.HASCHECKCODE as HASCHECK7_8_, receipttyp3_.HASTYPECODE as HASTYPEC8_8_, receipttyp3_.HASYEARCODE as HASYEARC9_8_, receipttyp3_.IN_STORE_MIN_COUNT as IN10_8_, receipttyp3_.IS_ONLINE as IS11_8_, receipttyp3_.ISTAXRECEIPT as ISTAXRE12_8_, receipttyp3_.LENOFPREFIX as LENOFPR13_8_, receipttyp3_.LENOFSEQ as LENOFSEQ8_, receipttyp3_.LOCK_PRINT_NOTICE_ID as LOCK15_8_, receipttyp3_.NAME as NAME8_, receipttyp3_.NEED_VERIFY as NEED17_8_, receipttyp3_.OLD_MAX_PRINT_NO as OLD18_8_, receipttyp3_.PRINT_NO_LOCK as PRINT19_8_, receipttyp3_.PRINT_NO_LOCK_TIME as PRINT20_8_, receipttyp3_.PRINT_NO_LOCK_USER as PRINT21_8_, receipttyp3_.PROCTM as PROCTM8_, receipttyp3_.RECEIPTKIND as RECEIPT23_8_, receipttyp3_.ROWCOUNT as ROWCOUNT8_, receipttyp3_.RT_BUY_TYPE as RT25_8_, receipttyp3_.SFZDSX as SFZDSX8_, receipttyp3_.SHEET as SHEET8_, receipttyp3_.SHORT_NAME as SHORT28_8_, receipttyp3_.STATUS as STATUS8_, receipttyp3_.TEMPLATEID as TEMPLATEID8_, receipttyp3_.TYPENO as TYPENO8_, receipttyp3_.USED_MAX_NUM as USED32_8_, receipttyp3_.YEARCODE as YEARCODE8_ from T_XTZYSQ xtzysq0_, T_SFXM sfxm1_, T_XTZYSQ xtzysq2_, RECEIPTTYPE receipttyp3_ where xtzysq0_.SQZYLX=? and xtzysq0_.BSQZYLX=? and xtzysq2_.SQZY_ID=xtzysq0_.BSQZY_ID and xtzysq0_.BSQZY_ID=sfxm1_.XM_ID and sfxm1_.BBZT=? and sfxm1_.ZT=? and xtzysq2_.SQZYLX=? and xtzysq2_.BSQZYLX=? and xtzysq2_.BSQZY_ID=receipttyp3_.TYPEID and sfxm1_.XMBM=? and xtzysq0_.SQZ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京版小学一班级上册 走
- 2025年电子商务运营专员面试模拟题集与解析
- 2025年焊接技术实战模拟题集含钎焊部分及答案详解
- 【2025-2月更新】《新课标体育与健康》水平二 篮球大单元教案(共18课时)
- 2025年注册会计师考试CPA备考攻略与模拟题解析
- 2025年高级工职业技能鉴定备考指南与模拟试题详解灌区管理篇
- 2025年财务分析师招聘面试模拟题及应对技巧
- 2025学年安徽省皖东名校中考化学二模试卷
- 2025年物联网技术前沿知识中级工程师面试题集
- 2025年电力行业技术规范与安全培训试题及答案解析
- 高尿酸血症健康管理方案
- 秋季肌肤护理课件
- 磁粉检测培训课件
- 骨科总论教学课件
- 大单元教学培训
- 公墓建设可行性研究报告
- 2024年成都新都投资集团有限公司招聘笔试真题
- 混合痔护理教学课件
- 罐式专用运输管理制度
- 石家庄供暖管网规划方案
- 2025届上海市金山区高三下学期二模英语试题(解析版)
评论
0/150
提交评论