2015-11-11 18 views
2

我們在Glassfish中使用無狀態會話bean。我有以下問題。我們的方法默認支持事務,也就是說,事務從業務方法起點開始,並在出口點提交(或回滾)。因此,讓我們假設我有這樣的代碼:在事務修復之前,連接返回到池會發生什麼?

public void businessMethod() { 
    Connection conn; 
    try { 
    conn = getConnectionFromPool(); 
    // Do some queries to the database 
    } finally { 
    if (conn != null) conn.close(); // Line A 
     // Line B 
    } 
} 

所以會發生什麼,在A線是我不要隨便關閉連接,它只是返回到連接池,但該方法的事務未提交然而。只有在B行完成後才能完成。但是由於連接返回到池中,這意味着在此方法提交(或回滾)之前,其他人可以使用相同的連接啓動事務。

那麼接下來會發生什麼?一個池中的連接是否對其他人不可用,直到該方法完成該事務爲止?或者第二筆交易是否會阻止,直到第一筆交易結束?我使用MySQL作爲數據庫。

我一定要關閉這樣的連接,否則就不會返回到池中。但是,如何將它與事務性方法結合起來,以便我不直接指定事務邊界?

+1

您開始提出問題,詢問機制如何工作的一般問題,但是您的最後一段意味着您遇到某種需要知道其工作原理的問題。爲什麼您的應用程序對應用程序服務器的連接池是如何工作的?你是什​​麼意思「將它與事務性方法結合起來」(使用EJB時​​沒有其他選擇)? –

回答

0

無論您是否使用連接池,您都應該始終關閉所有資源。

您可以在try塊的finally塊中執行此操作,也可以使用try-with-resources語句從Java 7開始。

試穿與資源

try(Connection con = getConnection(url, username, password, "org.postgresql.Driver"); 
    Statement stmt = con.createStatement(); 
    ResultSet rs = stmt.executeQuery(sql); 
    ) { 

    //statements 

}catch(....) {} 

這樣的連接,聲明和ResultSet對象將在使用後會自動關閉。

即使您沒有關閉連接,所有交易仍將被提交。

相關問題