2011-01-26 15 views
5

Tomcatサーバー上でJava Webアプリケーションを使用していますが、TomcatのJNDIからデータベース接続にアクセスする際の「ベストプラクティス」は何ですか?Tomcat内のJNDIデータソースを適切に呼び出す方法

現在、これは私がデータベースにアクセスする必要があるたびにやって何を基本的には次のとおりです。

Context envContext = null; 
DataSource dataSource = null; 
try { 
    envContext = (Context)ctx.lookup("java:/comp/env"); 
    dataSource = (DataSource)envContext.lookup("jdbc/datasource"); 
    return dataSource.getConnection(); 
} catch (Exception e){ 
    e.printStackTrace(); 
    return null; 
}finally { 
    if(envContext != null){ 
     try{ 
      envContext.close(); 
     } catch (NamingException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

しかし、これは私がデータベースにアクセスするたびに、JNDIから接続を検索する適切な方法であります?代わりにContextまたはDatasourceへの参照を保持する必要がありますか?

答えて

3

JNDIルックアップは、基本的にルックアップの地図います。しかし、DataSourceを一度取得して「キャッシュ」することが望ましいです。つまり、DataSourceを返すメソッドを書くことは、あまりにも多くのコードをJ2EE内部にバインドしてコードをテストしやすくするために理想的です。

+0

私が探していた答えとまったく同じです、ありがとうございました。もう1つの質問ですが、データアクセスを行うたびに新しいContextを作成する際のオーバーヘッドはありますか? – Avanst

+0

相対的に言えば - 私はそう信じていません。しかし、それをbechmarkedし、毎回Contextを作成しただけでは、データソースをキャッシュしているだけであれば、違いがあると思うでしょう。しかし、実質的に言えば、データソース(またはコンテキスト)を取得する回数は、リクエストを処理する残りのアクティビティと比較して最小限です。 –

+3

JNDIルックアップは高価ではありません。すべてのアプリケーションコンテナで 'InitialContext'ルックアップは**非常に高価です**。アプリケーションの起動時に一度だけ行う必要があります。ほとんどの人は違いを知らない。 –

1

ルックアップコードが正常に表示される
問題のコンテキストでは、実際の接続オブジェクトをキャッシュしていない限り、データソースをキャッシュするのは問題ありません。

私はしばらくこのアプローチを使用していません。最近では、最低でも、私はあなたがあまりにもこのような何かを行うことができJdbcTemplate

+0

ええ、通常、私は単に休止状態のようなサードパーティ製のユーティリティを使用しますが、これはまっすぐなJavaのほかに何も使用できません。 – Avanst

2

を初期化/データソースを注入するためのバネを使用します - 彼らのオーバーヘッドが最小限になるよう

... 

Context initContext = new InitialContext(); 
DataSource dataSource = (DataSource) initContext.lookup("java:comp/env/jdbc/datasource"); 

... 
4

new InitialContext()はすべてのアプリケーションコンテナで高価ですが、それはstatic finalであり、static {}ブロックで作成され、効果的にSingletonになります。このリファレンスは一度作成して、必要なときに再利用してください。

DataSourceは、staticである必要があります。 Connectionオブジェクトを取得するには、public static Connection getConnection();メソッドが必要です。コードでは、DataSourceを直接処理する必要はありません。これは特にPooledDataSourceの実装でうまくいきます。

+0

なぜ高価なのですか?多くのことを行う必要はなく、具体的にはネットワークI/Oを行う必要はありませんか?私はこれが都市の神話だと思う。 – EJP

+0

@EJP都市の神話ではなく、「先導」開発者の一人(VB担当者)がServletsを書いていて、毎回リクエストごとに新しいInitialContext()を作成していた契約を結んでいました。それぞれのリクエストにはほぼ1分かかりました。彼はJavaがいかに遅いか、blah、blah、blahについて悲しんだ。私は彼のコードを見直し、その1行を 'private static final'とブームに動かしました。要求は「数百ミリ秒」の範囲であった。これはWebLogicの非常に初期のバージョンなので、現在はムーアの法則のために悪くないかもしれません。しかし、私はこの回答を2011年3月に書いたとき、再現可能な問題でした。 –

+0

あなたは私の質問に答えていません。 *なぜそれは高価なのですか?そして、別の場所からあなたを引用すると、[えにん:あなたの経験は普遍的ではありません](https://blog.mozilla。org/nnethercote/2014/01/02/yeinu-your-experience-is-not-universal /)を使用してください。実際に「すべてのアプリケーションコンテナ」をテストしましたか?それがなければ、あなたの答えは根拠がありません。そして、 '' InitialContext' * lookups *は** VERY EXPENSIVE ** 'の上のあなたのコメントでは、 ''新しいInitialContext() 'は高価ですか?あなたの心を作りなさい。 – EJP

関連する問題