繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM