UserTransaction与DataSource.getConnection()和DataSourceUtils.getConnection

时间:2016-08-06 05:10:11

标签: java transactions datasource spring-transactions

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,第一个总是得到一个新连接,第二个总是得到一个绑定到活动{{1}的当前连接(在当前线程中)。

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

我不明白为什么,所以我添加了一个重复的线来测试(第2行),任何人都可以解释如果没有第2行和第2行这个东西在后台工作吗?有什么区别?

被修改

基于Javadoc,DataSourceUtils.getConnection(DataSource)甚至无法将连接附加到活动DataSource.getConnection()Usertransaction如何在内部设置连接的UserTransaction

1 个答案:

答案 0 :(得分:0)

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

只要调用在事务上下文中并且我们使用DataSource来获取连接,它就足够聪明地始终返回唯一的活动连接。我认为它与事务管理器和DataSource的实现有关,对于我的情况,我都是通过JNDI从Weblogic获取的。