リソース挿入付きの複数のサーブレットでデータソースを使用する
-
02-01-2020 - |
質問
私は複数のサーブレットで使用したいjavax.sql.DataSource
を持っています。私は指定するという考えが好きではありません:
@Resource(name="live-connection", lookup="java:/live-connection", description="Live DB Connection")
private DataSource liveDataSource_;
.
すべてのサーブレットでは、フレームワークがサーブレットごとにデータソースを検索しなければならず、データソースの名前が変更されている場合は、すべてのサーブレットも変更する必要があります。
私の考えは、各サーブレットで宣言できるシングルトンEJBを宣言することです。
@Startup
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class DataSources {
@Resource(name="live-connection", lookup="java:/live-connection", description="Live DB Connection")
private DataSource liveDataSource_;
public synchronized Connection getLiveConnection() throws SQLException {
return liveDataSource_.getConnection();
}
}
.
これは問題を解決する合理的な方法ですか?私はそれが私が考えたことがあるだろうことのための少し重いものだと思います。
解決
一般的にはOK IMOです。 ただし、Beanに接続を返しますが、直接データソースにはできません。 Beanコンテキストが再度送信されたときにWebSphereのようないくつかのAppServerは自動的に接続を閉じます。
他の解決策は、ルックアップの代わりに@Resource(name="myds")を使用することです。 すべてのサーブレットが1つのWebアプリケーションにある場合は、web.xmlにRes-Ref-Name MyDSを使用して1つのリソースREFを定義し、その場所でのみ実際のルックアップ名に解決できます。
他のヒント
その理由のためにのみEJBを使用していると言っています。
最新のアプリケーションサーバーの最初のほとんどは、そのルックアップをキャッシュし、それがその費用がかかりません。
second - Robertとして@resource(name="myds")を使用すると、アプリケーションサーバーのマッピング機能を使用してJNDI名にマップできるものと同じリソース参照を使用できます。
3 - CDIを使用して、このようなWebモジュールのみのソリューションを持つことができます。
データソース定義を保持するクラスの作成:
public class Datasources {
@Produces @Resource(name="jdbc/yourRef", lookup="yourJNDI")
DataSource myDataSource;
}
.
INJECT:
を使用してITサーブレットを使用します。public class MyServlet extends HttpServlet {
@Inject
private DataSource myDs;
.