2016-04-27 6 views
1

私はこのステートレスセッションBeanについて特にこの質問をします。 DataSource@Resource注釈を簡単に挿入できることはわかっていました。しかし、私はConnectionを入手する適切な方法は何か分かりません。それは、Beanの各メソッド、または@PostConstructで注釈付けされたメソッドにありますか?また、Connectionの閉鎖のために。各メソッド呼び出しのfinallyブロック内で閉じるか、@PreDestroyで注釈を付けたメソッドで閉じる必要がありますか?EJB 3(SLSB)でJDBC接続を適切に処理する方法

には、例えば、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です。

答えて

2

TL; DR 2番目の方法は正しい方法です。接続を閉じてプールに戻すようにしてください。

データソースは接続プールです。接続するたびにデータソースからデータソースを借りて、その接続を閉じるとプールに戻されるため、いつでもすぐに接続を解除することができます。可能。

最初のアプローチでは、EJBがメモリ内に存在する限り、接続を維持します。 EJBはステートレスBeanであるため、長い間生存し、別の消費者によって再利用されます。生きているEJBごとに少なくとも1つの接続をオープンにするようにしてください。したがって、このアプローチは実用的ではありません。

第2のアプローチは正しいものです。接続を閉じてプールに戻すようにしてください。この方法では、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(); 
    } 
    } 
} 
関連する問題