kagamihogeの日記

kagamihogeの日記です。

The Java EE 7 TutorialのResource Creationの章をテキトーに訳した

The Java EE 7 Tutorial3 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/DefaultDataSourceGlassFish 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.xmljta-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コマンドで削除が、自分で作成したリソースかどうかに関わらず行えます。

関連リンク