java - WLS - 如何处理交易

标签 java plsql transactions weblogic12c jta

我正在使用 Weblogic 服务器,其中连接对象正在处理一个事务,其中同一个连接实例尝试使用不同的事务,然后现有事务无法完成并抛出事务错误,其中现有事务正在执行任何提交/回滚操作,而新事务还使用来自使用相同连接对象的多个过程的提交/回滚操作。那么有没有办法使用相同的连接对象来处理特定事务的 session (如果它完成),然后对于新事务,新 session 应该启动以避免此错误

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)尝试使用相同连接的单个进程,则会发生此事务错误。是否有任何方法可以使用相同的连接对象而不发生事务失败,而不是每次都获取新连接,请建议。

最佳答案

"I have 15 store procedure calls and using some DML/DDLs too ... where from store procedure there are commit operation are happening "

这似乎是您问题的症结所在。工作单元应该是单个事务。然而,您的架构似乎从多个事务中构建了一个工作单元(在数据库领域中,事务是提交之间的 Activity )。

至少您需要使用 API 来装饰数据库层,其中工作单元是单个存储过程。该存储过程可以调用所有存储过程并执行所有必需的 DML,但您有一个在一个 session 中执行的数据库调用。完成此操作后,您可以开始从较低级别的过程中删除提交,并将事务管理放在它所属的位置:调用堆栈的顶部。

关于java - WLS - 如何处理交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44732926/

相关文章:

java - thymeleaf 中对 @OneToMeny 和 @ManyToOne 类的无尽 hibernate 查询

Java 一系列数字的平均值

sql - 在 sqlplus 中访问绑定(bind)变量

oracle - 一个表字段上的触发器适用于所有表字段

java - @Transactional 在 REST 层还是在服务层?哪个更好?

java - 我的 Android 应用程序在 10 次尝试后崩溃

java - 通过 HashMap 进行迭代(复杂性)

firebase云功能事务偶尔工作

oracle - 几个Oracle Pl/SQL 包的编译可以是一个原子操作吗?

c# - 链接的Oracle服务器之间的SQL Server和WCF事务