技术开发 频道

Hibernate学习笔记二

Java集合类的简单描述:

本文只对Set、List、Map集合进行描述 我们可以先看一下Java集合类的类视图



一、Set集合

描述:Set集合中存放的是对象的引用,没有重复对象;Set集合中的对象无排序。

当一个对象加入到Set集合中,它会调用equals方法(对象的完整比较)来判断是否有相同的对象,如果有则不加入这个对象。

1、  HashSet

描述:按照哈希算法来存取集合中的对象,具有很好的存取性能。

当将一个对象加入到HashSet集合中,它会调用equals方法(引用地址比较)来判断是否有相同的对象,然后再判断此对象的哈希值(调用对象的hashCode()方法获取哈希值)是否与这个相等的对象的哈希值相同,如果相同则不添加此对象。如果不相同则添加此对象到一个新的位置。可见要覆写Equals()方法的同时要覆写hashCode ()方法,以保证相同的对象的哈希值相同。

2、  TreeSet

描述:TreeSet实现了SortedSet接口,能够对集合中的对象进行排序。

加到TreeSet集合中的同类型对象要实现Comparable接口。

在覆写compareTo()方法的同时要覆写equals()方法,也就是要保证比较对象的规则相同。随之而来的要覆写hashCode()方法。

3、  Set中加入持久化类的对象

描述:由于持久化对象是引用类型,Setequals()方法默认是比较引用地址,这样产生的问题就是同一条业务数据由于从不同的Session中取出引用地址会不同,这样两个对象都可以加到同一个Set集合中,这是我们要避免的问题。实现的方式就是覆写compareTo()方法(进行对象的值比较)、equals()方法、hashCode()方法。

二、List集合

描述:集合对象以索引方式进行存储,集合中允许存放重复对象。

1、  ArrayList:集合大小可变的数组。

2、  LinkedList

三、Map

描述:一种把键对象和值对象进行映射的集合,值对象可以是一个Map类型。

添加对象到集合中的时候,对于键相同的元素,采用覆盖的方式进行添加,键不变、值变。

1、  HashMap

描述:按照哈希算法进行存取,存取效率高。

2、  TreeMap

描述:可进行排序的Map

 

总结:如果Java类实现了Comparable接口,那么应该重新定义compareTo()equals()hashCode()方法。保证compareTo()equals()比较规则相同,并且保证equals()比较相同的情况下,hashCode()也相同。

数据库事务与并发
概述:事务通过隔离级别控制锁的形式来处理数据的并发问题。
为什么事务能够处理并发问题?
答:事务的特性决定它能够处理并发问题:一致性、隔离性、持久性、原子性
数据的并发有哪些情况?
答:
一、后发生的事务影响前面的事务
1、第一类更新丢失:后发生的事务回滚覆盖了前面提交成功的事务
2、脏读:后发生的事务成功提交覆盖了前面的回滚的事务
3、第二类更新丢失:后发生的事务成功提交覆盖了前面的成功提交的事务
二、后发生的事务受到前面的事务的影响
1、虚读:后一个事务在前后两次读取数据时由于前面的已提交的事务进行了插入操作,
         而使数据统计前后不一致。
2、不可重复读:后一个事务在对同一条数据前后两次读取时由于前面的已提交的事务
               进行了对这条数据更新操作,而使数据前后不一致。
事务如何处理并发问题?
答:
事务通过锁来处理并发问题一般有两种方式:
悲观锁:通过数据库系统的锁来处理并发
乐观锁:通过应用程序逻辑处理并发
悲观锁的种类有哪些?
答:
一、共享锁:用于读数据操作。
特性:
1、加锁条件:当一个事务执行select语句时数据库系统会为这个事务分配一把共享锁,来锁定被查询的记录。
2、解锁条件:读取完毕则释放共享锁。
3、兼容性:如果数据资源上已经放了共享锁还可放共享锁和更新锁。
4、并发性能:具有良好的并发性能。
二、更新锁:在更新操作的初始化阶段用来锁定可能要被修改的资源,避免使用共享锁造成的死锁问题。
特性:
1、加锁条件:当一个事务执行update语句时,数据库系统会先为事务分配一个更新锁。
2、解锁条件:当读取数据完毕,进行更新操作时将更新锁升级为独占锁。
3、兼容性:与共享锁兼容。一个数据资源上可以有多个共享锁和一个更新锁。
4、允许多个事务同时读锁定的资源,但不允许其它事务修改它。
三、独占锁:修改数据时使用独占锁。
特性:
1、加锁条件:当执行update、delete、insert操作时数据库系统会为数据资源使用独占锁。如果该资源上已经有其它锁         
            存在时则无法放置独占锁
2、解锁条件:独占锁一直到事务结束才能被解除。
3、兼容性:独占锁不能和其它锁兼容。
4、并发性:并发性能较差。
事务如何控制锁的形式?
答:事务通过事务的隔离级别来控制锁的形式。
事务级别有哪些?并发情况怎样?
答:

隔离级别
是否出现第一类丢失更新
是否出现脏读
是否出现虚读
是否出现不可重复读
是否出现第二类丢失更新
Serializable
Repeatable Read
Read Commited
Read Uncommited

在应用程序中如何使用乐观锁:
答:一般在数据库表中增加Version或者是TimeStamp字段,根据读取时以及在进行修改操作时Version或者TimeStamp的值不同来控制并发问题。
Hibernate是如何处理并发问题的:
答:
一、Hibernate在读取数据时通过设置锁定模式来控制悲观锁的形式

锁定模式
描述
LockMode.NONE
如果在Hibernate的缓存中存在指定对象,就直接返回该对象的引用;否则就通过Select语句到数据库中加载该对象。这是默认值
LockMode.Read
不管Hibernate的缓存中是否存在指定对象,总是通过select语句到数据库中加载该对象;如果映射文件中设置了版本元素,就执行版本检查,比较缓存中的指定对象是否和数据库中的版本一致。
LockMode.UPGRADE
不管Hibernate的缓存中是否存在指定对象,总是通过select语句到数据库中加载该对象;如果映射文件中设置了版本元素,就执行版本检查,比较缓存中的指定对象是否和数据库中的版本一致。如果数据库系统支持悲观锁就执行select。。。for update语句,如果数据库系统不支持悲观锁,就执行普通的select语句。
LockMode.UPGRADE_NOWAIT
和LockMode.UPGRADE具有同样的功能。此外对于Oracle数据库,执行select。。for update nowait语句。
LockMode.WRITE
当Hibernate向数据库保存或者更新一个对象时,会自动使用此模式。这种模式仅供Hibernate内部使用。

 
二、Hibernate在映射文件中使用乐观锁处理并发问题
1、<version>元素:此元素指定的字段,每进行一次操作就自动加1,在进行读取和修改操作时如果version值不相同则抛出异常,交给应用程序处理。
2、<timestamp>元素:此元素指定的字段数据,每进行一次操作就更新成当前时间。由于当前时间精确到妙所以在处理并发问题的精确性上没有<version>好。
注意:这两个元素在使用时都要紧跟在<id>元素后面。
3、对于现有的数据库表不包含version或者timestamp字段,要处理并发问题可以在<class>元素上进行如下设置:
   <class name=”Account” table=”Accounts” optimistic-lock=”all” dynamic-update=”true”>
0
相关文章