码迷,mamicode.com
首页 > Web开发 > 详细

hibernate session缓存

时间:2017-05-14 12:23:36      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:一个数据库   内容   持久化对象   结果   影响   应用程序   包括   .net   ati   

Session 概述

Session 接口是 Hibernate 向应用程序提供的操纵数据库的最基本的接口, 它提供了基本的保存, 更新, 删除和载入 Java 对象的方法.

Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录相应. Session 可以在某些时间点, 依照缓存中对象的变化来运行相关的 SQL 语句, 来同步更新数据库, 这一过程被称为刷新缓存(flush)

站在持久化的角度, Hibernate 把对象分为 4 种状态: 持久化状态, 暂时状态, 游离状态, 删除状态. Session 的特定方法能使对象从一个状态转换到还有一个状态. 


Session 缓存

在 Session 接口的实现中包括一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存. 仅仅要 Session 实例没有结束生命周期, 且没有清理缓存。则存放在它缓存中的对象也不会结束生命周期

Session 缓存可降低 Hibernate 应用程序訪问数据库的频率。

技术分享


操作 Session 缓存

技术分享


flush()

flush:使数据库表中的记录和session缓存中的对象的状态保持一致。为了保持一致。则可能会发送相应的sql语句。

默认情况下 Session 在下面时间点刷新缓存:

显式调用 Session 的 flush() 方法,可能会发送sql语句(为什么使用可能,由于查询得到数据库中的状态与当前对象状态一致则不会发送sql更新),但不会提交事务(发送了sql语句。必须提交事务才会更新数据库)

当应用程序调用 Transaction 的 commit()方法的时, 该方法先 flush(更新) ,然后在向数据库提交事务

当应用程序运行一些查询(HQL, Criteria)操作时,假设缓存中持久化对象的属性已经发生了变化。会先 flush 缓存。以保证查询结果可以反映持久化对象的最新状态(当然这样的情况也仅仅是在事务范围内更新了,还未同步到数据库。仅仅有提交事务才会更新到数据库)

flush 缓存的例外情况: 假设对象使用 native 生成器生成 OID(记录的id是由底层数据库使用自增生成的), 那么当调用 Session 的 save() 方法保存对象时, 会马上运行向数据库插入该实体的 insert 语句同步到数据库.由于save方法后必须保证id是存在的。(假设id是由hibernate生成则才是在commit提交事务时才发送insert同步到数据库)

commit() 和 flush() 方法的差别:flush 运行一系列 sql 语句,但不提交事务;commit 方法先调用flush() 方法,然后提交事务. 意味着提交事务意味着对数据库操作永久保存下来。


设定刷新缓存的时间点(了解就可以。通常不会去更改)

若希望改变 flush 的默认时间点, 能够通过 Session 的 setFlushMode() 方法显式设定 flush 的时间点
技术分享


refresh()

会强制发送select语句,以使session缓存中对象的状态和数据库表中的相应的记录保持一致。受数据库隔离级别控制。

(必须了解数据库隔离级别,例如以下所看到的)


数据库的隔离级别

对于同一时候执行的多个事务, 当这些事务訪问数据库中同样的数据时, 假设没有採取必要的隔离机制, 就会导致各种并发问题:

脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是暂时且无效的.

不可反复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.

幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 假设 T1 再次读取同一个表, 就会多出几行.

数据库事务的隔离性: 数据库系统必须具有隔离并发执行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.

一个事务与其它事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别相应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱

数据库提供的 4 种事务隔离级别:

技术分享

Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED

Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ

在 MySql 中设置隔离级别

  • 每启动一个 mysql 程序, 就会获得一个单独的数据库连接. 每一个数据库连接都有一个全局变量 @@tx_isolation, 表示当前的事务隔离级别. MySQL 默认的隔离级别为 Repeatable Read
  • 查看当前的隔离级别: SELECT @@tx_isolation;
  • 设置当前 mySQL 连接的隔离级别: 
    set transaction isolation level read committed;
  • 设置数据库系统的全局的隔离级别:
    set global transaction isolation level read committed;

在 Hibernate 中设置隔离级别

  • JDBC数据库连接使用数据库系统默认的隔离级别.在Hibernate的配置文件里能够显式的设置隔离级别.每个隔离级别都相应一个整数:
    –1.READ UNCOMMITED
    –2.READ COMMITED
    –4.REPEATABLE READ
    –8.SERIALIZEABLE
  • Hibernate通过为Hibernate映射文件指定hibernate.connection.isolation属性来设置事务的隔离级别


clear()

清理缓存









hibernate session缓存

标签:一个数据库   内容   持久化对象   结果   影响   应用程序   包括   .net   ati   

原文地址:http://www.cnblogs.com/yfceshi/p/6851800.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!