【发布时间】: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() 甚至无法将连接附加到活动Usertransaction,UserTransaction 如何在内部设置连接的autoCommit(false)?
【问题讨论】:
标签: java transactions datasource spring-transactions