gpt4 book ai didi

java - 在 EJB 3 (SLSB) 中处理 JDBC 连接的正确方法

转载 作者:行者123 更新时间:2023-11-30 02:57:18 28 4
gpt4 key购买 nike

我特别针对无状态 session Bean 问这个问题。我知道我可以轻松地使用 @Resource 注释注入(inject) DataSource 。但我不知道获取Connection的正确方法是什么。是在bean的每个方法中,还是在用@PostConstruct注释的方法中?也用于关闭连接。我是否必须在每个方法调用的finally block 中关闭它,或者在用@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 是保持打开状态还是返回到数据库池?

注意:该应用程序正在使用 native JDBC API。没有JPA、JDO等。应用服务器是Wildfly。

最佳答案

TL;博士第二种方法是正确的。只需确保关闭连接即可将其返回到池中。

数据源是一个连接池,每次获得连接时,它都会从数据源借用一个连接,当您关闭该连接时,它将返回到池中,因此您总是希望尽快释放连接。

在第一种方法中,只要 EJB 存在于内存中,您就将保留连接。由于 EJB 是无状态 bean,因此它将长期存在并被不同的使用者重用。让每个处于 Activity 状态的 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();
}
}
}

关于java - 在 EJB 3 (SLSB) 中处理 JDBC 连接的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36880294/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com