Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在事务mysql中创建另一个连接_Java_Jdbc_Transactions - Fatal编程技术网

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

Java 在事务mysql中创建另一个连接,java,jdbc,transactions,Java,Jdbc,Transactions,我想知道是否有可能在一个事务中创建两个不同的连接,因此假设有此代码(我在表“employe”中执行创建操作,在表“log”中创建日志): 这是方法LOGStatic.createLog(“createemploye”) public static void creaLogException(String messaggio) { Connection connection_db= null; InitialContext initialContext;

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

这是方法
LOGStatic.createLog(“createemploye”)

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) {

        }
我的问题是,是否可能出现这种行为,并且提交和回滚操作没有问题,或者不可能有其他连接?
任何人都可以提供帮助,至少在JDBC中,事务与连接紧密耦合

在JavaEE服务器中,如果您正在编写会话bean,那么事务将由我的服务器管理。因此,在这种情况下,您可以调用多个方法,事务将跟随方法调用

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

但是,要非常小心,不关闭连接几乎是解决OutOfMemoryError的可靠方法

(您可以使用ThreadLocal,而不是将连接作为输入参数传递给各种方法。但如果不清除ThreadLocal变量,这是另一个内存泄漏源。)

有关事务生命周期和连接如何在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) {

    }
}
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) {

    }
}