【发布时间】:2017-06-24 05:00:19
【问题描述】:
我正在使用 Weblogic 服务器,其中连接对象正在处理一个事务,其中同一个连接实例尝试使用不同的事务,然后现有事务无法完成并引发事务错误,其中现有事务正在执行任何提交/回滚操作并且新事务还使用来自多个使用相同连接对象的过程的提交/回滚操作。那么有什么方法可以使用相同的连接对象来处理特定事务的会话,如果它完成,然后对于新事务,新会话应该开始以避免这个错误
static {
Context ctx = null;
Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL, "t3://localhost:7001");
LOGGER.debug("con outside " + conn);
ResultSet rs = null;
try {
ctx = new InitialContext(ht);
javax.sql.DataSource ds
= (javax.sql.DataSource) ctx.lookup("jndi/mynonXADatasource");
// UserTransaction tx = (UserTransaction) ctx.lookup("javax.transaction.UserTransaction");
tx.begin();
conn = ds.getConnection();
conn.setAutoCommit(false);
} catch (SQLException e) {
LOGGER.error(e.getMessage());
} catch (Exception e) {
LOGGER.error(e.getMessage());
}
}
public static Connection getdatasourceconnection() {
try {
if (null == conn || conn.isClosed()) {
LOGGER.debug("Getting new Connection");
conn = getNewConnection();
return conn;
}
conn = obtainConnection();
} catch (SQLException e) {
}
return conn;
}
private static Connection getNewConnection() {
Context ctx = null;
Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL, "t3://localhost:7001");
LOGGER.debug("con outside " + conn);
Connection oraConn; oraConn = null;
try {
ctx = new InitialContext(ht);
javax.sql.DataSource ds
= (javax.sql.DataSource) ctx.lookup("jndi/mynonXADatasource");
//UserTransaction userTransaction=(UserTransaction)ctx.lookup ("jndi/mynonXADatasource");
conn = ds.getConnection();
conn.setAutoCommit(false);
LOGGER.debug("con inside " + conn);
LOGGER.debug("context " + ctx);
} catch (SQLException e) {
LOGGER.error(e.getMessage());
} catch (Exception e) {
LOGGER.error(e.getMessage());
}
return conn;
}
public static void closeConnection(Connection conn) {
try {
if (null != conn) {
conn.close();
conn = null;
}
} catch (SQLException ex) {
LOGGER.error(ex.getMessage());
}
}
我有 15 个存储过程调用,并且也使用了一些 DML/DDL,如果我尝试使用相同的连接对象,我得到的事务处于准备阶段/已提交,就像这样,从存储过程发生提交操作,如果处理单个进程需要时间,其中另一个进程(JMS)尝试使用相同的连接,这个事务错误正在发生。有没有办法在没有事务失败的情况下使用相同的连接对象,而不是每次都获取新的连接请建议。
【问题讨论】:
-
请在问题中包含您的代码。比当前描述更好的描述。
-
我已经添加了我的代码和下面的问题描述
标签: java plsql transactions weblogic12c jta