簡體   English   中英

處理EJB 3(SLSB)中JDBC連接的正確方法

[英]Proper way to handle JDBC connection in EJB 3 (SLSB)

我問這個問題,特別是對於無狀態會話Bean。 我知道我可以輕松地使用@Resource注釋注入DataSource 但是我不知道獲得Connection的正確方法是什么。 是在bean的每個方法中,還是在@PostConstruct注釋的方法中? 並且也用於Connection的關閉。 我是否必須在每個方法調用中的finally塊中或在@PreDestroy注釋的方法中將其關閉?

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。

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

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

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

第二種方法是正確的。 只需確保關閉連接以將其返回到池即可。 通過這種方法,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();
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM