我们可以为单个数据库连接进行多个并行事务吗? [复制]

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 SessionConnection 的包装器,以便您无需直接编写 SQL 即可保存 POJO。

所以休眠SessionConnection 的包装器。 Connections 保存在连接池中。

当您调用SessionFactory.openSession 时,hibernate 首先从提供的连接池中获取Connection。然后它围绕 Connection 创建一个 Session 并返回它。

当使用带有连接池的 Hibernate 时,只要 Session 需要一个 JDBC 连接,它就会从池中分配它。

会话完成后,其行为取决于ConnectionReleaseMode。对于 Hibernate 3.1,默认的 ConnectionReleaseModeAFTER_TRANSACTION(是 ON_CLOSE),这意味着 Sessiontransaction 结束(提交或回滚)释放连接回池。

【讨论】:

【参考方案2】:

SessionFactory 没有获得数据库连接。 SessionFactory 是线程安全的,加载 hibernate.cfg.xml 文件,线程可以同时访问它,并为单个数据库请求会话和已编译映射的不可变缓存。构建 SessionFactory 时,将映射所有实体类。

您可以从 SessionFactory 获取任意数量的 Session 实例。会话不是线程安全的,即,您不能在线程之间共享会话。会话延迟获取数据库连接。 beginTransaction() 只有在需要时才会为给定 Session 加载连接,即只有在事务启动时。

【讨论】:

以上是关于我们可以为单个数据库连接进行多个并行事务吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的多线程?

分布式事务-二阶段协议

单个管道可以被多个进程连接和读取吗

Firestore 事务在单个事务中更新多个文档

我们可以在 AWS Cognito 的单个用户池中拥有多个角色吗?

我们可以为单个帐户创建多个 mws 访问权限和密钥吗?