hibernate缓存总结

来源:互联网 发布:英语单词读音软件小学 编辑:程序博客网 时间:2024/05/17 05:50

接着

http://blog.csdn.net/wuhenzhangxing/article/details/74421261

http://blog.csdn.net/taiyangdao/article/details/52054185


1、FlushModeType

Flush模式为AUTO。

两者的区别及使用场合:

FlushModeType.AUTO:刷新在查询语句执行前(除了find()和getReference())或事务提交时才发生,在大量更新数据的过程中没有任何查询语句的执行时使用。

FlushModeType.COMMIT:刷新只在事务提交时才发生,在大量更新数据的过程中存在查询的执行时使用

2、CacheMode

由于执行Session缓存的方法调用数据库,进而会对二级缓存的影响,可以通过Hibernate的CacheMode设置Session缓存和二级缓存的关系。

  • CacheMode.NORMAL 默认值,读写数据库时同步设置二级缓存
  • CacheMode.GET 只从二级缓存中读取数据,除非数据更新否则不会写二级缓存
  • CacheMode.PUT 只在读取数据库数据时向二级缓存写入数据,不会读取二级缓存中的数据
  • CacheMode.REFRESH 只向二级缓存写入数据,不会读取二级缓存中的数据
  • CacheMode.IGNORE 不使用二级缓存
3\JPA细分了CacheMode为CacheRetrieveMode和CacheStoreMode

  • CacheRetrieveMode.BYPASS不从缓存中读取数据,直接从数据库中读取数据
  • CacheRetrieveMode.USE 默认值,从缓存在读取数据
  • CacheStoreMode.BYPASS 不插入缓存
  • CacheStoreMode.REFRESH 不论读/写数据库,都插入或更新缓存
  • CacheStoreMode.USE 默认值,读数据库时插入entity数据到缓存;写数据库时插入或更新缓存
4\lockmode

Hibernate 的加锁模式有:
LockMode.NONE 无锁机制。
LockMode.WRITE Hibernate  Insert  Update 记录的时候会自动获取。
LockMode.READ Hibernate 在读取记录的时候会自动获取。


以上这三种锁机制一般由 Hibernate 内部使用,如Hibernate 为了保证 Update过程中对象不会被外界修改,会在 save方法实现中自动为目标对象加上 WRITE 锁。
LockMode.UPGRADE 利用数据库的 for update 子句加锁。
LockMode. UPGRADE_NOWAIT  Oracle 的特定实现,利用 oracle  for update nowait 子句实现加锁。
上面这两种锁机制是我们在应用层较为常用的,加锁一般通过以下方法实现:
Criteria.setLockMode
Query.setLockMode
Session.lock


悲观锁

在应用程序中显示地为数据资源加锁.悲观锁假定当前事务操纵数据资源时,肯定还会有其它事务同时访问该数据资源,为了避免当前事务的操作受到干扰,先锁定资源.尽管悲观锁能防止丢失更新和不可重复读这类并发问题,但会影响并发性能.

乐观锁

假定当前事务操纵数据资源时,不会有其它事务同时访问该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作.应用程序采用版本控制手段来避免可能出现的并发问题.

 

LockMode类表示的几种锁定模式

锁定模式

描述

LockMode.NONE

如果缓存中存在对象,直接返回该对象的引用,否则通过select语句到数据库中加载该对象,默认值.

LockMode.READ

不管缓存中是否存在对象,总是通过select语句到数据库中加载该对象,如果映射文件中设置了版本元素,就执行版本检查,比较缓存中的对象是否和数据库中对象版本一致

LockMode.UPGRADE

不管缓存中是否存在对象,总是通过select语句到数据库中加载该对象,如果映射文件中设置了版本元素,就执行版本检查,比较缓存中的对象是否和数据库中对象的版本一致,如果数据库系统支持悲观锁(如Oracle/MySQL),就执行select...for update语句,如果不支持(如Sybase),执行普通select语句

LockMode.UPGRADE_NOWAIT

和LockMode.UPGRADE具有同样功能,此外,对于Oracle等支持update nowait的数据库,执行select...for update nowait语句,nowait表明如果执行该select语句的事务不能立即获得悲观锁,那么不会等待其它事务释放锁,而是立刻抛出锁定异常

LockMode.WRITE

保存对象时会自动使用这种锁定模式,仅供Hibernate内部使用,应用程序中不应该使用它

LockMode.FORCE

强制更新数据库中对象的版本属性,从而表明当前事务已经更新了这个对象

 

 

多个事务并发运行时的并发问题

第一类丢失更新:撤销一个事务时,把其它事务已提交的更新数据覆盖.

第二类丢失更新:不可重复读中的特例,一个事务覆盖另一事务已提交的更新数据.

脏读:一个事务读到另一事务未提交的更新数据.

幻读:一个事务读到另一事务已提交的新插入的数据.

不可重复读:一个事务读到另一个事物已提交的更新数据.

 

锁的类型和兼容性

共享锁

l  加锁条件:当一个事务执行select语句时,数据库系统会为这个事务分配一把共享锁,锁定被查询的数据.

l  解锁条件:数据被读取后,数据库系统立即解除共享锁.

l  与其它锁的兼容性:如果数据资源上放置了共享锁,还能再放置共享锁和更新锁.

l  并发性能:良好的并发性能.当多个事务读相同数据时,每个事务都会获得一把共享锁,可以同时读锁定的数据.

独占锁

l  加锁条件:当一个事务执行insert,update,delete时,数据库系统会自动对SQL语句操纵的数据资源使用独占锁.如果该数据资源已经有其它锁存在时,无法对其再放置独占锁.

l  解锁条件:独占锁一直到事务结束后才能被解除.

l  与其它锁的兼容性:独占锁不能和其他锁兼容,如果数据资源已经加上了独占锁, 就不能再放置其它锁,同样,如果已经有了其它锁,就不能放置独占锁.

l  并发性能:并发性能较差,只允许有一个事务访问锁定的数据,如果其他事务也需要访问该数据,就必须等待,直到前一个事务结束,解除了独占锁,其它事务才能访问该数据.

更新锁

l  加锁条件:当一个事务进行update操作时,数据库系统会先为事务分配一把更新锁.

l  解锁条件:当读取数据完毕,执行更新操作时,会把更新锁升级为独占锁.

l  与其它锁的兼容性:更新锁与共享锁兼容,即一个资源可以同时放置更新锁和共享锁,但是最多只能放置一把更新锁,这样,当多个事务更新相同的数据时,只有一个事务能获得更新锁,然后再把更新锁升级为独占锁,其它事务必须等到前一个事务结束后,才能获得更新锁,避免了死锁.

l  并发性能:允许多个事务同时读锁定资源,但不允许其它事务修改它.



Hibernate为乐观锁提供了3中实现:

1. 基于version

2. 基于timestamp

3. 为遗留项目添加添加乐观锁


http://blog.csdn.net/csh624366188/article/details/7654996

http://gary0416.iteye.com/blog/888682

原创粉丝点击