【问题标题】:UserTransaction with DataSource.getConnection() and DataSourceUtils.getConnection使用 DataSource.getConnection() 和 DataSourceUtils.getConnection 的 UserTransaction
【发布时间】:2016-08-06 05:10:11
【问题描述】:
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)

【问题讨论】:

    标签: java transactions datasource spring-transactions


    【解决方案1】:

    我有一个类似的问题,here 已经回答了。

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

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 1970-01-01
      • 2011-04-18
      • 2012-02-29
      • 2017-12-06
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多