Hibernate 二级缓存 收集、总结整理
和《Hibernate 关系映射 收集、总结整理》 一样,本篇文章也是我很早之前收集、总结整理的,在此也发上来 希望对大家有用。因为是很早之前写的,不当之处请指正。
?
1、缓存:缓存是什么,解决什么问题?
<!-- 开启二级缓存 --><property name="hibernate.cache.use_second_level_cache">true</property><!-- 开启查询缓存 --><property name="hibernate.cache.use_query_cache">true</property><!-- 二级缓存区域名的前缀 --><!--<property name="hibernate.cache.region_prefix">h3test</property>--><!-- 高速缓存提供程序 --><property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property><!-- 指定缓存配置文件位置 --><property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property><!-- 强制Hibernate以更人性化的格式将数据存入二级缓存 --><property name="hibernate.cache.use_structured_entries">true</property><!-- Hibernate将收集有助于性能调节的统计数据 --><property name="hibernate.generate_statistics">true</property>
?
<?xml version="1.0" encoding="UTF-8"?><ehcache name="h3test"> <defaultCache maxElementsInMemory="100" eternal="false" timeToIdleSeconds="1200" timeToLiveSeconds="1200" overflowToDisk="false"> </defaultCache></ehcache>
?
?8.4.6.2.3、实体只读缓存
<hibernate-mapping> <class name="cn.javass.h3test.model.FarmModel" table="TBL_FARM"> <cache usage="read-only"/> ……</hibernate-mapping>
?
public static void readonlyTest() { SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session session1 = sf.openSession(); Transaction t1 = session1.beginTransaction(); //确保数据库中有标识符为1的FarmModel FarmModel farm = (FarmModel) session1.get(FarmModel.class, 1); //如果修改将报错,只读缓存不允许修改 //farm.setName("aaa"); t1.commit(); session1.close(); Session session2 = sf.openSession(); Transaction t2 = session2.beginTransaction(); farm = (FarmModel) session2.get(FarmModel.class, 1); t2.commit(); session2.close(); sf.close();}
?
<hibernate-mapping> <class name="cn.javass.h3test.model.FarmModel" table="TBL_FARM"> <cache usage="nonstrict-read-write"/> ……</hibernate-mapping>
?
public static void nonstrictReadWriteTest () { SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session session1 = sf.openSession(); Transaction t1 = session1.beginTransaction(); //确保数据库中有标识符为1的FarmModel FarmModel farm = (FarmModel) session1.get(FarmModel.class, 1); t1.commit(); session1.close(); Session session2 = sf.openSession(); Transaction t2 = session2.beginTransaction(); farm = (FarmModel) session2.get(FarmModel.class, 1); t2.commit(); session2.close(); sf.close();}
? ? ? ?§??????????允许更新,更新后缓存失效,需再查询一次。
? ? ? ?§??????????允许新增,新增记录自动加到二级缓存中。
? ? ? ?§??????????整个过程不加锁,不保证。
?
<hibernate-mapping> <class name="cn.javass.h3test.model.FarmModel" table="TBL_FARM"> <cache usage="read-write"/> ……</hibernate-mapping>?
?
public static void readWriteTest() { SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session session1 = sf.openSession(); Transaction t1 = session1.beginTransaction(); //确保数据库中有标识符为1的FarmModel FarmModel farm = (FarmModel) session1.get(FarmModel.class, 1); farm.setName("as"); t1.commit(); session1.close(); Session session2 = sf.openSession(); Transaction t2 = session2.beginTransaction(); farm = (FarmModel) session2.get(FarmModel.class, 1); t2.commit(); session2.close(); sf.close();}?
<hibernate-mapping> <class name="cn.javass.h3test.model.UserModel" table="TBL_USER"> <cache usage="read-write" /> <set name="farms" cascade="all" inverse="true" lazy="false"> <cache usage="read-write"/> <key column="fk_user_id"/> <one-to-many name="code">public static void collectionReadWriteTest() {SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session session1 = sf.openSession(); Transaction t1 = session1.beginTransaction(); //确保数据库中有标识符为118的UserModel UserModel user = (UserModel) session1.get(UserModel.class, 118); user.getFarms(); t1.commit(); session1.close(); Session session2 = sf.openSession(); Transaction t2 = session2.beginTransaction(); user = (UserModel) session2.get(UserModel.class, 118); user.getFarms(); t2.commit(); session2.close(); sf.close();}?
<hibernate-mapping> <class name="cn.javass.h3test.model.FarmModel" table="TBL_FARM"> <cache usage="read-write"/> ……</hibernate-mapping>?
? 3、测试代码
public static void queryCacheTest() {SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session session1 = sf.openSession(); Transaction t1 = session1.beginTransaction(); Query query = session1.createQuery("from FarmModel"); //即使全局打开了查询缓存,此处也是必须的 query.setCacheable(true); List<FarmModel> farmList = query.list(); t1.commit(); session1.close(); Session session2 = sf.openSession(); Transaction t2 = session2.beginTransaction(); query = session2.createQuery("from FarmModel"); //即使全局打开了查询缓存,此处也是必须的 query.setCacheable(true); farmList = query.list(); t2.commit(); session2.close(); sf.close();}? ? ??§? ? ? ? ? ?和实体并发策略有相同含义;
? ? ? §??????????和集合缓存类似,只缓存集合元素的标识符,在二级缓存中只存放相应实体的标识符,然后再通过标识符 去二级缓存查找相应的实体最后组合为集合返回。
??
?
<defaultCache maxElementsInMemory="100" eternal="false" timeToIdleSeconds="1200" timeToLiveSeconds="1200" overflowToDisk="false"> </defaultCache>
? ?2、指定区域cache:通过name指定,name对应到Hibernate中的区域名即可。
<cache name="cn.javass.h3test.model.UserModel" maxElementsInMemory="100" eternal="false" timeToIdleSeconds="1200" timeToLiveSeconds="1200" overflowToDisk="false"> </cache>
?3、cache参数详解:
<cache name="org.hibernate.cache.StandardQueryCache" maxElementsInMemory="5" eternal="false" timeToLiveSeconds="120"overflowToDisk="true"/>
?
<cache name="org.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/>??
if(sessionFactory == null) { WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); sessionFactory = (SessionFactory)applicationContext.getBean("userSessionFactory"); }
?
学习 学习谢谢
很早之前写的 分享出来 </set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many />
</list >
那么
<index >
<column name="indexs"></column>
</index>
indexs这个字段在数据库里面是怎么设置的,这个如果用mysql的话,不能自动增长,怎么处理一下,这个字段呢?我看网上有人根本没在映射文件hbm.xml里面配置这个字段。 </set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many />
</list >
那么
<index >
<column name="indexs"></column>
</index>
indexs这个字段在数据库里面是怎么设置的,这个如果用mysql的话,不能自动增长,怎么处理一下,这个字段呢?我看网上有人根本没在映射文件hbm.xml里面配置这个字段。
</set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many />
</list >
那么
<index >
<column name="indexs"></column>
</index>
indexs这个字段在数据库里面是怎么设置的,这个如果用mysql的话,不能自动增长,怎么处理一下,这个字段呢?我看网上有人根本没在映射文件hbm.xml里面配置这个字段。
你用list 会有问题的 主键递增 如100的话 那么集合就需要100个空间 浪费啊 </set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many />
</list >
那么
<index >
<column name="indexs"></column>
</index>
indexs这个字段在数据库里面是怎么设置的,这个如果用mysql的话,不能自动增长,怎么处理一下,这个字段呢?我看网上有人根本没在映射文件hbm.xml里面配置这个字段。
</set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many />
</list >
那么
<index >
<column name="indexs"></column>
</index>
indexs这个字段在数据库里面是怎么设置的,这个如果用mysql的话,不能自动增长,怎么处理一下,这个字段呢?我看网上有人根本没在映射文件hbm.xml里面配置这个字段。
你用list 会有问题的 主键递增 如100的话 那么集合就需要100个空间 浪费啊
这个indexs不是主键
CREATE TABLE `employee` (
`eid` varchar(36) NOT NULL,
`ename` varchar(50) NOT NULL,
`did` varchar(36) NOT NULL,
`idx` int(11) NOT NULL,
PRIMARY KEY (`eid`),
KEY `FK4722E6AEFEA415DC` (`did`),
CONSTRAINT `FK4722E6AEFEA415DC` FOREIGN KEY (`did`) REFERENCES `department` (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
CREATE TABLE `department` (
`did` varchar(36) NOT NULL,
`dname` varchar(50) NOT NULL,
PRIMARY KEY (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
只是一个普通的字段。
还有是不是不推荐使用list,在one-to-many的情况下? </set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many />
</list >
那么
<index >
<column name="indexs"></column>
</index>
indexs这个字段在数据库里面是怎么设置的,这个如果用mysql的话,不能自动增长,怎么处理一下,这个字段呢?我看网上有人根本没在映射文件hbm.xml里面配置这个字段。
</set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many />
</list >
那么
<index >
<column name="indexs"></column>
</index>
indexs这个字段在数据库里面是怎么设置的,这个如果用mysql的话,不能自动增长,怎么处理一下,这个字段呢?我看网上有人根本没在映射文件hbm.xml里面配置这个字段。
你用list 会有问题的 主键递增 如100的话 那么集合就需要100个空间 浪费啊
这个indexs不是主键
CREATE TABLE `employee` (
`eid` varchar(36) NOT NULL,
`ename` varchar(50) NOT NULL,
`did` varchar(36) NOT NULL,
`indexs` int(11) NOT NULL,
PRIMARY KEY (`eid`),
KEY `FK4722E6AEFEA415DC` (`did`),
CONSTRAINT `FK4722E6AEFEA415DC` FOREIGN KEY (`did`) REFERENCES `department` (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
CREATE TABLE `department` (
`did` varchar(36) NOT NULL,
`dname` varchar(50) NOT NULL,
PRIMARY KEY (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
只是一个普通的字段。
还有是不是不推荐使用list,在one-to-many的情况下?
</set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many />
</list >
那么
<index >
<column name="indexs"></column>
</index>
indexs这个字段在数据库里面是怎么设置的,这个如果用mysql的话,不能自动增长,怎么处理一下,这个字段呢?我看网上有人根本没在映射文件hbm.xml里面配置这个字段。
</set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many />
</list >
那么
<index >
<column name="indexs"></column>
</index>
indexs这个字段在数据库里面是怎么设置的,这个如果用mysql的话,不能自动增长,怎么处理一下,这个字段呢?我看网上有人根本没在映射文件hbm.xml里面配置这个字段。
你用list 会有问题的 主键递增 如100的话 那么集合就需要100个空间 浪费啊
这个indexs不是主键
CREATE TABLE `employee` (
`eid` varchar(36) NOT NULL,
`ename` varchar(50) NOT NULL,
`did` varchar(36) NOT NULL,
`indexs` int(11) NOT NULL,
PRIMARY KEY (`eid`),
KEY `FK4722E6AEFEA415DC` (`did`),
CONSTRAINT `FK4722E6AEFEA415DC` FOREIGN KEY (`did`) REFERENCES `department` (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
CREATE TABLE `department` (
`did` varchar(36) NOT NULL,
`dname` varchar(50) NOT NULL,
PRIMARY KEY (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
只是一个普通的字段。
还有是不是不推荐使用list,在one-to-many的情况下?
indexes不需要是索引,,,它映射到list 只是作为索引,,list 在 index比较小而且不重复时可以用用 不过场景我没遇到过
17 楼 jeffsui 2012-05-15 3楼,用get方式获得的对象,对应了对象的持久化状态。
18 楼 421584397 2012-05-15 http://www.verydemo.com/demo/53/70/10571
这里有关于hibernate联级对象缓存文章,写得不错 19 楼 jinnianshilongnian 2012-05-16 421584397 写道http://www.verydemo.com/demo/53/70/10571
这里有关于hibernate联级对象缓存文章,写得不错
谢谢 我也看看