在事务修复之前返回到池中的连接会发生什么?
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(....) {}
这样连接、语句和结果集对象将在使用后自动关闭。
即使您不关闭连接,所有事务都会被提交。
我们在 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(....) {}
这样连接、语句和结果集对象将在使用后自动关闭。
即使您不关闭连接,所有事务都会被提交。