luc*_*web 5 java weblogic transactions jdbc weblogic-10.x
我目前正在使用JNDI从Weblogic 10.3服务器检索UserTransaction和DataSource.
我已将数据源设置为"支持全局事务"并使用"记录上一个资源"
我希望通过开始UserTranscation然后从Datasource检索JDBC连接,连接将参与Transaction.
这似乎不是这种情况,我的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
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新2:
为了解决这个问题,我必须做两件事:
更改代码的顺序,首先开始用户事务,然后从数据存储区获取连接(如Pascal Thivent所指出的).
将"jdbc/xxxxx/DataSource"引用的数据源更改为XADatasource.这是因为我在用户事务中调用了代码,该代码使用了另一个已经配置为支持LLR的数据源,并且如下面的Pascal Thivent所指出的,只能有一个LLR数据源参与转换.
我接受了Pascal Thivent的答案,因为它解释了这两个问题.
是的,您的假设是正确的,并且根据创建支持 LLR 的 JDBC 数据源,您的数据源似乎配置正确。
启动用户事务后是否获得连接?你能展示你的代码或伪代码吗?
更新:如LLR 数据源的编程注意事项和限制中所述:
- 使用 LLR 数据源进行编程时,必须在对 LLR 数据源调用 getConnection 之前启动全局事务。如果在启动全局事务之前调用 getConnection,则连接上的所有操作都将在全局事务之外进行。
那么,你可以尝试一下这个:
transaction.begin(); //start the global tx before calling getConnection()
conn = dataSource.getConnection();
...
transaction.commit();
Run Code Online (Sandbox Code Playgroud)
UPDATE2:不确定从哪里开始第二个连接(您的伪代码没有显示这一点)。但是,根据LLR 数据源的相同编程注意事项和限制:
- 只有单个 LLR 数据源的实例可以参与特定事务。单个 LLR 数据源可能在多个 WebLogic 服务器上有实例,如果两个数据源具有相同的配置名称,则认为它们是相同的。如果检测到多个 LLR 数据源实例,并且它们不是同一数据源的实例,则事务管理器将回滚该事务。
其实,如果没有一个完全有代表性的例子,我感觉有点像在黑暗中行走:)
| 归档时间: |
|
| 查看次数: |
19925 次 |
| 最近记录: |