我目前正在使用JNDI从Weblogic 10.3服务器检索UserTransaction和DataSource。
我已将数据源设置为“支持全局事务”并使用“记录上一个资源”
我希望通过开始UserTranscation然后从数据源检索JDBC连接,连接将参与事务。
这似乎不是这种情况,我的insert语句被立即提交并回滚事务没有任何效果。
我的上述假设是否正确?
有人能指出我如何实现这一目标的一些文件或样本吗?
非常感谢提前
更新:
这里要求的是我正在使用的代码的骨架轮廓:
private void doSomething() {
Connection conn = null;
try {
Hashtable env = new java.util.Hashtable();
env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
env.put(javax.naming.Context.PROVIDER_URL,"t3://localhost:8080");
InitialContext ctx = InitialContext(env));
UserTransaction transaction = null;
transaction = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
DataSource dataSource = (DataSource) context.lookup("jdbc/xxxxx/DataSource");
conn = dataSource.getConnection();
transaction.begin();
// JDBC code goes here
transaction.commit();
} catch(Exception e) {
// TODO
if (transaction != null) {
try {
transaction.rollback();
} catch (Exception ex) {
// TODO
}
} finally {
if (con != null) {
conn.close
}
}
}
更新2:
为了解决这个问题,我必须做两件事:
更改代码的顺序,首先开始用户事务,然后从数据存储区获取连接(如Pascal Thivent所指出的那样)。
将“jdbc / xxxxx / DataSource”引用的数据源更改为XADatasource。这是因为我在用户事务中调用了代码,该代码使用了另一个已经配置为支持LLR的数据源,并且如下面的Pascal Thivent所指出的,只能有一个LLR数据源参与转换。
我接受了Pascal Thivent的回答,因为它解释了这两个问题。
答案 0 :(得分:2)
是的,您的假设是正确的,并且根据Create LLR-enabled JDBC data sources,您的数据源似乎已正确配置。
启动用户交易后,您是否获得了连接?你能展示你的代码还是伪代码?
更新:正如Programming Considerations and Limitations for LLR Data Sources中所述:
- 使用LLR数据源编程时,必须在LLR数据源上调用getConnection之前启动全局事务。如果在启动全局事务之前调用getConnection,则连接上的所有操作都将在全局事务之外进行。
那么,你可以试试这个:
transaction.begin(); //start the global tx before calling getConnection()
conn = dataSource.getConnection();
...
transaction.commit();
UPDATE2:不确定第二个连接的来源(您的伪代码未显示此内容)。但是,根据相同的Programming Considerations and Limitations for LLR Data Sources:
- 只有单个LLR数据源的实例可以参与特定事务。单个LLR数据源可能在多个WebLogic服务器上具有实例,并且如果两个数据源具有相同的配置名称,则认为它们是相同的。如果检测到多个LLR数据源实例且它们不是同一数据源的实例,则事务管理器将回滚该事务。
实际上,如果没有一个完全有代表性的例子,我觉得有点像在黑暗中行走:)