2 DataSourceリソース定義の使用
Java EE DataSourceリソース定義の使用
DataSource
オブジェクトは、Java Naming and Directory Interface (JNDI)ネーミング・サービスに登録されます。これにより、アプリケーションがJNDI APIを使用してDataSource
オブジェクトにアクセスし、データベースに接続できるようになります。
Java EE 7よりも前は、Oracle WebLogic Server JDBCデータ・ソースの管理のWebLogic JDBCリソースの構成で説明するように、DataSourceリソースは管理者によって作成されていました。Java EE 7では、データベース接続の柔軟性と移植性を向上するためにDataSourceリソースをプログラミングで定義するオプションが提供されます。
DataSource
を一意に識別するname
要素がJNDIに登録されます。name
要素に指定される値は、ネームスペース・スコープで開始します。Java EE 7には次のスコープがあります。
-
java:comp
: このネームスペースの名前は各コンポーネントで表示されます。 -
java:module
: このネームスペースの名前は、モジュールのすべてのコンポーネント(たとえば、ejb-jar.xmlファイルに定義されたEJBコンポーネント)で共有されます。 -
java:app
: このネームスペースの名前は、アプリケーションのすべてのコンポーネントとモジュール(たとえば、.earファイルのapplication-client、WebおよびEJBコンポーネント)で共有されます。 -
java:global
: このネームスペースの名前はサーバーのすべてのアプリケーションで共有されます。
次のいずれかの方法を使用して、データ・ソース定義をプログラミングで定義できます。
アノテーションを使用するDataSourceリソース定義の作成
javax.annotation.sql
パッケージには、アプリケーション・クライアント、サーブレットまたはEnterprise JavaBeans (EJB)などのアプリケーション・コンポーネント・クラスにDataSourceリソース定義を定義するための@DataSourceDefinition
と@DataSourceDefinitions
が用意されています。
DataSourceリソースがインジェクトされると、DataSource
オブジェクトが作成され、JNDIに登録されます。アノテーション要素を使用してDataSource
オブジェクトを構成します。その他のJava EE and WebLogic構成属性は、アノテーションのproperties
要素に指定できます。「WebLogic構成属性の使用」を参照してください
@DataSourceDefinition
を使用して1つのdatasource定義を作成します。たとえば:
. . . @DataSourceDefinition( name = "java:module/ExampleDS", className = "org.apache.derby.jdbc.ClientDataSource", portNumber = 1527, serverName = "localhost", databaseName = "exampleDB", user = "examples", password = "examples", properties={"create=true", "weblogic.TestTableName=SQL SELECT 1 FROM SYS.SYSTABLES"}) @WebServlet("/dataSourceServlet") public class DataSourceServlet extends HttpServlet { . . . @Resource(lookup = "java:module/ExampleDS") . . .
@DataSourceDefinitions
を使用して複数のdatasource定義を作成します。たとえば:
. . . @DataSourceDefinitions( value = { @DataSourceDefinition(name = "java:app/env/DS1", minPoolSize = 0, initialPoolSize = 0, className = "org.apache.derby.jdbc.ClientXADataSource", portNumber = 1527, serverName = "localhost", user = "examples", password = "examples", databaseName = "exampleDB", properties={"create=true", "weblogic.TestTableName=SQL SELECT 1 FROM SYS.SYSTABLES"} ), @DataSourceDefinition(name = "java:comp/env/DS2", minPoolSize = 0, initialPoolSize = 0, className = "org.apache.derby.jdbc.ClientDataSource", portNumber = 1527, serverName = "localhost", user = "examples", password = "examples", databaseName = "examplesDB", properties={"create=true", "weblogic.TestTableName=SQL SELECT 1 FROM SYS.SYSTABLES"} ) } ) . . .
完全なサンプルは、『Oracle WebLogic Serverの理解』の「サンプル・アプリケーションおよびサンプル・コード」を参照してください。
デプロイメント記述子を使用するDataSourceリソース定義の作成
application.xml
、application-client.xml
、web.xml
およびejb-jar.xml
ファイルでデプロイメント記述子を使用して、DataSourceリソース定義を作成できます。たとえば:
. . . <data-source> <name>java:module/ExampleDS</name> <class-name>org.apache.derby.jdbc.ClientDataSource</class-name> <server-name>localhost</server-name> <port-number>1527</port-number> <database-name>exampleDB</database-name> <user>examples</user> <password>examples</password> <property> <name>create</name> <value>true</value> </property> <property> <name>weblogic.TestTableName</name> <value>SQL SELECT 1 FROM SYS.SYSTABLES</value> </property> </data-source> . . .
WebLogic構成属性の使用
Java EE 7定義アノテーション@DataSourceDefinition
では、構成属性の基本的な標準セットが提供されます。property
要素を使用する独自の属性をサポートすることで、WebLogic Serverの豊富な構成属性セットのサポートが拡張されます。
ノート:
WebLogic Server独自の属性をproperty
要素で使用するときには、次の制限事項に注意してください。WebLogic Server独自の属性の特徴は次のとおりです。
-
マルチ・データ・ソースの構成には使用できません。マルチ・データ・ソースをEARまたはWARファイルに組み込むことはできません。
-
@DataSourceDefinition
アノテーション要素とオーバーラップしません。 -
データ・ソース・レベルの属性
name
とversion
を含みません。
表2-1に、データ・ソース構成属性のWebLogic Serverの拡張サポートをまとめています。Weblogic.Attribute
Nameプロパティ値とWebLogic構成要素をマッピングしています。WebLogic構成要素を使用するDataSourceリソース定義の例は、「Active GridLink DataSourceリソース定義の構成」を参照してください
表2-1 WebLogic構成属性
Weblogic属性名 | WebLogic要素 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DataSourceリソース定義使用時の実装の考慮事項
DataSourceリソース定義を作成および使用するときに考慮する必要がある実装の詳細について学習します。
命名規則
ここでは、データ・ソースの命名規則について説明します。
ノート:
WebLogic Server 12.1.1よりも前のバージョンとJava EE データ・ソースの命名規則には互換性があります。既存のアプリケーションは、以前のリリースからアップグレードするために命名規則を変更する必要はありません。
WebLogicデータ・ソースの命名規則
WebLogic Server 12.1.1よりも前のリリースでのデータ・ソースのネーミングには次のルールが使用されます。
-
dsname
- システム・リソースのJDBC記述子(config/jdbc/*-jdbc.xml
) -
application
@null@
dsname
- 非推奨 (9.x以前)、EARのアプリケーション・スコープのJDBC記述子 -
application
@
module
@
dsname
- EARのアプリケーションスコープのパッケージ化JDBC記述子
Java EE DataSourceリソース定義とWebLogicデータ・ソース・リソースのマッピング
表2-2は、Java EE DataSourceリソース定義の要素とWebLogic Serverリソースをどのようにマッピングするかを示します。
表2-2 DataSourceリソース定義とWebLogic Serverリソースのマッピング
DataSourceBean | デフォルト値 | WebLogicリソース |
---|---|---|
|
必須 |
|
|
必須 |
|
|
"" |
不使用 |
|
"" |
|
|
"" |
|
|
"" |
|
|
"" |
URLの生成に使用( |
|
|
URLの生成に使用( |
|
"localhost" |
URLの生成に使用( |
|
|
WebLogic Serverが |
|
|
URLの生成に使用 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
不使用 |
Active GridLink DataSourceリソース定義の構成
Active GridLinkデータ・ソースは、DataSourceリソース定義で次の名前/値ペアを使用して定義されます。
-
FanEnabled
はtrue
に設定されます。 -
OnsNodeList
はnull以外の値です。ONSベースのFANイベントを受信するためのONSデーモン・リスニング・アドレスおよびポートのカンマ区切りのリストです。Oracle WebLogic Server JDBCデータ・ソースの管理のONSクライアントの構成を参照してください。
次の例は、デプロイメント記述子を使用したActive GridLinkデータ・ソースのためのDataSourceリソース定義を示します。
. . . <data-source> <name>java:global/DSD2</name> <class-name>oracle.jdbc.OracleDriver</class-name> <url>jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=lcr01155-r)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=mydb)))</url> <user>lefty123</user> <password>password</password> <property><name>weblogic.CapacityIncrement</name><value>2</value></property> <property><name>weblogic.HighestNumWaiters</name><value>2147483647</value></property> <property><name>weblogic.ConnectionCreationRetryFrequencySeconds</name><value>0</value></property> <property><name>weblogic.ConnectionReserveTimeoutSeconds</name><value>10</value></property> <property><name>weblogic.TestFrequencySeconds</name><value>120</value></property> <property><name>weblogic.TestConnectionsOnReserve</name><value>false</value></property> <property><name>weblogic.ProfileHarvestFrequencySeconds</name><value>300</value></property> <property><name>weblogic.IgnoreInUseConnectionsEnabled</name><value>true</value></property> <property><name>weblogic.InactiveConnectionTimeoutSeconds</name><value>0</value></property> <property><name>weblogic.TestTableName</name><value></value></property> <property><name>weblogic.LoginDelaySeconds</name><value>0</value></property> <property><name>weblogic.InitSql</name><value></value></property> <property><name>weblogic.StatementCacheType</name><value>LRU</value></property> <property><name>weblogic.RemoveInfectedConnections</name><value>true</value></property> <property><name>weblogic.SecondsToTrustAnIdlePoolConnection</name><value>10</value></property> <property><name>weblogic.StatementTimeout</name><value>-1</value></property> <property><name>weblogic.ProfileType</name><value>0</value></property> <property><name>weblogic.JDBCXADebugLevel</name><value>10</value></property> <property><name>weblogic.CredentialMappingEnabled</name><value>false</value></property> <property><name>weblogic.DriverInterceptor</name><value></value></property> <property><name>weblogic.PinnedToThread</name><value>false</value></property> <property><name>weblogic.IdentityBasedConnectionPoolingEnabled</name><value>false</value></property> <property><name>weblogic.WrapTypes</name><value>true</value></property> <property><name>weblogic.ConnectionLabelingCallback</name><value></value></property> <property><name>weblogic.FatalErrorCodes</name><value></value></property> <property><name>weblogic.Scope</name><value>Global</value></property> <property><name>weblogic.RowPrefetch</name><value>false</value></property> <property><name>weblogic.RowPrefetchSize</name><value>48</value></property> <property><name>weblogic.StreamChunkSize</name><value>256</value></property> <property><name>weblogic.AlgorithmType</name><value>Failover</value></property> <property><name>weblogic.ConnectionPoolFailoverCallbackHandler</name><value></value></property> <property><name>weblogic.FailoverRequestIfBusy</name><value>false</value></property> <property><name>weblogic.GlobalTransactionsProtocol</name><value>OnePhaseCommit</value></property> <property><name>weblogic.KeepConnAfterLocalTx</name><value>true</value></property> <property><name>weblogic.KeepConnAfterGlobalTx</name><value>false</value></property> <property><name>weblogic.UseXaDataSourceInterface</name><value>true</value></property> <property><name>weblogic.UsePasswordIndirection</name><value>false</value></property> <property><name>weblogic.FanEnabled</name><value>true</value></property> <property><name>weblogic.OnsNodeList</name><value>lcr01155-r:6200</value></property> <property><name>weblogic.OnsWalletFile</name><value></value></property> <property><name>weblogic.OnsWalletPassword</name><value></value></property> <property><name>weblogic.OracleOptimizeUtf8Conversion</name><value>false</value></property> <property><name>weblogic.ConnectionInitializationCallback</name><value></value></property> <property><name>weblogic.AffinityPolicy</name><value>Session</value></property> <property><name>weblogic.OracleProxySession</name><value>false</value></property> <property><name>weblogic.KeepXaConnTillTxComplete</name><value>true</value></property> <property><name>weblogic.NeedTxCtxOnClose</name><value>false</value></property> <property><name>weblogic.XaEndOnlyOnce</name><value>false</value></property> <property><name>weblogic.NewXaConnForCommit</name><value>false</value></property> <property><name>weblogic.KeepLogicalConnOpenOnRelease</name><value>false</value></property> <property><name>weblogic.ResourceHealthMonitoring</name><value>true</value></property> <property><name>weblogic.RecoverOnlyOnce</name><value>false</value></property> <property><name>weblogic.XaSetTransactionTimeout</name><value>false</value></property> <property><name>weblogic.XaTransactionTimeout</name><value>0</value></property> <property><name>weblogic.RollbackLocalTxUponConnClose</name><value>false</value></property> <property><name>weblogic.XaRetryDurationSeconds</name><value>0</value></property> <property><name>weblogic.XaRetryIntervalSeconds</name><value>60</value></property> </data-source> . . .
その他の詳細は、Oracle WebLogic Server JDBCデータ・ソースの管理のActive GridLinkデータ・ソースの使用を参照してください。
DataSourceDefinitionでの暗号化パスワードの使用
DataSourceDefinition
で暗号化パスワードを提供できます。そのためには、次の例で示すようにパスワードを生成し、DataSourceDefinition
にコピーする必要があります。
# needs to be run in the domain home directory java weblogic.security.Encrypt Password: user_password {AES}OQ1CnXWsgTVQsxrHqpxMT7iZwt7wBBIrkLP5NWeAvNk=" # This value needs to be pasted into the DataSourceDefinition
暗号化パスワードはドメインごとに異なります。ドメインと一致しない暗号化パスワードを使用すると、次のようなエラーが発生します。
weblogic.application.ModuleException: com.rsa.jsafe.JSAFE_PaddingException: Invalid padding.:com.rsa.jsafe.JSAFE_PaddingException:Invalid padding
次のコードは、Javaサーブレッドのアノテーションで暗号化パスワードを使用してデータ・ソースを定義します。
@DataSourceDefinition( name="java:comp/ds", className="oracle.jdbc.OracleDriver", portNumber=1521, serverName="myhost", user="myuser", databaseName="mydbname", initialPoolSize = 0, minPoolSize = 0, maxPoolSize = 15, maxStatements = 0, transactional=false, properties = {"weblogic.TestTableName=SQL ISVALID", "weblogic.PasswordEncrypted={AES}OQ1CnXWsgTVQsxrHqpxMT7iZwt7wBBIrkLP5NWeAvNk="} ) @WebServlet(urlPatterns = "/GetVersion") public class GetVersion extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { @Resource(lookup = "java:comp/ds") private DataSource ds;
追加の考慮事項
Java EE DataSourceリソース定義をWebLogic Serverで使用する際には次の点を考慮してください。
-
アノテーションと記述子の同じ
DataSource
名が同じスコープにある場合、属性はデプロイメント記述子に指定された値とマージされます。デプロイメント記述子の値は、アノテーションに指定された値よりも優先されます。 -
DataSource
はモジュールではありません。モジュールの一部として作成されるリソースです。 -
DataSource
は、ドメインに関連付けられたJDBCSystemResources
オブジェクトではありません。また、WebLogic Server構成beanツリーにはありません。 -
JSR88 APIを使用して、Java EE 7データ・ソースを含むアプリケーションを表示できます。
-
各データ・ソース定義にはランタイムMBeanが1つ作成されます。このMBeanには修飾された名前が使用されます。
-
WLSでURLを生成できる既知のクラス名は限られています。非XAの場合、JDBCドライバや非データソースのクラスがよく知られています。
databaseName
、portNumber
、またはserverName
に不明なクラス名を指定するとエラーが発生します。この場合は、databaseName
、portNumber
、またはserverName
を削除してURLを指定します。 -
AGLデータ・ソースに対するURLの生成はサポートされていません。
-
URLの生成は一般に、そのサービス、データベースおよびOracle RACインスタンスの形式に起因して、すべてのOracleドライバで問題になります。OracleドライバのURLを指定することが最善の方法です。
クライアントでのデータ・ソースの使用
WebLogic Serverを使用して、Java EEクライアントにJava EEデータ・ソースを実装できます(いくつかの制限事項あり)。
制限事項は次のとおりです。
-
Transactional=true
はサポートされません。トランザクション・プロトコルはNONE
に設定されます。 -
スコープがグローバルまたはアプリケーションのデータ・ソースは、クライアントとサーバーの両方で表示されます(作成されます)。使用する接続数が多い場合には好ましくない影響があります。
-
データ・ソースに対する権限のチェックは実行されません。
reserve
やshrink
などの処理をローカル・データ・ソースに対して使用できます。
追加のリソース
データ・ソース・リソース定義を実装するときに参照する追加のリソースについて学習します。
-
Java EE 8仕様(https://www.jcp.org/en/jsr/detail?id=366)。
-
Java EE 8チュートリアル(https://javaee.github.io/tutorial/toc.html)。
-
WebLogic Serverコード例。