11.1. Session和事务范围(transaction scope)
SessionFactory
对象的创建代价很昂贵,它是线程安全的对象,它为所有的应用程序线程所共享。它只创建一次,通常是在应用程序启动的时候,由一个Configuraion
的实例来创建。
Session
对象的创建代价比较小,是非线程安全的,对于单个请求,单个会话、单个的 工作单元而言,它只被使用一次,然后就丢弃。只有在需要的时候,一个Session
对象 才会获取一个JDBC的Connection
(或一个Datasource
) 对象,因此假若不使用的时候它不消费任何资源。
此外我们还要考虑数据库事务。数据库事务应该尽可能的短,降低数据库中的锁争用。 数据库长事务会阻止你的应用程序扩展到高的并发负载。因此,假若在用户思考期间让数据库事务开着,直到整个工作单元完成才关闭这个事务,这绝不是一个好的设计。
一个操作单元(Unit of work)的范围是多大?单个的Hibernate Session
能跨越多个 数据库事务吗?还是一个Session
的作用范围对应一个数据库事务的范围?应该何时打开 Session
,何时关闭Session
?,你又如何划分数据库事务的边界呢?