当前位置: 首页 > 知识库问答 >
问题:

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

微生耘豪
2023-03-14

我们在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行发生的情况是,我没有从字面上关闭连接,它只是返回到连接池,但该方法的事务尚未提交。它只在B行完成后完成。但是由于连接返回到池,这意味着其他人可以在该方法提交(或回滚)之前使用相同的连接启动事务。

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

我一定要像这样关闭连接,否则它将无法返回池。但是如何将其与事务方法结合起来,以便不直接指定事务边界?

共有1个答案

叶茂才
2023-03-14

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

您可以在try块的finally块中完成,也可以使用try with resources语句从Java 7开始。

尝试使用资源:

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

   //statements

}catch(....) {}

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

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

 类似资料:
  • 在经典ASP中,如果页面遇到未捕获的异常并在提交/回滚之前停止,连接事务会发生什么情况? 例如: 鉴于事务正在进行中,是否会中止或提交?或者,当事务返回到连接池时,连接是否会维护该事务?

  • 相关问题,但不是我想知道的,因为我对PHPlib/函数的具体行为很好奇: 当连接在事务中间关闭时会发生什么? 当连接关闭时,未提交的事务会发生什么? 假设我有这样的代码(不管它是好的还是坏的实践): 包含提交和回滚的将被跳过,而连接将在事务启动后但在调用提交或回滚之前关闭。 该事务是否也会立即被销毁/结束/不管什么专有名词,或者它会保留下来并可能阻止来自其他服务的其他查询?

  • 使用来自DBCP的BasicDataSource,如果我们执行getConnection()并且在最后一个块中我们关闭连接,它是真的将连接返回到池还是关闭连接。我正在检查的代码片段是这样的 我正在检查BasicDataSource的源代码,并访问了这个包装类以获取连接。 委托对象的类型为java。sql。联系包装器代码调用委托的close方法,该方法将关闭集合,而不是将连接返回到池。这是DBCP的

  • 问题内容: 有人可以提供goroutine返回的澄清值。从goroutine返回的值是否已存入抵押。 例如: 我们是否应该避免在go例程中避免返回值? 问题答案: 快速查看一下组装输出显示 该函数确实将其结果存储到堆栈中 因此,当从goroutine调用它时,它会将结果存储到堆栈中。但是,这是一个新的堆栈,当goroutine结束时,该堆栈会被破坏,因此无法获取返回值。 但是,无法检索这些结果。

  • 我正在用C语言测试一些代码,发现TCP套接字调用有奇怪的行为。 > 我定义了一个监听线程,它同步地接受客户机,在接受客户机之后,它会在for循环中处理它,直到断开连接。因此,一次只处理一个客户机。所以我在一个循环中调用,然后在一个内部循环中调用,直到收到一个空缓冲区。 我与客户端启动5个线程,我调用,,最后 我在任何电话中都没有出错。一切似乎都很好。 然而,当我在服务器端打印收到的消息时,结果发现

  • hashcode或hashmap是如何工作的,如果我们重写hashcode返回的总是常量,而重写的equals方法返回false,它如何能够在返回或删除时识别准确的对象?时间bean忘记了性能所有的东西,我的问题是它如何能够识别精确的对象,让我再解释一点,我有一个有两个字段的person类,已经重写了返回总是1的hashcode和重写了返回false的equals方法,已经创建了3个对象,对象1-