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-mysqlorg.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.porg.ops4j.pax.jdbc.pool 을 나타냅니다.

번들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

위의 번들은 데이터 소스 자체가 아닌 데이터 소스 팩토리만 설치합니다. 애플리케이션에는 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 드라이버에 전달할 연결 암호입니다.

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

유휴 오브젝트 제거 대상(있는 경우)을 제거하기 전에 오브젝트가 풀에 유휴 상태로 남아 있을 수 있는 최소 시간입니다.

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

위의 구성에서 poolxa 키는 등록된 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 설치를 시작한다고 가정합니다.

  1. JDBC 드라이버를 설치합니다.

    karaf@root()> install -s mvn:mysql/mysql-connector-java/5.1.34
    Bundle ID: 223
  2. jdbc,pax-jdbc-mysqlpax-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)
  3. 팩토리 구성 을 생성합니다.

    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
  4. pax-jdbc-configjavax.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)
  5. 데이터 소스를 사용합니다.

    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.PooledDataSourceFactory 서비스를 기반으로 합니다. pax-transx-jdbc 번들에서는 org.ops4j.pax.transx.jdbc.ManagedDataSourceBuilder 기능을 사용하여 javax.sql.DataSource Sourcec 풀을 생성합니다. JCA(Java™ Connector Architecture) 솔루션이며 나중에 설명합니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.