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 7仕様(
https://www.jcp.org/en/jsr/detail?id=342) -
Java EE 7チュートリアル(
http://docs.oracle.com/javaee/7/tutorial/doc/) -
JDBC™ 4.1仕様(
http://download.oracle.com/otn-pub/jcp/jdbc-4_1-mrel-spec/jdbc4.1-fr-spec.pdf) -
『Oracle WebLogic Serverの理解』の「サンプル・アプリケーションとコード例」