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