The Java EE 7 Tutorialの3 Resource Creationの章をテキトーに訳した。
これといって目新しいことはイマサラ書いてないけれども。
3 Resource Creation
リソース(Resource)とは、データベースサーバやメッセージングシステムなどへのシステム接続を行うプログラム上のオブジェクトのことです。Java EEコンポーネントは様々なリソースにアクセス可能で、リソースには、データベース・メールセッション・ Java Message Serviceオブジェクト・URL、が含まれます。Java EE 7プラットフォームは、同様な方法でそうしたリソースにアクセスするためのメカニズムを提供します。この章ではリソースのいくつかと、それらを作成する方法を説明します。
この章では以下のトピックを扱います。
- Resources and JNDI Naming
- DataSource Objects and Connection Pools
- Creating Resources Administratively
3.1 Resources and JNDI Naming
分散アプリケーションでは、コンポーネントは、データベースなどの別のコンポーネントやリソースにアクセスする必要があります。たとえば、servletはデータベースから情報を取得するEJB上のリモートメソッドを実行することがあります。Java EEプラットフォームでは、Java Naming and Directory Interface (JNDI)ネーミングサービスによってコンポーネントが別のコンポーネントやリソースを参照できます。
リソース(resource)とは、データベースサーバやメッセージングシステムなどへのシステム接続を行うプログラム上のオブジェクトのことです。(Java Database Connectivityは稀にデータソースを参照します。)リソースオブジェクトそれぞれの識別は、JNDI名と呼ばれるユニークでユーザーフレンドリーな名前によって行われます。たとえば、JNDI名java:comp/DefaultDataSource
はGlassFish Serverに搭載されているJava DBデータベース用の事前定義済みJDBCリソースです。
管理者はJNDIネームスペースにリソースを作成します。GlassFish Serverでは、管理者はリソースの作成にAdministration Consoleもしくはasadmin
コマンドを使用します。そのあと、アプリケーションはアノテーションを使用してリソースをインジェクトします。アプリケーションがリソースインジェクションを使用すると、GlassFish ServerがJNDI APIを実行します。また、アプリケーションでJNDI APIを直接呼んでリソースを取得することも可能です。
リソースオブジェクトとJNDI名はネーミングとディレクトリサービスによって相互にバインドされています。新規リソースを生成するには、新しい名前とオブジェクトのバインディングをJNDIネームスペースに入力します。アプリケーションでリソースをインジェクトするには@Resource
アノテーションを使用します。
アノテーション指定のリソースマッピングをオーバーライドするにはデプロイメント記述子を使用します。デプロイメント記述子を使用することで、ソースファイル変更および再パッケージング両方の作業ではなく、再パッケージングのみでアプリケーションを変更可能です。しかし、大抵のアプリケーションでデプロイメント記述子は不要です。
3.2 DataSource Objects and Connection Pools
データの保存・編集・検索には、ほとんどのアプリケーションがリレーショナルデータベースを使用しています。Java EE 7コンポーネントはJDBC API経由でリレーショナルデータベースにアクセスします。このAPIの詳細については http://docs.oracle.com/javase/7/docs/technotes/guides/jdbc/ を参照してください。
JDBC APIでは、データベースはDataSource
オブジェクトを使用してアクセスします。DataSource
は実世界のデータソースを識別および記述するためのプロパティを持っています。このプロパティに含まれるのは、データベースサーバの場所・データベース名・サーバ通信に使用するネットワークプロトコル、などです。GlassFish Serverでは、データソースはJDBCリソースと呼びます。
アプリケーションはコネクションを使用してデータソースにアクセスします。また、DataSource
オブジェクトはこのオブジェクトが表現するデータソースへのコネクションを生成するファクトリーと見なせます。ベーシックなDataSource
実装では、getConnection
メソッドの呼び出しはデータベースへの物理コネクションを返します。
DataSource
オブジェクトはJNDIネーミングサービスで登録可能です。その場合、アプリケーションはDataSource
にアクセスするのにJNDI APIを使用できます。
コネクションプーリングを実装するDataSource
オブジェクトは、そのDataSource
が表す特定のデータソースへのコネクションを生成します。getConnection
メソッドが返すコネクションオブジェクトは、物理コネクションではなく、PooledConnection
オブジェクトのハンドルです。アプリケーションは、通常のコネクションを使用するのと同様な方法で、このコネクションオブジェクトを使用します。コネクションプーリングは、プールコネクションなことを除いてアプリケーションには影響を及ぼしません。なお、すべての接続は明示的にクローズする必要がある点は同様です。アプリケーションがプールコネクションをクローズする場合、コネクションは再利用可能なコネクションのプールに返却されます。次にgetConnection
が呼ばれると、利用可能なプールコネクションの一つのハンドルが返されます。コネクションプーリングは要求される度に新規の物理コネクションの作成を避けるので、アプリケーションは高速な動作が可能となります。
JDBCコネクションプールは特定のデータベースへの利用可能なコネクションのグループです。新規の物理コネクション生成は時間がかかるので、サーバはパフォーマンス向上のために利用可能なコネクションのプールを維持し続けます。コネクションのリクエストをすると、アプリケーションはプールから一つを取得します。アプリケーションがコネクションをクローズすると、コネクションはプールに返却されます。
Persistence APIを使用するアプリケーションでDataSource
オブジェクトを指定するには、persistence.xml
のjta-data-source
要素を使用します。
<jta-data-source>jdbc/MyOrderDB</jta-data-source>
上記は通常、persistence unit用のJDBCオブジェクトへの参照です。アプリケーションのコードではJDBCオブジェクトを参照しません。
3.3 Creating Resources Administratively
アプリケーションをデプロイや実行する前に、リソースを生成しておく必要があります。アプリケーションのリソース定義などに使用するglassfish-resources.xml
を、アプリケーションに含めることが出来ます。以下のようにasadmin
コマンドを使用して、管理者はglassfish-resources.xml
ファイルをコマンドの引数に指定することでリソースを作成できます。
asadmin add-resources glassfish-resources.xml
glassfish-resources.xml
ファイルはNetBeans IDEや手作業で任意のプロジェクトに作成可能です。JMSのサンプルではリソース生成にこのアプローチを使用しています。JMS simple producer exampleで必要なリソースを生成するためのファイルはjms/simple/producer/src/main/setup
*1ディレクトリにあります。
上述のサンプルではasadmin create-jms-resource
コマンドでリソースを作成することも出来ます。リソースに対する操作をする場合、asadmin list-jms-resources
コマンドでリソース名の取得、asadmin delete-jms-resource
コマンドで削除が、自分で作成したリソースかどうかに関わらず行えます。
関連リンク
- The Java EE 7 Tutorialのテキトー翻訳まとめ - Qiita - Java EE 7 Tutorialのうち、自分がテキトー翻訳したものの一覧