Java 在EJB3(SLSB)中处理JDBC连接的正确方法
我特别针对无状态会话Bean提出这个问题。我知道我可以轻松地将Java 在EJB3(SLSB)中处理JDBC连接的正确方法,java,jdbc,ejb,Java,Jdbc,Ejb,我特别针对无状态会话Bean提出这个问题。我知道我可以轻松地将@Resource注释注入数据源。但是我不知道什么是获得连接的正确方法。它是在bean的每个方法中,还是在用@PostConstruct注释的方法中?也用于关闭连接。我必须在每个方法调用的finally块中关闭它,还是在用@PreDestroy注释的方法中关闭它 为连接创建实例变量是否安全,例如: @Stateless public class MyBean { @Resource private DataSource ds;
@Resource
注释注入数据源。但是我不知道什么是获得连接的正确方法。它是在bean的每个方法中,还是在用@PostConstruct
注释的方法中?也用于关闭连接
。我必须在每个方法调用的finally块中关闭它,还是在用@PreDestroy
注释的方法中关闭它
为连接创建实例变量是否安全,例如:
@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池时,连接是保持打开状态还是返回到数据库池
注意:应用程序使用本机JDBCAPI。没有JPA、JDO等。。应用服务器是Wildfly。TL;博士
第二种方法是正确的。只需确保关闭连接即可将其返回到池中
@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();
}
}
}
数据源是一个连接池,每次您获得连接时,它都会从数据源借用一个连接,当您关闭该连接时,它将返回到连接池,因此您总是希望尽快释放连接
在第一种方法中,只要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();
}
}
}