이전 예제에서는 데이터베이스별 데이터 소스 팩토리 를 등록하는 방법을 보여줍니다. 데이터 소스 자체는 연결에 대한 팩토리이기 때문에 org.osgi.service.jdbc.DataSourceFactory 는 세 가지 종류의 데이터 소스를 생성할 수 있어야 하는 메타 팩토리 로 취급될 수 있으며, 보너스로 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.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
표준 데이터 소스 예 에 표시된 것처럼 모든 풀링 (일반 데이터 소스)이 JTA 환경에서 작동하려면 실제로 (XA) 연결을 얻으려면 데이터베이스별 데이터 소스가 필요합니다.
우리는 이미 후자를 보유하고 있으며 실제적이고 일반적인 신뢰할 수 있는 연결 풀이 필요합니다.
표준 데이터 소스 예 는 데이터베이스별 데이터 소스를 사용하여 일반 풀을 구성하는 방법을 보여줍니다. 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 트랜잭션 및/또는 연결 풀링을 사용하는 경우에도 애플리케이션은 다른 두 JDBC 데이터 소스 인터페이스가 아닌 javax.sql.DataSource 와 상호 작용합니다.
이 인터페이스는 데이터베이스별 비풀링 데이터에서 간단히 풀링 데이터 소스를 생성합니다. 또는 보다 정확하게는 데이터베이스별 데이터 소스의 팩토리 를 데이터 소스 풀링 팩토리로 변환하는 데이터 소스 팩토리(meta factory )입니다.
javax.sql.DataSource 개체에 대한 풀링을 이미 반환하는 org.osgi.service.jdbc.DataSourceFactory 서비스를 사용하여 애플리케이션에서 javax.sql.DataSource Source 개체에 대한 풀링을 구성하지 못하도록 하는 것은 없습니다.
다음 표에서는 풀링된 데이터 소스 팩토리를 등록하는 번들을 보여줍니다. 표에서 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 환경에서 이 작업을 수행하는 방법을 설명합니다.
6.4.1절. “PAX-JDBC 구성 서비스” 번들을 고려하십시오. 다음을 추적하는 것 외에도 다음을 수행하십시오.
org.osgi.service.jdbc.DataSourceFactory services
org.ops4j.datasource 팩토리 PID
또한 번들은 pax-jc -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 의 빈 속성(xa 및 비xa 시나리오 모두)
factory.*: org.apache.commons.dbcp2.managed.PoolableManagedConnectionFactory (xa) 또는 org.apache.commons.dbcp2.PoolableConnectionFactory (non-xa)의 8080 속성
다음 표에는 BasicDataSource의 일반 구성 속성이 나열되어 있습니다.
Expand 매개변수 Default 설명
사용자 이름
연결을 설정하기 위해 JDBC 드라이버에 전달할 연결 사용자 이름입니다.
암호
연결을 설정하기 위해 JDBC 드라이버에 전달할 연결 암호입니다.
url
연결을 설정하기 위해 JDBC 드라이버에 전달할 연결 URL입니다.
driverClassName
사용할 JDBC 드라이버의 정규화된 Java 클래스 이름입니다.
initialSize
0
풀을 시작할 때 생성되는 초기 연결 수입니다.
maxTotal
8
이 풀에서 동시에 할당할 수 있는 최대 활성 연결 수 또는 제한 없음에 대해 음수입니다.
maxIdle
8
추가 해제 없이 풀에서 유휴 상태로 유지할 수 있는 최대 연결 수 또는 제한 없이 음수입니다.
minIdle
0
추가 생성 없이 풀에서 유휴 상태로 유지할 수 있는 최소 연결 수 또는 0을 생성하여 none을 생성합니다.
maxWaitMillis
무기
풀에서 사용할 수 있는 최대 시간(사용 가능한 연결이 없는 경우)이 예외를 throw하거나 -1이 무기한 대기하기 전에 반환될 때까지 대기하는 최대 시간(밀리초)입니다.
validationQuery
호출자로 반환하기 전에 이 풀의 연결을 검증하는 데 사용할 SQL 쿼리입니다. 지정된 경우 이 쿼리는 하나 이상의 행을 반환하는 SQL SELECT 문이어야 합니다. 지정하지 않으면 isValid() 메서드를 호출하여 연결을 검증합니다.
validationQueryTimeout
시간 초과 없음
연결 유효성 검사 쿼리가 실패하기 전 시간(초)입니다. 양수 값으로 설정하면 이 값은 검증 쿼리를 실행하는 데 사용되는 Statement의 setQueryTimeout 메서드를 통해 드라이버에 전달됩니다.
testOnCreate
false
생성 후 오브젝트의 유효성을 검사합니다. 오브젝트의 유효성을 검사하지 못하면 오브젝트 생성을 트리거한 차용 시도에 실패합니다.
testOnBorrow
true
개체가 풀에서 빌리기 전에 유효성을 검사합니다. 개체의 유효성 검사가 실패하면 풀에서 삭제되고 다른 개체를 빌리려고 합니다.
testOnReturn
false
개체가 풀로 반환되기 전에 유효성을 검사할지 여부를 나타내는 값입니다.
testWhileIdle
false
유휴 오브젝트 evictor(있는 경우)에서 오브젝트의 유효성을 검사합니다. 오브젝트의 유효성 검사가 실패하면 풀에서 삭제됩니다.
timeBetweenEvictionRunsMillis
-1
유휴 개체 evictor 스레드의 실행 사이에 유휴 상태의 시간(밀리초)입니다. 양수가 아닌 경우 유휴 오브젝트 제거 스레드가 실행되지 않습니다.
numTestsPerEvictionRun
3
유휴 개체의 각 실행 중에 검사할 오브젝트 수(있는 경우)입니다.
minEvictableIdleTimeMillis
1000 * 60 * 30
유휴 오브젝트 제거 대상(있는 경우)을 제거하기 전에 오브젝트가 풀에 유휴 상태로 남아 있을 수 있는 최소 시간입니다.
Show more
다음은 jdbc와 함께 편리한 구문을 사용하는 DBCP2 풀(org.ops4j.datasource-mysql PID ) 구성의 비현실 예제( useSSL=false제외)입니다.
# 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.initialSize = 8
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
# 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.initialSize = 8
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.j.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