这章主要来浅的学习下hibernate三大状态与缓存。首先来看下三大状态:

如上图,三大状态分别为临时状态(Transient),持久化状态(Persistent),游离状态(Detached)。那么三大状态具体怎么来解释?

Student stu = new Student("学生1","男","长沙",);

如上代码段,new一个学生对象,内存中有了该对象,但数据库与session缓存中并不存在,即此时为临时状态

        Student stu = new Student("学生1", "男", "长沙", );

        session.saveOrUpdate(stu);

        transaction.commit();

new出来的对象加入到session缓存中,并同过底层的sql语句操作对象到数据库中,即此时为持久化状态。

        session.close();

        sessionfactory.close();

 关闭session对象后,学生对象依然存在数据库中,但却已不存在于session中,即脱离了session对象,此时为游离状态。

接下来看缓存:

缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能。Hibernate在进行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到了需要的数据(我们把这称做“缓存命 中"),则就直接把命中的数据作为结果加以利用,避免了大量发送SQL语句到数据库查询的性能损耗。

hibernate缓存分为一级缓存与二级缓存,一级缓存就是我们常用的session,而二级缓存就是SessionFactory。

Session内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务)。
一级缓存中,持久化类的每个实例都具有唯一的OID。

由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。
第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。
Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器。

在通常情况下会将具有以下特征的数据放入到二级缓存中:

●   很少被修改的数据。

●   不是很重要的数据,允许出现偶尔并发的数据。

●   不会被并发访问的数据。

●   参考数据。

而对于具有以下特征的数据则不适合放在二级缓存中:

●   经常被修改的数据。

●   财务数据,绝对不允许出现并发。

●   与其他应用共享的数据。

那么来配置一个二级缓存吧。

首先要导入ehcache包以及hibernate-ehcache包(对应hibernate版本),既然是maven项目,那么当然在pom.xml中引入依赖。

<!--hibernate-ehcache -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.2..Final</version>
</dependency> <!--net.sf.ehcache/ehcache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.</version>
</dependency>

接下来在hibernate.cfg.xml中进行配置

        <!-- 开启二级缓存 -->
<property name="cache.use_second_level_cache">true</property>
<!-- 开启查询二级缓存 -->
<property name="cache.use_query_cache"></property>
<!-- Hibernate4.0以上设置factory 缓存工具 -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<!-- 二级缓存 ehcache的配置文件位置 -->
<property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property>
<!-- 映射文件 -->
<mapping resource="com/entity/Student.hbm.xml" />
<!-- 需要缓存的类 -->
<class-cache usage="read-only" class="com.entity.Student" />

其中的ehcache.xml文件放与hibernate.cfg.xml同级即可。ehcache.xml里面的元素可以直接在以下路径中找到,不需要自己写。项目->Java Resources->Libraries->Maven Dependencies->ehcache-2.10.4.jar->ehcache-failsafe.xml

找到后打开,全选copy复制,再把<diskStore path="java.io.tmpdir"/>节点中path路径改成你自己定义的即可。最后测试二级缓存。

@Test
public void test() {
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
Session session1 = factory.openSession();
// 开启事物
Transaction transaction = session.beginTransaction();
// 根据主键得到对象(查询单个记录)
Student st = session.get(Student.class, );
System.out.println(st);
// 二级缓存
List<Student> ls = session1.createQuery("from Student").setCacheable(true).list();
for (Student s : ls) {
System.out.println(s);
}
// 提交事物
// transaction.commit();
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
}
自己对缓存也不是很懂!
本章结束。

最新文章

  1. CSharpGL(32)矩阵与四元数与角度旋转轴的相互转换
  2. HTML5+CSS3+Jquery实现纯手工的垂直时光轴【附源码】
  3. &lt;转&gt;浅析长度为0的数组
  4. 【开源一个小工具】一键将网页内容推送到Kindle
  5. 9.3---魔术索引(CC150)
  6. slf4j-api-1.7.5日志打印实验
  7. java中public等权限问题和final的使用
  8. javascript区分电脑与手机登陆
  9. CloudStack修复bug
  10. IOS的UITextField,UIButton,UIWebView它描述的一些属性和IOS提示图像资源
  11. L2-007. 家庭房产
  12. git push origin master 报错 remote rejected] master -&gt; master (branch is currently checked out)
  13. Java面试通关要点汇总集
  14. 【easy】530. Minimum Absolute Difference in BST
  15. [PHP]正则表达式判断网址
  16. Linux 小知识翻译 - 「SCP和SFTP」
  17. la 3938(未完成)
  18. net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting head
  19. SharePoint online Multilingual support - Development(2)
  20. 系统清理工具CCleaner被植入后门

热门文章

  1. JS严格模式
  2. 【转】MySQL分库分表环境下全局ID生成方案
  3. Tomcat配置用户名和密码
  4. 基于c编写的关于随机生成四则运算的小程序
  5. oracle查询用户权限及角色(摘)
  6. JAVA多线程--Thinking in java
  7. jmeter测试教程
  8. Android签名机制---签名过程
  9. 【转】NAS群晖DSM 5.0-4458安装教程
  10. Druid源码阅读之连接池