以前、Tomcatでデータソースを定義する方法をブログにまとめました。
Tomcatでデータソースを設定する方法 - ITエンジニアの成長ブログ
Tomcatでデータソースを定義する方法を調べる中で、「GlobalNamingResources」というコンポーネントを見つけました。どうやらこのコンポーネントでもデータソースを定義することができるらしいので、今回は「GlobalNamingResources」を使ってデータソースを定義したいと思います。
Tomcatのバージョンは古いですが「8.0.47」で検証します。本記事の中で「前回」と言及しているのは、冒頭で紹介した「Tomcatでデータソースを設定する方法」の記事のことです。
GlobalNamingResourcesコンポーネントとは?
名前の通り、グローバルなJNDIリソースを定義することができるものです。サーバー全体で使用するようなJDNIリソースがある場合に、この「GlobalNamingResources」コンポーネント使うと、JNDIリソースの定義を分かりやすく整理することができます。
説明はこんなもので、以下から実際に定義して使ってみます。
server.xmlの修正
「GlobalNamingResources」コンポーネントは、Serverのネストコンポーネントなので、Serverが定義してあるserver.xmlで設定します。
私の環境では、既にGlobalNamingResourcesが定義されていました。
そのため、以下のようにデータソース用のResourceタグを既存の部分に追記します。Resourceタグの"UserDatabase"はデフォルトで定義されていたものなので、今回は関係ありません。追記したのはその下のResourceタグの"global/jdbc/myds"です。これは、前回context.xmlに記載していたものをほぼコピーして記載したイメージになります。
<GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> <Resource name="global/jdbc/myds" auth="Container" type="javax.sql.DataSource" username="taro" password="taro" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost;databaseName=db1;encrypt=false" /> </GlobalNamingResources>
server.xmlの修正はこれで終わりです。
context.xmlの修正
次は、データソースを使用する側のWebアプリケーションのcontext.xmlを修正します。Resourceタグではなく、ResourceLinkタグを使用します。
<?xml version="1.0" encoding="UTF-8"?> <Context> <ResourceLink name="jdbc/myds" global="global/jdbc/myds" type="javax.sql.DataSource" /> </Context>
ポイントは、global属性でGlobalNamingResourcesに追加したリソースの名前を指定しているところです。name属性には、今まで通りJavaプログラムからlookupするために指定する名前を指定します。
データソースを取得するJavaのプログラム
前回記載したものと同じなので、Javaのプログラムの全体は省略します。
重要なところを抜粋すると、もちろん以下のlookupメソッドの引数の部分です。「java:comp/env/」は固定で、その後ろはResourceLink要素で指定したname属性の値を指定します。global属性の値ではないのでお気をつけください。
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/myds");
使いどころ
さて、実際にGlobalNamingResourcesを使ってデータソースを定義することができましたが使いどころはどうでしょうか。
これは単純に、複数のWebアプリケーションで同じデータソースを使用する場合は、「GlobalNamingResources」を使った方が良さそうです。なぜならば、GlobalNamingResourcesにデータソースの定義をすることで、各Webアプリケーションで重複した定義をする必要がなくなります。各Webアプリケーションでは、GlobalNamingResourcesを参照するためにResoureLinkを定義するのみです。
逆にデータソースを利用するのが、1つのWebアプリケーションのみの場合はあまりGlobalNamingResourcesを使う必要はないかもしれません。前回定義した通り、Webアプリケーション配下のcontext.xmlで定義するのが良さそうです。
おわりに
いかがでしょうか。GlobalNamingResourcesというコンポーネントを知らなかったので試してみました。いずれ使えるタイミングがあるかもしれないので、頭の片隅に入れておこうと思います。
今回はこの辺で。最後までお読みいただきありがとうございました。