在事务mysql中创建另一个连接

时间:2018-07-25 12:59:21

标签: java jdbc transactions

我想知道是否可以在一个事务中创建两个连接不同的连接,所以假设有此代码(我在表“ employe”中执行创建操作,并在表“ log”中创建日志):

    try {
        InitialContext initialContext = new InitialContext();
                    DataSource datasource = (DataSource) initialContext.lookup("java:/comp/env/jdbc/postgres");

                    Connection connection_db= datasource.getConnection();
                    PreparateStatement p1 //Preparate statement to put the employe parameter

                    connessione_db.setAutoCommit(false);
                    connessione_db.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
                p1.execute();
                //This create another connect 
                LOGStatic.createLog("CREATE EMPLOYE");             

                connessione_db.commit();
                connessione_db.setAutoCommit(true);
         }catch(....){
                   connection_db.rollback();
        }

这是方法LOGStatic.createLog("CREATE EMPLOYE");

public static void creaLogException(String messaggio) {
        Connection connection_db= null;

        InitialContext initialContext;
        try {
            initialContext = new InitialContext();
            DataSource datasource = (DataSource) initialContext.lookup("java:/comp/env/jdbc/postgres");

            connection_db= datasource.getConnection();
            // the code continues with the save operation

        } catch (NamingException n) {

        }
        // actual jndi name is "jdbc/postgres"
        catch (SQLException s) {

        }

我的问题是,是否可能出现这种情况,并且提交和回滚操作没有问题,或者无法建立另一个连接? 任何人都可以帮助

1 个答案:

答案 0 :(得分:2)

至少在JDBC中,事务与Connection紧密耦合。

在Java EE服务器中,如果要编写会话Bean,则将在服务器中管理事务。因此,在这种情况下,您可以调用多个方法,并且事务将遵循方法调用。

在JDBC中,简单的解决方案是不关闭连接,而是将其作为输入参数传递给不同的方法。

但是,要非常小心,不关闭连接几乎是进入OutOfMemoryError的肯定方法。

(代替使用连接作为各种方法的输入参数,可以使用ThreadLocal。但这是内存泄漏的另一个来源,如果不清理ThreadLocal变量。)

有关如何在JDBC中将事务生命周期和Connection绑定在一起的更多信息,请参考:How to start a transaction in JDBC?

注意:即使在JavaEE中,嵌套事务也是不可能的,因为JTA不支持嵌套事务。

传递连接:

public static void createEmployee(){
    InitialContext initialContext = new InitialContext();
    DataSource datasource = (DataSource) initialContext.lookup("java:/comp/env/jdbc/postgres");
    Connection connection_db= datasource.getConnection();
    try {
        connessione_db.setAutoCommit(false);
        connessione_db.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

        PreparateStatement p1 //Preparate statement to put the employe parameter
        p1.execute();
        //This create another connect 
        createLog("CREATE EMPLOYE", connessione_db);             

        connessione_db.commit();
        //connessione_db.setAutoCommit(true); //No need
    }catch(....){
        try{ connection_db.rollback(); }catch(Exception e){ /*You can also check some flags to avoid exception*/ }
    }finally{
        try{ connection_db.close(); }catch(Exception e){ /*Safe to ignore*/ }
    }
}

public static void createLog(String messaggio, Connection connection_db) {
    try {
        // the code continues with the save operation

    } catch (SQLException s) {

    }
}