![](/img/trans.png)
[英]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.