DataSource.getConnection() 和 DataSourceUtils.getConnection 的 UserTransaction

UserTransaction with DataSource.getConnection() and DataSourceUtils.getConnection

static void clean() throws Exception {
  final UserTransaction tx = InitialContext.doLookup("UserTransaction");
  tx.begin();

  try {
    final DataSource ds = InitialContext.doLookup(Databases.ADMIN);
    Connection connection = ds.getConnection();//line 1
    connection = ds.getConnection(); //line 2- call again for testing purpose
    PreparedStatement st = connection.prepareStatement("xxxxxxx sql script");
    st.executeUpdate();
    st.close();
    connection.close();
    tx.commit();
  } finally {
    if (tx.getStatus() == Status.STATUS_ACTIVE) {
      tx.rollback();
    }
  }
}

我正在尝试比较 DataSource.getConnection()DataSourceUtils.getConnection(DataSource),根据 Javadoc,第一个总是获得新连接,第二个总是获得绑定到活动 UserTransaction(在当前线程中)。

我看到上面的示例代码,我不明白为什么使用 DataSource.getConnection 的示例,根据我的理解,我们应该始终使用 DataSourceUtils.getConnection(DataSource) 而不是其他,因为我们想要在一个连接中提交整个脚本块,而不是拥有多个连接。 (如果我错了请纠正我)

我不明白为什么,所以我添加了一个重复的行来测试(第2行),谁能解释一下这个东西在没有第2行和有第2行的情况下如何在后台工作?有什么区别?

已编辑

根据 Javadoc,DataSource.getConnection() 甚至无法将连接附加到活动 UsertransactionUserTransaction 如何在内部设置连接的 autoCommit(false)

我有一个类似的问题,已在 中回答。

只要调用是在事务上下文中,并且我们使用 DataSource 来获取连接,它就足够聪明,总是 return 唯一的活动连接。我认为这与事务管理器和 DataSource 的实现有关,就我而言,这两者都是我通过 JNDI 从 Weblogic 获取的。