2016-04-27 64 views
1

我特別問無類型會話Bean這個問題。我知道我可以很容易地注入DataSource@Resource註釋。但我不知道什麼是得到Connection的正確方法。它是在豆的每種方法中還是在用@PostConstruct註釋的方法中?並且還用於關閉Connection。是否必須在每個方法調用的finally塊中關閉它,還是在用@PreDestroy註釋的方法中關閉它?在EJB 3(SLSB)中處理JDBC連接的正確方法

是否安全,創建一個實例變量的Connection,例如:

@Stateless 
public class MyBean { 
    @Resource private DataSource ds; 
    private Connection conn; 

    @PostConstruct 
    public void onCreate() { 
     conn = ds.getConnection(); // within try catch block 
    } 

    @PreDestroy 
    public void onDestroy() { 
     conn.close() // within try catch block 
    } 
} 

或者我應該在每個方法本地創建他們是這樣的:在互聯網

@Stateless 
public class MyBean { 
    @Resource private DataSource ds; 

    public void method1() { 
     Connection conn = null; 
     // get and close connection... 
    } 

    public void method2() { 
     Connection conn = null; 
     // get and close connection... 
    } 
} 

有人這樣做,其他一些做這種方式。在具有高請求流量的應用程序中實施的正確方法是什麼?當bean實例返回到EJB池時,Connection保持打開狀態還是返回到數據庫池?

注意:該應用程序正在使用本機JDBC API。沒有JPA,JDO等。應用程序服務器是Wildfly。

回答

2

TL; DR 第二種方法是正確的。只要確保關閉連接將其返回到池。

數據源是一個連接池,每次獲得連接時,它都會從數據源中借用一個連接,並且當您關閉該連接時,它將返回到池中,因此您將始終希望儘快釋放連接可能。

在第一種方法中,只要EJB駐留在內存中,您將保持連接。由於EJB是一個無狀態bean,因此它將長期存在並被不同的消費者重用。使每個EJB至少有一個連接打開,因此這種方法不切合實際。

第二種方法是正確的。只要確保關閉連接將其返回到池。通過這種方法,Bean只會在使用時保留連接。只要確保關閉連接將其返回到池。

@Stateless 
public class MyBean { 
    @Resource private DataSource ds; 

    public void method1() { 
    try(Connection conn = ds.getConnection()){ 
     // Do anything you need with the connection 
    } 
    } 

    public void method2() { 
    Connection conn = ds.getConnection(); 
    try { 
     // Do anything you need with the connection 
    } finally { 
     connection.close(); 
    } 
    } 
} 
相關問題