我们可以为单个数据库连接进行多个并行事务吗? [复制]
Posted
技术标签:
【中文标题】我们可以为单个数据库连接进行多个并行事务吗? [复制]【英文标题】:Can we have multiple parallel transactions for single database connection? [duplicate] 【发布时间】:2014-07-14 13:21:20 【问题描述】:我们能否从单一数据库连接获取多个事务?
在Hibernate中,我们通常只有一个SessionFactory实例,它在内部从Connection Pool获取数据库连接。当我们从 SessionFactory 获得新的 Session 时,它是在内部获取新的连接池还是在多个 Session 之间共享 数据库连接 >?
【问题讨论】:
【参考方案1】:Hibernate 是一个 ORM,它是 SQL 数据库和 POJO 之间的一层。
连接池提供了一种存储和重用java.sql.Connection
实例的方法,以提高速度和稳健性。
hibernate Session
是 Connection
的包装器,以便您无需直接编写 SQL 即可保存 POJO。
所以休眠Session
是Connection
的包装器。 Connections
保存在连接池中。
当您调用SessionFactory.openSession
时,hibernate 首先从提供的连接池中获取Connection
。然后它围绕 Connection
创建一个 Session
并返回它。
当使用带有连接池的 Hibernate 时,只要 Session 需要一个 JDBC 连接,它就会从池中分配它。
会话完成后,其行为取决于ConnectionReleaseMode
。对于 Hibernate 3.1,默认的 ConnectionReleaseMode
是 AFTER_TRANSACTION
(是 ON_CLOSE),这意味着 Session
在 transaction
结束(提交或回滚)释放连接回池。
【讨论】:
【参考方案2】:SessionFactory 没有获得数据库连接。 SessionFactory 是线程安全的,加载 hibernate.cfg.xml 文件,线程可以同时访问它,并为单个数据库请求会话和已编译映射的不可变缓存。构建 SessionFactory 时,将映射所有实体类。
您可以从 SessionFactory 获取任意数量的 Session 实例。会话不是线程安全的,即,您不能在线程之间共享会话。会话延迟获取数据库连接。 beginTransaction() 只有在需要时才会为给定 Session 加载连接,即只有在事务启动时。
【讨论】:
以上是关于我们可以为单个数据库连接进行多个并行事务吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章