[英]What is the proper way to handle login errors in Sybase, from a JDBC connection?
[英]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.