1 管理Session对象
Session对象的管理方式:
- 应用程序序自主管理Session;
- Hibernate管理Session。
1.1 应用程序自主管理Session
应用程序自主管理Session对象的生命周期时,何时创建Session、何时清理缓存及何时关闭Session都有程序负责。
缺点:1)代码重复;2)多个类共享同一个Session对象比较麻烦。
1.2 Hibernate管理Session
Hibernate管理Session的三种方式:
- Session对象的生命周期与本地线程绑定(Hibernate负责将Session与本地线程绑定)
- Session对象的生命周期与JTA事务绑定
- Hibernate 委托程序管理Session对象的生命周期(也就是说,应用程序自主管理Session对象时,借助于Hibernate将Session与本地线程绑定)
在Hibernate的配置文件Hibernate.cfg.xml中设置session的管理方式:
<property name="current_session_context_class">thread</property> //thread也可以换成jta或managed,分别对应三种管理方式;
1 Session对象的生命周期与本地线程绑定
- 创建Session:当一个线程调用SessionFactory的getCurrentSession()方法,而且此时没有Session与当前线程绑定时,Hibernate自动创建Session对象
- 关闭Session:当一个线程提交或撤销事务后,Hibernate自动关闭Session对象。
2 Session对象生命周期与JTA事务绑定
- 创建Session:当一个线程调用SessionFactory的getCurrentSession()方法,而且此时没有Session与当前JTA事务绑定时,Hibernate自动创建Session对象
- 关闭Session:当一个线程提交或撤销JTA事务后,Hibernate自动关闭Session对象。
Session对象与本地线程和与JTA事务绑定的区别:
前者是先有Session对象,然后由Session对象的beginTransaction()方法声明一个事务;而后者是先通过UserTransaction接口声明开始一个JTA事务,然后出现与该JTA绑定的Session对象。
3 Hibernate委托程序管理Session对象
org.hibernate.context.ManagedSessionContext的静态方法:
- bind(Session session):把Session与当前线程绑定。
- unbind(SessionFactory factory):解除Session对象与当前线程的绑定。
- hasBind(SessionFactory factory):判断是否存在与当前线程绑定的Session对象。
应用程序可以利用上面提供的方法来将session对象与当前线程绑定。
- 创建Session :Session对象由程序决定何时创建,当程序创建Session对象后或者声明开始一个事务前,利用bind()方法将Session与当前线程绑定。
- 关闭Sesssion:程序决定何时关闭一个Session对象。当程序提交一个事务之前,调用unbind()方法,解除Session对象与当前线程的绑定。
2 实现对话
对话:包含了用户思考时间的长工作单元。会话必须满足:1. 数据一致性,即防止并发问题。2. 原子性。
对话的实现方式有三种:
- 整个对话对应一个事务,并且与一个Session对象对应。1:1:1
- 使用游离对象:一个对话包括多个短事务,并且每个短事务对应一个单独的Session对象。事务之间通过游离对象传递业务数据。1:n:n
- 使用手工缓存模式下的Session对象:一个对话包含多个短事务,并且整个对话对应一个Session对象。1:n:1
三种实现对话方式比较如下图所示: