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
?
答案 0 :(得分:0)
我有一个类似的问题,已在here中回答。
只要调用在事务上下文中并且我们使用DataSource
来获取连接,它就足够聪明地始终返回唯一的活动连接。我认为它与事务管理器和DataSource
的实现有关,对于我的情况,我都是通过JNDI从Weblogic获取的。