本セクションでは、JDBC 接続プールの使用の概要と、以下の接続プールモジュールの使用方法を説明します。
本章では、データソース管理の内部に関する包括的な情報を紹介しています。DBCP2 接続プール機能に関する情報が提供されていますが、この接続プールには適切な JTA 参加機能がありますが、XA リカバリー の機能はないので注意してください。
XA リカバリー が有効であることを確認するには、pax-jdbc-pool-transx
または pax-jdbc-pool-narayana
接続プールモジュールを使用します。
以前の例では、データベース固有のデータソース ファクトリー を登録する方法を説明しました。データソース 自体は接続のファクトリーであるため、org.osgi.service.jdbc.DataSourceFactory
は 3 種類のデータソースを生成できるメタファクトリー として扱われる可能性があります (さらに java.sql.Driver
)。
javax.sql.DataSource
javax.sql.ConnectionPoolDataSource
javax.sql.XADataSource
たとえば、pax-jdbc-mysql
は、以下を作成する org.ops4j.pax.jdbc.mysql.impl.MysqlDataSourceFactory
を登録します。
javax.sql.DataSource
com.mysql.jdbc.jdbc2.optional.MysqlDataSource
javax.sql.ConnectionPoolDataSource
com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
javax.sql.XADataSource
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
java.sql.Driver
com.mysql.jdbc.Driver
PostgreSQL ドライバー自体は OSGi JDBC サービスを実装し、以下を生成します。
javax.sql.DataSource
org.postgresql.jdbc2.optional.PoolingDataSource
(プール関連のプロパティーが指定されている場合) または org.postgresql.jdbc2.optional.SimpleDataSource
javax.sql.ConnectionPoolDataSource
org.postgresql.jdbc2.optional.ConnectionPool
javax.sql.XADataSource
org.postgresql.xa.PGXADataSource
java.sql.Driver
org.postgresql.Driver
標準の DataSource 例 に記載されているように、JTA 環境で機能する場合は、プーリング 、汎用 データソースは、(XA) 接続を実際に取得するには データベース固有 のデータソースが必要です。
すでに後者があるので、実際の信頼性がある、汎用接続プールが必要です。
標準の DataSource 例 は、データベース固有のデータソースを使用して汎用プールを設定する方法を示しています。pax-jdbc-pool-*
バンドルは上記の org.osgi.service.jdbc.DataSourceFactory
サービスとスムーズに連携します。
OSGI Enterprise R6 JDBC 仕様が org.osgi.service.jdbc.DataSourceFactory
標準インターフェイスを提供するのと同じように、pax-jdbc-pool-common
は プロプライエタリーの org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory
インターフェイスを提供します。
public interface PooledDataSourceFactory {
javax.sql.DataSource create(org.osgi.service.jdbc.DataSourceFactory dsf, Properties config)
}
public interface PooledDataSourceFactory {
javax.sql.DataSource create(org.osgi.service.jdbc.DataSourceFactory dsf, Properties config)
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
このインターフェイスは、以前に提示されたこの重要なメモに完全に準拠しており、繰り返す価値があります。
アプリケーションが XA トランザクションや接続プーリングを使用する場合でも、アプリケーションは他の 2 つの JDBC データソースインターフェイスではなく、javax.sql.DataSource
と対話します。
このインターフェイスは、データベース固有の非プーリングデータからプーリングデータソースを作成するだけです。また、これは データソースファクトリー (メタファクトリー ) で、データベース固有のデータソースのファクトリーをデータソースのプーリングファクトリーに変換します。
javax.sql.DataSource
オブジェクトのプールをすでに返している org.osgi.service.jdbc.DataSourceFactory
サービスを使用して、アプリケーションで javax.sql.DataSource
オブジェクトのプーリングが設定されないようにすることはできません。
以下の表は、プールされたデータソースファクトリーを登録するバンドルを示しています。この表では、o.o.p.j.p
のインスタンスは org.ops4j.pax.jdbc.pool
を表します。
Expand バンドル PooledDataSourceFactory
プールキー
pax-jdbc-pool-narayana
o.o.p.j.p.narayana.impl.Dbcp(XA)PooledDataSourceFactory
narayana
pax-jdbc-pool-dbcp2
o.o.p.j.p.dbcp2.impl.Dbcp(XA)PooledDataSourceFactory
dbcp2
pax-jdbc-pool-transx
o.o.p.j.p.transx.impl.Transx(Xa)PooledDataSourceFactory
transx
Show more
上記のバンドルはデータソースファクトリーのみをインストールし、データソース自体にはインストールしません。アプリケーションは javax.sql.DataSource create(org.osgi.service.jdbc.DataSourceFactory dsf, Properties config)
メソッドを呼び出す何かが必要です。
一般的なデータソースのセクションでは、Apache Commons DBCP モジュール を使用し、設定する方法の例 を紹介します。ここでは、Fuse OSGi 環境で設定方法を説明します。
「PAX-JDBC 設定サービス」 バンドルについて見てみましょう。以下を追跡するだけでなく、ほかも追跡します。
org.osgi.service.jdbc.DataSourceFactory
services
org.ops4j.datasource
factory PIDs
このバンドルは、pax-jdbc-pool-*
バンドルのいずれかによって登録された org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory
のインスタンスも追跡します。
ファクトリー設定 に pool
プロパティーが含まれる場合、pax-jdbc-config
バンドルによって登録される最終データソースはデータベース固有のデータソースになりますが、pool=dbcp2
の場合は以下のいずれかの内部でラッピングされます。
org.apache.commons.dbcp2.PoolingDataSource
org.apache.commons.dbcp2.managed.ManagedDataSource
これは、一般的なデータソースの例 と同じです。pool
プロパティーと、非 xa または xa データソースを選択するブール値 xa
プロパティーの他に、org.ops4j.datasource
ファクトリー PID に 接頭辞 が付いたプロパティーが含まれることがあります。
各プロパティーが使用される場所は、使用される pax-jdbc-pool-*
バンドルによって異なります。DBCP2 の場合は以下のようになります。
pool.*
: org.apache.commons.pool2.impl.GenericObjectPoolConfig
の bean プロパティー (xa と xa 以外の両方)
factory.*
: org.apache.commons.dbcp2.managed.PoolableManagedConnectionFactory
(xa) または org.apache.commons.dbcp2.PoolableConnectionFactory
(xa 以外) の Bean プロパティー
以下は、jdbc.
が接頭辞として付けられたプロパティーと便利な構文を使用する DBCP2 プールの設定 (org.ops4j.datasource-mysql
ファクトリー PID ) の現実的な例です (useSSL=false
を除く)。
Configuration for pax-jdbc-config to choose and configure specific org.osgi.service.jdbc.DataSourceFactory
Hints for pax-jdbc-config to use org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory
dbcp2 specific configuration of org.apache.commons.pool2.impl.GenericObjectPoolConfig
dbcp2 specific configuration of org.apache.commons.dbcp2.PoolableConnectionFactory
# Configuration for pax-jdbc-config to choose and configure specific org.osgi.service.jdbc.DataSourceFactory
dataSourceName = mysqlds
dataSourceType = DataSource
osgi.jdbc.driver.name = mysql
jdbc.url = jdbc:mysql://localhost:3306/reportdb
jdbc.user = fuse
jdbc.password = fuse
jdbc.useSSL = false
# Hints for pax-jdbc-config to use org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory
pool = dbcp2
xa = false
# dbcp2 specific configuration of org.apache.commons.pool2.impl.GenericObjectPoolConfig
pool.minIdle = 10
pool.maxTotal = 100
pool.blockWhenExhausted = true
pool.maxWaitMillis = 2000
pool.testOnBorrow = true
pool.testWhileIdle = false
pool.timeBetweenEvictionRunsMillis = 120000
pool.evictionPolicyClassName = org.apache.commons.pool2.impl.DefaultEvictionPolicy
# dbcp2 specific configuration of org.apache.commons.dbcp2.PoolableConnectionFactory
factory.maxConnLifetimeMillis = 30000
factory.validationQuery = select schema_name from information_schema.schemata
factory.validationQueryTimeout = 2
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
上記の設定では、pool
と xa
キーは ヒント (サービスフィルタープロパティー) で、登録された org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory
サービスのいずれかを選択します。DBCP2 の場合は以下のようになります。
karaf@root()> feature:install pax-jdbc-pool-dbcp2
karaf@root()> bundle:services -p org.ops4j.pax.jdbc.pool.dbcp2
OPS4J Pax JDBC Pooling DBCP2 (230) provides:
--------------------------------------------
objectClass = [org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory]
pool = dbcp2
service.bundleid = 230
service.id = 337
service.scope = singleton
xa = false
-----
objectClass = [org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory]
pool = dbcp2
service.bundleid = 230
service.id = 338
service.scope = singleton
xa = true
karaf@root()> feature:install pax-jdbc-pool-dbcp2
karaf@root()> bundle:services -p org.ops4j.pax.jdbc.pool.dbcp2
OPS4J Pax JDBC Pooling DBCP2 (230) provides:
--------------------------------------------
objectClass = [org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory]
pool = dbcp2
service.bundleid = 230
service.id = 337
service.scope = singleton
xa = false
-----
objectClass = [org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory]
pool = dbcp2
service.bundleid = 230
service.id = 338
service.scope = singleton
xa = true
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
以下は、前の例 に接続プール設定を追加した完全な例です。繰り返しになりますが、これは、Fuse の新規インストールから開始していることを前提としています。
JDBC ドライバーをインストールします。
karaf@root()> install -s mvn:mysql/mysql-connector-java/5.1.34
Bundle ID: 223
karaf@root()> install -s mvn:mysql/mysql-connector-java/5.1.34
Bundle ID: 223
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
jdbc
、pax-jdbc-mysql
および pax-jdbc-pool-dbcp2
機能をインストールします。
karaf@root()> feature:repo-add mvn:org.ops4j.pax.jdbc/pax-jdbc-features/1.3.0/xml/features-gpl
Adding feature url mvn:org.ops4j.pax.jdbc/pax-jdbc-features/1.3.0/xml/features-gpl
karaf@root()> feature:install jdbc pax-jdbc-mysql pax-jdbc-pool-dbcp2
karaf@root()> service:list org.osgi.service.jdbc.DataSourceFactory
...
[org.osgi.service.jdbc.DataSourceFactory]
-----------------------------------------
osgi.jdbc.driver.class = com.mysql.jdbc.Driver
osgi.jdbc.driver.name = mysql
service.bundleid = 232
service.id = 328
service.scope = singleton
Provided by :
OPS4J Pax JDBC MySQL Driver Adapter (232)
karaf@root()> service:list org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory
[org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory]
--------------------------------------------------------
pool = dbcp2
service.bundleid = 233
service.id = 324
service.scope = singleton
xa = false
Provided by :
OPS4J Pax JDBC Pooling DBCP2 (233)
[org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory]
--------------------------------------------------------
pool = dbcp2
service.bundleid = 233
service.id = 332
service.scope = singleton
xa = true
Provided by :
OPS4J Pax JDBC Pooling DBCP2 (233)
karaf@root()> feature:repo-add mvn:org.ops4j.pax.jdbc/pax-jdbc-features/1.3.0/xml/features-gpl
Adding feature url mvn:org.ops4j.pax.jdbc/pax-jdbc-features/1.3.0/xml/features-gpl
karaf@root()> feature:install jdbc pax-jdbc-mysql pax-jdbc-pool-dbcp2
karaf@root()> service:list org.osgi.service.jdbc.DataSourceFactory
...
[org.osgi.service.jdbc.DataSourceFactory]
-----------------------------------------
osgi.jdbc.driver.class = com.mysql.jdbc.Driver
osgi.jdbc.driver.name = mysql
service.bundleid = 232
service.id = 328
service.scope = singleton
Provided by :
OPS4J Pax JDBC MySQL Driver Adapter (232)
karaf@root()> service:list org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory
[org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory]
--------------------------------------------------------
pool = dbcp2
service.bundleid = 233
service.id = 324
service.scope = singleton
xa = false
Provided by :
OPS4J Pax JDBC Pooling DBCP2 (233)
[org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory]
--------------------------------------------------------
pool = dbcp2
service.bundleid = 233
service.id = 332
service.scope = singleton
xa = true
Provided by :
OPS4J Pax JDBC Pooling DBCP2 (233)
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
ファクトリー設定 を作成します。
karaf@root()> config:edit --factory --alias mysql org.ops4j.datasource
karaf@root()> config:property-set osgi.jdbc.driver.name mysql
karaf@root()> config:property-set dataSourceName mysqlds
karaf@root()> config:property-set dataSourceType DataSource
karaf@root()> config:property-set jdbc.url jdbc:mysql://localhost:3306/reportdb
karaf@root()> config:property-set jdbc.user fuse
karaf@root()> config:property-set jdbc.password fuse
karaf@root()> config:property-set jdbc.useSSL false
karaf@root()> config:property-set pool dbcp2
karaf@root()> config:property-set xa false
karaf@root()> config:property-set pool.minIdle 2
karaf@root()> config:property-set pool.maxTotal 10
karaf@root()> config:property-set pool.blockWhenExhausted true
karaf@root()> config:property-set pool.maxWaitMillis 2000
karaf@root()> config:property-set pool.testOnBorrow true
karaf@root()> config:property-set pool.testWhileIdle alse
karaf@root()> config:property-set pool.timeBetweenEvictionRunsMillis 120000
karaf@root()> config:property-set factory.validationQuery 'select schema_name from information_schema.schemata'
karaf@root()> config:property-set factory.validationQueryTimeout 2
karaf@root()> config:update
karaf@root()> config:edit --factory --alias mysql org.ops4j.datasource
karaf@root()> config:property-set osgi.jdbc.driver.name mysql
karaf@root()> config:property-set dataSourceName mysqlds
karaf@root()> config:property-set dataSourceType DataSource
karaf@root()> config:property-set jdbc.url jdbc:mysql://localhost:3306/reportdb
karaf@root()> config:property-set jdbc.user fuse
karaf@root()> config:property-set jdbc.password fuse
karaf@root()> config:property-set jdbc.useSSL false
karaf@root()> config:property-set pool dbcp2
karaf@root()> config:property-set xa false
karaf@root()> config:property-set pool.minIdle 2
karaf@root()> config:property-set pool.maxTotal 10
karaf@root()> config:property-set pool.blockWhenExhausted true
karaf@root()> config:property-set pool.maxWaitMillis 2000
karaf@root()> config:property-set pool.testOnBorrow true
karaf@root()> config:property-set pool.testWhileIdle alse
karaf@root()> config:property-set pool.timeBetweenEvictionRunsMillis 120000
karaf@root()> config:property-set factory.validationQuery 'select schema_name from information_schema.schemata'
karaf@root()> config:property-set factory.validationQueryTimeout 2
karaf@root()> config:update
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
pax-jdbc-config
が設定を処理して javax.sql.DataSource
サービスに指定しているかどうかを確認します。
karaf@root()> service:list javax.sql.DataSource
[javax.sql.DataSource]
----------------------
dataSourceName = mysqlds
dataSourceType = DataSource
factory.validationQuery = select schema_name from information_schema.schemata
factory.validationQueryTimeout = 2
felix.fileinstall.filename = file:${karaf.etc}/org.ops4j.datasource-mysql.cfg
jdbc.password = fuse
jdbc.url = jdbc:mysql://localhost:3306/reportdb
jdbc.user = fuse
jdbc.useSSL = false
osgi.jdbc.driver.name = mysql
osgi.jndi.service.name = mysqlds
pax.jdbc.managed = true
pool.blockWhenExhausted = true
pool.maxTotal = 10
pool.maxWaitMillis = 2000
pool.minIdle = 2
pool.testOnBorrow = true
pool.testWhileIdle = alse
pool.timeBetweenEvictionRunsMillis = 120000
service.bundleid = 225
service.factoryPid = org.ops4j.datasource
service.id = 338
service.pid = org.ops4j.datasource.fd7aa3a1-695b-4342-b0d6-23d018a46fbb
service.scope = singleton
Provided by :
OPS4J Pax JDBC Config (225)
karaf@root()> service:list javax.sql.DataSource
[javax.sql.DataSource]
----------------------
dataSourceName = mysqlds
dataSourceType = DataSource
factory.validationQuery = select schema_name from information_schema.schemata
factory.validationQueryTimeout = 2
felix.fileinstall.filename = file:${karaf.etc}/org.ops4j.datasource-mysql.cfg
jdbc.password = fuse
jdbc.url = jdbc:mysql://localhost:3306/reportdb
jdbc.user = fuse
jdbc.useSSL = false
osgi.jdbc.driver.name = mysql
osgi.jndi.service.name = mysqlds
pax.jdbc.managed = true
pool.blockWhenExhausted = true
pool.maxTotal = 10
pool.maxWaitMillis = 2000
pool.minIdle = 2
pool.testOnBorrow = true
pool.testWhileIdle = alse
pool.timeBetweenEvictionRunsMillis = 120000
service.bundleid = 225
service.factoryPid = org.ops4j.datasource
service.id = 338
service.pid = org.ops4j.datasource.fd7aa3a1-695b-4342-b0d6-23d018a46fbb
service.scope = singleton
Provided by :
OPS4J Pax JDBC Config (225)
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
データソースを使用します。
karaf@root()> jdbc:query mysqlds 'select * from incident'
date │ summary │ name │ details │ id │ email
──────────────────────┼────────────┼────────┼───────────────────────────────┼────┼─────────────────
2018-02-20 08:00:00.0 │ Incident 1 │ User 1 │ This is a report incident 001 │ 1 │ user1@redhat.com
2018-02-20 08:10:00.0 │ Incident 2 │ User 2 │ This is a report incident 002 │ 2 │ user2@redhat.com
2018-02-20 08:20:00.0 │ Incident 3 │ User 3 │ This is a report incident 003 │ 3 │ user3@redhat.com
2018-02-20 08:30:00.0 │ Incident 4 │ User 4 │ This is a report incident 004 │ 4 │ user4@redhat.com
karaf@root()> jdbc:query mysqlds 'select * from incident'
date │ summary │ name │ details │ id │ email
──────────────────────┼────────────┼────────┼───────────────────────────────┼────┼─────────────────
2018-02-20 08:00:00.0 │ Incident 1 │ User 1 │ This is a report incident 001 │ 1 │ user1@redhat.com
2018-02-20 08:10:00.0 │ Incident 2 │ User 2 │ This is a report incident 002 │ 2 │ user2@redhat.com
2018-02-20 08:20:00.0 │ Incident 3 │ User 3 │ This is a report incident 003 │ 3 │ user3@redhat.com
2018-02-20 08:30:00.0 │ Incident 4 │ User 4 │ This is a report incident 004 │ 4 │ user4@redhat.com
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
pax-jdbc-pool-narayna
モジュールはほぼすべてが pax-jdbc-pool-dbcp2
として行われます。XA および XA 以外のシナリオ向けに DBCP2 固有の org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory
をインストールします。唯一 の違いは、XA のシナリオでは追加の統合ポイントがあることです。org.jboss.tm.XAResourceRecovery
OSGi サービスは、Narayana トランザクションマネージャーに含まれる com.arjuna.ats.arjuna.recovery.RecoveryManager
で取得されるように登録されます。
pax-jdbc-pool-transx
バンドルは、org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory
サービスの実装を pax-transx-jdbc
バンドルをもとにします。pax-transx-jdbc
バンドルは、org.ops4j.pax.transx.jdbc.ManagedDataSourceBuilder
機能を使用して javax.sql.DataSource
プールを作成します。これは JCA(Java™ Connector Architecture) ソリューションで、後 で説明します。