我想知道是否可以在一个事务中创建两个连接不同的连接,所以假设有此代码(我在表“ 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) {
}
我的问题是,是否可能出现这种情况,并且提交和回滚操作没有问题,或者无法建立另一个连接? 任何人都可以帮助
答案 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) {
}
}