我现在在Hibernate中用EhCache做缓存,hibernate在对对象操作时自动缓存数据,但是缓存的key为对象的主键,我现在想对这个key在缓存前加上一个标识,因为我想对hibernate进行多schema扩展,所以如果用hibernate自己的缓存策略,相同的对象在schema切换后可能主键相同,那么缓存就会出现问题。求大牛帮忙下。谢谢!伪代码描述如下: //前提,Schema1中已经缓存了主键为1的用户信息。 Sessionsession=null; Useruser=null; //1、这里用Schema1创建Session,通过缓存获取主键为1的用户 session=Schema1.sessionFactory.openSession(); user=session.get(1); session.close(); //2、这里用Schema2创建Session,通过缓存获取主键为1的用户,但是 //拿出来的用户信息却是Schema1中的主键为1的用户信息,所以我想 //在hibernate进行二级缓存时,对缓存key进行操作,添加标识。 session=Schema2.sessionFactory.openSession(); user=session.get(1); session.close();
合理的缓存应用可以极大地提高系统性能,最简单的是在应用层面做缓存(越高层面做缓存,效果往往越好),直接将数据缓存到服务器中,以全局map方式存储。在使用的时候直接从缓存的map中取,而不用连接数据库,从而提升性能。这种方式简单易行,但是map常驻服务器内存,并且在数据变更(增删改)的时候要手动更新map。还有一种方式比较通用,就是使用hibernate二级缓存(sessionfactory级别的全局缓存,进程或集群级别),是一种通用缓存(一级缓存就不说了,session级别缓存,hibernate自己管理),hibernate二级缓存多应用在多读少写的实体对象中,比如组织机构和系统字典。本文使用hibernate注解方式使用二级缓存,做一个说明(使用ehcache)。1、添加ehcache.xml配置文件2、hibernate配置文件中,配置ehcache相关属性hibernate.cache.use_second_level_cache=truehibernate.cache.use_query_cache=truehibernate.cache.provider_class=org.hibernate.cache.ehcacheproviderhibernate.generate_statistics=true调试的时候,可以设置log4j的log4j.logger.org.hibernate.cache=debug(记录二级缓存的活动),实际发布的时候,注释掉,以免影响性能。3、pom文件中引入相应jar包(maven项目,如果还在手动添加jar包的,可以尝试使用maven)org.hibernatehibernate-ehcache3.6.9.final4、注解方式配置实体配置了二级缓存后,并不是对所有的实体使用,而是需要指定哪些实体需要用到。如果不配置查询缓存(查询缓存会在下面讲到),则只会在根据id查询的操作中,缓存对象。在实体上配置@cache(usage=cacheconcurrencystrategy.nonstrict_read_write)并指定缓存并发策略。@entity@cache(usage=cacheconcurrencystrategy.nonstrict_read_write)@table(name="base_dict")@jsonignoreproperties(value={"hibernatelazyinitializer","handler","fieldhandler","parentdict"})publicclassdictimplementsserializable{/****/privatestaticfinallongserialversionuid=5569761987303812150l;@id@column(name="id",length=36)@generatedvalue(generator="uuid")@genericgenerator(name="uuid",strategy="org.hibernate.id.uuidgenerator")@jsonproperty("id")privatestringid;/**字典名称*/@foreignshow@column(name="name",length=200)privatestringname;5、查询缓存的使用queryquery=session.createquery(hql);query.setcacheable(true);//启用查询缓存query.setcacheregion(“querycacheregion”);//设置查询缓存区域(数据过期策略)querycache只是在特定的条件下才会发挥作用,而且要求相当严格:(1)完全相同的hql重复执行。(注意,只有hql)(2)重复执行期间,querycache对应的数据表不能有数据变动(比如添、删、改操作)绝大多数的查询并不能从查询缓存中受益,所以hibernate默认是不进行查询缓存的。查询缓存适用于以下场合:(1)在应用程序运行时经常使用的查询语句(参数相同)(2)很少对与查询语句检索到的数据进行插入、删除或更新操作query.list();
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....