如何获得JDBC连接从JNDI数据源获得参加一个UserTransaction使用任何10.3?
-
20-09-2019 - |
题
我目前检索这两个UserTransaction和一个数据源自任何10.3服务器使用JNDI。
我已经设置了数据源,以支持全球交易',并使用记录最后的资源'
我的希望是,通过开始一个UserTranscation并随后检索JDBC连接的数据库连接参与的事务。
这似乎不是这种情况下,插入我的发言,正在致力于直接和回滚事务不具有任何效果。
是我上面的假设是否正确?
任何人都可以指给我方向的某些文件或样本关于如何实现这一目标?
许多在此先感谢
更新:
作为请求的这是骨架大纲的代码,我在使用:
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:
为了解决这个问题我不得不这样做,2件事:
改变了代码首先开始的用户的交易,然后得到一个连接的数据库(如指出的,由帕斯卡尔Thivent).
变化的数据库所引用的'"jdbc/xxxxx/数据源"'到XADatasource.这是因为我打电话代码用户的交易,使用另一种数据源,已经配置,以支持LLR并指出,由帕斯卡尔Thivent下你只能有一个LLR数据源参加一个交易.
我已经接受Pascal Thivent的回答以下,因为它解释了这两个问题。
解决方案
是的,你的假设是正确的,并根据 创建LLR启用JDBC数据来源, ,您的数据来源似乎是适当配置。
做你的连接启动后用户的交易?你可以展示你的代码或伪代码?
更新: 如前所在 编程的考虑因素和限制LLR数据来源:
- 当编程与LLR数据来源,则必须启动的全球交易之前的呼叫块上LLR数据来源。如果你打电话块之前开始的全球事务,所有操作上的连接将由外部全球事务。
所以你能试试这个:
transaction.begin(); //start the global tx before calling getConnection()
conn = dataSource.getConnection();
...
transaction.commit();
UPDATE2: 不一定要理解其中的第2连接在(你的伪代码并不表示此)。然而,根据相同的 编程的考虑因素和限制LLR数据来源:
- 只有实例中的一个单一的LLR数据来源可能参与在一个特定的交易。一个单一的LLR数据来源可以具有实例在多个任何服务器和两个数据来源被认为是相同的,如果他们有同样的配置的名称。如果多于一个LLR数据来源的实例是检测到的和它们不是情况相同数据来源,事务管理会滚回的交易。
实际上,没有一个有充分代表性的例子,我感觉有点像是行走在黑暗:)
不隶属于 StackOverflow