在事务修复之前返回到池中的连接会发生什么?

What happens to the connection returned to pool before transaction is fixed?

我们在 Glassfish 中使用无状态会话 bean。我有以下问题。我们的方法默认支持事务,即事务在业务方法起点开始,在出口点提交(或回滚)。所以让我们假设我有这样的代码:

public void businessMethod() {
  Connection conn; 
  try {
    conn = getConnectionFromPool();
    // Do some queries to the database
  } finally {
     if (conn != null) conn.close(); // Line A
      // Line B
  }
}

所以在 A 行发生的事情是,我并没有真正关闭连接,它只是 returned 到连接池,但是方法的事务还没有提交。它仅在 B 行完成后才完成。但是由于连接 returned 到池中,这意味着其他人可以使用相同的连接启动事务,在此方法提交(或回滚)之前。

那么,接下来会发生什么?在该方法完成事务之前,池中的连接是否对其他人不可用?还是第二笔交易会一直阻塞直到第一笔交易结束?我正在使用 MySQL 作为数据库。

我绝对必须像这样关闭连接,否则它就不会 return 到池中。但是如何将它与事务方法结合起来,以便我不直接指定事务边界?

无论您是否使用连接池,您都应该始终关闭所有资源。

您可以在 try 块的 finally 块中或从 Java 7 开始使用 try-with-resources 语句。

尝试使用资源:

try(Connection con = getConnection(url, username, password, "org.postgresql.Driver");
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
    ) {

   //statements

}catch(....) {}

这样连接、语句和结果集对象将在使用后自动关闭。

即使您不关闭连接,所有事务都会被提交。