Java 在EJB3(SLSB)中处理JDBC连接的正确方法

Java 在EJB3(SLSB)中处理JDBC连接的正确方法,java,jdbc,ejb,Java,Jdbc,Ejb,我特别针对无状态会话Bean提出这个问题。我知道我可以轻松地将@Resource注释注入数据源。但是我不知道什么是获得连接的正确方法。它是在bean的每个方法中,还是在用@PostConstruct注释的方法中?也用于关闭连接。我必须在每个方法调用的finally块中关闭它,还是在用@PreDestroy注释的方法中关闭它 为连接创建实例变量是否安全,例如: @Stateless public class MyBean { @Resource private DataSource ds;

我特别针对无状态会话Bean提出这个问题。我知道我可以轻松地将
@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();
    }
  }
}