Hibernate的缓存(收集)
(1)缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似Hashmap,当以后要使用某个对象 时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。
2)Hibernate的Session就是一种缓存,我们通常将之称为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象 时,Session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。由于Session代 表一次会话过程,一个Session与一个数据库连接相关连,所以Session最好不要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应关 闭。并且Session是线程不安全的,被多个线程共享时容易出现问题。通常只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,因 此,Hibernate的Session这一级缓存的缓存作用并不明显,应用价值不大。Hibernate的二级缓存就是要为Hibernate配置一种 全局缓存,让多个线程和多个事务都可以共享这个缓存。我们希望的是一个人使用过,其他人也可以使用,session没有这种效果。
(3)二级缓存是独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。
在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己
的配置文件,最后要配置Hibernate中的哪些实体对象要纳入到二级缓存的管理中。明白了二级缓存原理和有了这个思路后,很容易配置起
Hibernate的二级缓存。扩展知识:一个SessionFactory可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当
使用Hibernate
的二级缓存后,注意不要有其他的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。
*********实现OSCache二级缓存的配置方案***********
1.首先我们需要在hibernate.cfg.xml中配置几个属性:
<!-- 是否开启二级缓存,缺省为开启 --> <property name="cache.use_second_level_cache">true</property> <!-- 选择第三方缓存框架支持 --> <property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>
为了能够查看二级缓存的使用效果,还可以配置:
<property name="generate_statistics">true</property>
2.然后是哪些类需要配置二级缓存:(举例User实体类)
<class-cache class="com.sy.vo.User" usage="read-write" />
其中usage是策略,属性值:
read-only:只读,效率最高。
read-write:读写,效率较低。但是能保证并发正确性。
nonstrict-read-write:非严格的读写,效率较高,不用加锁,不能保证并发正确性。例如帖子浏览量。
transactional:事务性缓存,可回滚缓存数据,一般缓存框架不带有此功能,实现很复杂。
这样hibernate.cfg.xml就配置完了。
3.配置映射文件User.hbm.xml,加入这句代码:
<cache usage="read-write"/>
4.加入oscache.properties配置文件到classPath下,这个文件在hibernate源码包中有。里面
有很多属性可以设置,如果只是简单实现,不需要修改。不修改的情况下,只有一个配置,是
配置二级缓存的大小,这个视本机内存而定。默认1000。
其中还有一个分布式的配置,可以设置主机IP等等。由于资源有限,我没有做实验。在此不做过多介绍。
OK,配置完成!
----------------------------------------------------------------------------------------------------------
最新文章
- 有利于SEO的DIV+CSS的命名规则
- Linux——【转】gcc编译与gdb调试简要步骤
- SNMP&ndash;Simple Network Management Protocol
- [转载]";百度方法+";案例—从持续集成到持续交付
- jsp中如何整合CKEditor+CKFinder实现文件上传
- TTL电平、CMOS电平、RS232电平的区别
- Ice_cream’s world III(prime)
- [转]Jmeter(一)-精简测试脚本
- DBNull.value
- 一篇文章读懂Java类加载器
- 【高速接口-RapidIO】4、Xilinx RapidIO核详解
- Python机器学习笔记:sklearn库的学习
- IO流_PrintWriter(字符打印流)与PrintStream(字节打印流)
- redis之hello
- 螺旋折线|2018年蓝桥杯B组题解析第七题-fishers
- httpClient 连接池问题出现403.9
- .net core2.2 跨域
- COM组件技术名称解释
- JournalNode的作用
- DiskFileUpload上传与Spring的CommonsMultipartResolver上传对比