1

thisなどの評判の高いユーザーからの回答を見ると、単一の接続要求ごとにJNDIネーミングサービスを照会して新しいDataSourceオブジェクトを取得するのが適切なようです。例えば。 (より簡潔にするためにリンクの答えから適応)は、次のようなコードで:すべての接続でJNDIから新しいデータソースを取得する必要がありますか?

public class ConnectionManager{ 
     public static Connection getConnection() throws NamingException { 
      Context initContext = new InitialContext(); 
      Context envContext = (Context)initContext.lookup("java:/comp/env"); 
      DataSource dataSource = (DataSource)envContext.lookup("jdbc/test"); 
      return dataSource.getConnection(); 
     } 
} 

は、実際に提案/慣用的な方法このですか?私自身の "ConnectionManager" utiltyクラスの中には、DataSourceオブジェクトへの参照をインスタンス変数として保持するために使用したものがありました。何も間違っては、JBossの管理者が無効にする場合を除いて、それから出てきていないと、管理コンソールから接続プールを有効にして、私のコードは次のようなエラーを得ていた。

java.sql.SQLException: javax.resource.ResourceException: IJ000451: The connection manager is shutdown 

だから、周りに保つためにアンチパターンでありますJDBCのDataSourceオブジェクトのインスタンス?

答えて

1

DataSourceオブジェクトはキャッシュでき、スレッドセーフですが、JNDIはJNDIからDSをJNDIからすべて取り出すことはほとんど無視できます(同じインスタンスはJNDIから返されます)。

あなたは例のJava EE環境で作業している場合、それはのような、クラスレベルでデータソースを注入できるようにする仕様の標準です:

public class MyServlet extends HttpServlet { 

    @Resource 
    DataSource ds; 

    public void processRequest() { 
    try(Connection con = ds.getConnection()) { 
     // ... 
    } 
    } 

} 

また、データソースを共有するために完全に安全です複数のスレッドにまたがるオブジェクト一方、複数のスレッド間でオブジェクトConnectionを共有することは、スペックごとにスレッドセーフではないため、大きな間違いです。

関連する問題