6.7. JDBC 연결 풀 사용
이 섹션에서는 JDBC 연결 풀을 사용한 다음 이러한 연결 풀 모듈을 사용하는 방법을 보여줍니다.
이 장에서는 데이터 소스 관리의 내부에 대한 완전한 정보를 제공합니다. DBCP2 연결 풀 기능에 대한 정보가 제공되지만 이 연결 풀은 적절한 JTA 등록 기능을 제공하지만 XA 복구 는 제공하지 않습니다.
XA 복구 가 적용되도록 하려면 pax-jdbc-pool-transx
또는 pax-jdbc-pool-narayana
연결 풀 모듈을 사용합니다.
6.7.1. JDBC 연결 풀 사용 소개
이전 예제에서는 데이터베이스별 데이터 소스 팩토리 를 등록하는 방법을 보여줍니다. 데이터 소스 자체는 연결에 대한 팩토리이기 때문에 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) }
이 인터페이스는 이전에 제시된 중요한 참고 사항에 완벽하게 부합하며 반복할 가치가 있습니다.
애플리케이션에서 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
을 나타냅니다.
번들 | PooledDataSourceFactory | 풀 키 |
---|---|---|
|
|
|
|
|
|
|
|
|
위의 번들은 데이터 소스 자체가 아닌 데이터 소스 팩토리만 설치합니다. 애플리케이션에는 javax.sql.DataSource create(org.osgi.service.jdbc.DataSourceFactory dsf, Properties config)
메서드를 호출하는 항목이 필요합니다.
6.7.2. dbcp2
연결 풀 모듈 사용
일반 데이터 소스에 대한 섹션에서는 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 에는 접두사 가 지정된 속성이 포함될 수 있습니다.
-
pool.*
-
factory.*
여기서 각 속성이 사용되는 위치는 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 속성
6.7.2.1. BasicDataSource의 구성 속성
다음 표에는 BasicDataSource의 일반 구성 속성이 나열되어 있습니다.
매개변수 | Default | 설명 |
---|---|---|
| 연결을 설정하기 위해 JDBC 드라이버에 전달할 연결 사용자 이름입니다. | |
| 연결을 설정하기 위해 JDBC 드라이버에 전달할 연결 암호입니다. | |
| 연결을 설정하기 위해 JDBC 드라이버에 전달할 연결 URL입니다. | |
| 사용할 JDBC 드라이버의 정규화된 Java 클래스 이름입니다. | |
| 0 | 풀을 시작할 때 생성되는 초기 연결 수입니다. |
| 8 | 이 풀에서 동시에 할당할 수 있는 최대 활성 연결 수 또는 제한 없음에 대해 음수입니다. |
| 8 | 추가 해제 없이 풀에서 유휴 상태로 유지할 수 있는 최대 연결 수 또는 제한 없이 음수입니다. |
| 0 | 추가 생성 없이 풀에서 유휴 상태로 유지할 수 있는 최소 연결 수 또는 0을 생성하여 none을 생성합니다. |
| 무기 | 풀에서 사용할 수 있는 최대 시간(사용 가능한 연결이 없는 경우)이 예외를 throw하거나 -1이 무기한 대기하기 전에 반환될 때까지 대기하는 최대 시간(밀리초)입니다. |
| 호출자로 반환하기 전에 이 풀의 연결을 검증하는 데 사용할 SQL 쿼리입니다. 지정된 경우 이 쿼리는 하나 이상의 행을 반환하는 SQL SELECT 문이어야 합니다. 지정하지 않으면 isValid() 메서드를 호출하여 연결을 검증합니다. | |
| 시간 초과 없음 | 연결 유효성 검사 쿼리가 실패하기 전 시간(초)입니다. 양수 값으로 설정하면 이 값은 검증 쿼리를 실행하는 데 사용되는 Statement의 setQueryTimeout 메서드를 통해 드라이버에 전달됩니다. |
| false | 생성 후 오브젝트의 유효성을 검사합니다. 오브젝트의 유효성을 검사하지 못하면 오브젝트 생성을 트리거한 차용 시도에 실패합니다. |
| true | 개체가 풀에서 빌리기 전에 유효성을 검사합니다. 개체의 유효성 검사가 실패하면 풀에서 삭제되고 다른 개체를 빌리려고 합니다. |
| false | 개체가 풀로 반환되기 전에 유효성을 검사할지 여부를 나타내는 값입니다. |
| false | 유휴 오브젝트 evictor(있는 경우)에서 오브젝트의 유효성을 검사합니다. 오브젝트의 유효성 검사가 실패하면 풀에서 삭제됩니다. |
| -1 | 유휴 개체 evictor 스레드의 실행 사이에 유휴 상태의 시간(밀리초)입니다. 양수가 아닌 경우 유휴 오브젝트 제거 스레드가 실행되지 않습니다. |
| 3 | 유휴 개체의 각 실행 중에 검사할 오브젝트 수(있는 경우)입니다. |
| 1000 * 60 * 30 | 유휴 오브젝트 제거 대상(있는 경우)을 제거하기 전에 오브젝트가 풀에 유휴 상태로 남아 있을 수 있는 최소 시간입니다. |
6.7.2.2. DBCP2 풀을 구성하는 방법의 예
다음은 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
위의 구성에서 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
완전성을 위해 이전 예제에 연결 풀 구성이 추가된 전체 예제 는 다음과 같습니다. 다시 말해 새로운 Fuse 설치를 시작한다고 가정합니다.
JDBC 드라이버를 설치합니다.
karaf@root()> install -s mvn:mysql/mysql-connector-java/5.1.34 Bundle ID: 223
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()> 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
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()> 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
6.7.3. narayana
연결 풀 모듈 사용
pax-jdbc-pool-narayna
모듈은 pax-jdbc-pool-dbcp2
로 거의 모든 작업을 수행합니다. XA 및 비 XA 시나리오에 대해 DBCP2-specific org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory
를 설치합니다. 유일한 차이점은 XA 시나리오에서 추가 통합 포인트가 있다는 것입니다. org.jboss.tm.XAResourceRecovery
OSGi 서비스는 Narayana 트랜잭션 관리자의 일부인 com.arjuna.ats.arjuna.recovery.RecoveryManager
에서 선택하도록 등록됩니다.
6.7.4. transx
연결 풀 모듈 사용
pax-jdbc-pool-transx
번들에서는 pax- transx-jc-jdbc bundle에서
서비스를 기반으로 합니다. org.ops4j.pax.jdbc
.pool.common.PooledDataSourceFactorypax-transx-jdbc
번들에서는 org.ops4j.pax.transx.jdbc.ManagedDataSourceBuilder
기능을 사용하여 javax.sql.DataSource
Sourcec 풀을 생성합니다. JCA(Java™ Connector Architecture) 솔루션이며 나중에 설명합니다.