Java 在事务mysql中创建另一个连接
我想知道是否有可能在一个事务中创建两个不同的连接,因此假设有此代码(我在表“employe”中执行创建操作,在表“log”中创建日志): 这是方法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;
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) {
}
}