WebLogic Server 8.1 릴리스에서 JDBC 하위 시스템의 주요 변경 사항은 다음과 같습니다.
- 커넥션 풀 기능이 완전히 재구현되었습니다.
- 래퍼(Wrapper) 객체 생성에 새로운 동적 프록시(Dynamic Proxy) 생성 기술이 사용되었습니다.
- Prepared Statement 캐시 기능이 완전히 재구현되었습니다.
- 커넥션 풀 및 데이터 소스를 쉽게 구성할 수 있도록 관리자 콘솔에 JDBC Assistant가 추가되었습니다.
이 문서에서는 WebLogic Server JDBC에서 제공하는 새로운 기능 및 향상된 기능에 대해 설명합니다.
2. 소개
JDBC는 WebLogic Server에서 가장 오랜 기간에 걸쳐 가장 일반적으로 사용되고 있는 J2EE API 중 하나입니다. 최근의 몇몇 릴리스를 거치는 동안 새로운 기능과 기존 기능의 향상에 대한 고객들의 요청이 있었습니다. WebLogic 기술팀은 WebLogic Server 8.1의 성능을 향상시키고 이러한 고객의 여러 요청을 반영하기 위해 JDBC 하위 시스템을 다음과 같이 변경했습니다.
- 커넥션 풀 기능이 완전히 재구현되었습니다
- 래퍼(Wrapper) 객체 작성에 새로운 동적 프록시 생성 기술이 사용되었습니다
- Prepared Statement 캐시 기능이 완전히 재구현되었습니다
- 커넥션 풀 및 데이터 소스를 쉽게 구성할 수 있도록 JDBC Assistant가 관리자 콘솔에 추가되었습니다
그 결과 WebLogic Server JDBC를 사용하는 애플리케이션에서 강력한 새로운 기능 및 향상된 기능을 사용할 수 있게 되었습니다.
커넥션 풀
이제 커넥션 풀에는 다음과 같은 기능이 포함됩니다.
- 애플리케이션에 의해 손실되는 커넥션 객체가 커넥션 풀에 의해 자동으로 감지 및 회수됩니다.
- DBMS를 사용할 수 없는 경우에도 커넥션 풀을 만들 수 있습니다.
- 커넥션 요청의 커넥션 대기가 가능합니다. 다음과 같은 옵션을 구성할 수 있습니다.
-
- 시간 제한 완료 전 스레드를 차단한 상태로 커넥션을 얻기까지의 요청 대기 시간
- 커넥션을 얻기 위해 동시에 대기할 수 있는 커넥션 요청 수(이후 추가 동시 요청은 거부됨)
- 커넥션이 생성되거나 새로 고쳐질 때 해당 커넥션에 대해 실행할 수 있는 SQL 명령문
- 동적 구성 – 최대 용량과 같은 대부분의 커넥션 풀 속성을 이제 동적으로 재구성할 수 있습니다. 구성 옵션을 변경한 후 새로운 설정을 적용하기 위해 WebLogic Server를 재시동하거나 커넥션 풀을 재배포하지 않아도 됩니다.
- 커넥션 요청이 실패할 때 특정 오류 조건을 나타낼 수 있도록
java.sql.SQLException
에 WebLogic Server 전용 익스텐션을 제공합니다. - 커넥션 풀의 새로 고침 기능 문제가 다음과 같이 해결되었습니다.
-
- 커넥션을 새로 고칠 때 전체 커넥션 풀이 더 이상 잠기지 않습니다.
- 새로 고치기 위해 풀에서 얻을 수 있는 커넥션 수를 구성할 수 있습니다.
래퍼(Wrapper) 객체
- 이제 애플리케이션이 기본 드라이버 수준의 객체에 의해 구현되는 모든 공용 인터페이스의 메서드에 액세스할 수 있습니다. 더 이상
weblogic.jdbc.vendor.oracle.OracleConnection
과 같은 WebLogic Server 전용 인터페이스로 객체를 캐스팅할 필요가 없으며, 그러한 WebLogic Server 전용 인터페이스에서 정의된 메서드로 액세스가 제한되지도 않습니다. - 이제 애플리케이션이 물리적 커넥션 객체에 액세스할 수 있습니다.
- 애플리케이션 코드가 커넥션 풀과 같은 JVM에서 실행되는 경우 객체가 RMI 래퍼로 래핑되지 않습니다.
Prepared Statement 캐시
- prepared statement 캐시가 이제 동적으로 바뀌었습니다. 이것은 Least Recently Used 알고리즘을 사용하여 현재 캐시된 명령문을 대체합니다.
- 필요에 따라 캐시를 지우거나 비활성화할 수 있습니다.
- prepared statement 캐시는 XA-사용 및 XA-비사용 JDBC 드라이버 모두에 대해 단일 캐시로 구현됩니다. 이전 릴리스에서는 XA 드라이버와 비-XA JDBC 드라이버의 구현 및 구성이 별도로 이루어졌습니다.
JDBC Assistant
- 커넥션 풀 및 데이터 소스 구성을 위한 구성 마법사
- 벤더 전용 JDBC 드라이버 관련 구성 정보(예: URL 구문, 드라이버 클래스 이름 등)의 기술 자료가 포함되어 있으며 튜닝도 가능합니다.
3. 배경
J2EE 애플리케이션은 일반적으로 JDBC API를 사용하여 관계형 데이터베이스에 저장된 데이터에 액세스합니다. 이 API를 사용하면 벤더 전용 데이터베이스 구문 및 프로토콜과 상관없이 SQL 쿼리를 실행할 수 있으며, SQL 표준에 대한 벤더의 익스텐션에 액세스할 수 있는 메커니즘이 제공됩니다.
JDBC 드라이버는 일반적으로 데이터베이스 벤더 전용 프로토콜을 구현함으로써 DBMS에 대한 커넥션 기능을 제공합니다. 애플리케이션은 JDBC 드라이버를 해당 JVM으로 직접 로드하거나, WebLogic Server와 같은 중간 계층 애플리케이션에 의해 생성되고 유지 관리되는 커넥션 풀을 통해 DBMS에 대한 커넥션을 얻습니다.
커넥션 풀
커넥션 풀이란 데이터베이스(WebLogic Server 시작 시 또는 런타임 중에 동적으로 커넥션 풀이 배포될 때 생성됨)에 대한 동일한 JDBC 커넥션들의 그룹을 지칭합니다. 애플리케이션은 이 풀에서 커넥션을 "빌려" 사용한 다음, 커넥션을 닫아 풀에 반환합니다.
커넥션 풀은 성능 및 애플리케이션 설계와 관련하여 다음과 같은 여러 이점을 제공합니다.
- 커넥션 풀을 사용하는 것이 데이터베이스에 액세스하기 위해 필요할 때마다 각 클라이언트에 대해 새로운 커넥션을 만드는 것보다 훨씬 효율적입니다.
- 애플리케이션에서 DBMS 사용자 이름 및 암호와 같은 세부 사항을 직접 코딩할 필요가 없습니다.
- DBMS에 대한 커넥션 수를 제한할 수 있습니다. 이는 특히 DBMS에 대한 커넥션 수에 따라 라이센싱을 제한하여 관리할 때 유용합니다.
- 애플리케이션 코드를 변경하지 않고도 사용 중인 DBMS를 변경할 수 있습니다.
래퍼(Wrapper) 객체
애플리케이션 코드가 JDBC API 호출을 수행할 때(예: 풀에서 커넥션 얻기 또는 명령문을 실행하고 결과 집합을 다시 가져오기), WebLogic Server는 단순히 JDBC 드라이버에 의해 반환된 객체를 애플리케이션 코드로 전달하는 것이 아닙니다. WebLogic Server는 먼저 WebLogic Server 전용 "래퍼"를 사용하여 객체를 래핑한 다음 이 래퍼 객체를 애플리케이션에 반환합니다.
이러한 작업은 WebLogic Server 및 여기에 배포된 애플리케이션 간에 다음과 같은 조건을 충족시키기 위해 수행됩니다.
- 커넥션 관리
- 트랜잭션 관리
- WebLogic Server 가치 추가
커넥션 관리
커넥션 객체는 DBMS에 대한 물리적 커넥션을 나타냅니다. 커넥션 객체는 비용이 많이 들고 부족한 자원이기 때문에 WebLogic Server는 이러한 객체를 풀링하는 역할을 담당합니다. 따라서 WebLogic Server JDBC는 애플리케이션이 커넥션 객체를 얻거나 커넥션을 닫기 위해 만드는 모든 호출을 가로챔으로써 풀링을 정확히 관리해야 합니다.
트랜잭션 관리
WebLogic Server는 글로벌(XA) 트랜잭션에 대한 트랜잭션 관리자 역할을 수행합니다. 따라서 WebLogic Server는 애플리케이션의 모든 호출을 가로채어 정확히 설정된 트랜잭션 경계 내에서 XA 트랜잭션의 ACID 속성을 보존하며 모든 데이터베이스 작업이 수행되도록 보장해야 합니다.
WebLogic Server 가치 추가
Prepared Statement 캐싱 및 독립 실행형 클라이언트의 RMI를 통한 JDBC 액세스와 마찬가지로 WebLogic Server의 가치를 추가하려면 애플리케이션 호출을 이러한 방식으로 가로채야 합니다.
Prepared statement 캐시
애플리케이션이 prepared statement나 callable statement를 사용하는 경우 애플리케이션 서버와 DBMS 간 또는 DBMS 자체에서의 통신에 상당한 프로세싱 오버헤드가 발생합니다. WebLogic Server는 프로세싱 비용을 최소화하기 위해 애플리케이션에서 사용되는 prepared 및 callable statement를 캐시할 수 있습니다. 애플리케이션이 캐시에 저장된 명령문을 호출하면 WebLogic Server는 캐시에 저장된 명령문을 다시 사용합니다.
prepared 및 callable statement를 다시 사용하면 DBMS에 대한 CPU 사용이 감소되어, 현재 명령문에 대한 성능이 향상되고 여분의 CPU 주기를 다른 작업에 사용할 수 있습니다.
4. 커넥션 풀
WebLogic Server 8.1의 새로운 JDBC 커넥션 풀은 JDBC, 커넥터, JMS 등 여러 하위 시스템 간에 공유되는 새로운 일반 리소스 풀 구현을 기반으로 구축되었습니다. 새로운 커넥션 풀은 다음과 같은 여러 새로운 기능 및 향상된 기능을 제공합니다.
InactiveConnectionTimeoutSeconds
이 기능을 사용하면 예약된 커넥션이 커넥션 풀에 의해 자동으로 회수된 이후의 비활성 시간(초)을 구성할 수 있습니다. 이는 커넥션이 손실되어 결국 모든 커넥션의 커넥션 풀을 비우게 되는 애플리케이션 코드의 문제를 피하는 데 도움이 됩니다.
이 기능을 사용하려면 MBean 구성에서
weblogic.management.configuration.JDBCConnectionPoolMBean
의 "InactiveConnectionTimeoutSeconds
" 속성을 설정하십시오.ConnectionCreationRetryFrequencySeconds
이 기능을 사용하면 DBMS를 현재 사용할 수 없거나 액세스할 수 없는 경우 DBMS에 대한 커넥션 재시도가 자동으로 이루어지도록 커넥션 풀을 구성할 수 있습니다. 또한 DBMS를 현재 사용할 수 없거나 액세스할 수 없는 경우에도 커넥션 풀을 만들고 배포할 수 있습니다.
이 기능을 사용하려면 MBean 구성에서
weblogic.management.configuration.JDBCConnectionPoolMBean
의 "ConnectionsCreationRetryFrequencySeconds
" 속성을 설정하십시오.ConnectionReserveTimeoutSeconds
이 기능을 사용하면 시간 제한 완료 전 스레드를 차단한 상태로 커넥션 풀에서 커넥션을 얻기까지의 요청 대기 시간을 제어할 수 있습니다.
이 기능을 사용하려면 MBean 구성에서
weblogic.management.configuration.JDBCConnectionPoolMBean
의 "ConnectionReserveTimeoutSeconds
" 속성을 설정하십시오.HighestNumWaiters
이 기능을 사용하면 커넥션 풀에서 커넥션을 얻기 위해 대기할 수 있는 최대 동시 요청 수를 제어할 수 있습니다(이후 추가 동시 요청은 거부됨).
이 기능을 사용하려면 MBean 구성에서
weblogic.management.configuration.JDBCConnectionPoolMBean
의 "HighestNumWaiters
" 속성을 설정하십시오.HighestNumUnavailable
이 기능을 사용하면 커넥션을 테스트하거나 또는 필요한 경우 새로 고치는 목적으로 애플리케이션에서 사용할 수 없게 만들 수 있는 풀의 최대 커넥션 수를 제어할 수 있습니다. 이렇게 하면 커넥션을 테스트하고 새로 고치는 동안 전체 풀이 잠기던 이전의 풀 구현 문제가 해결됩니다.
이 기능을 사용하려면 MBean 구성에서
weblogic.management.configuration.JDBCConnectionPoolMBean
의 "HighestNumUnavailable
" 속성을 설정하십시오.TestConnectionsOnCreate
이 기능을 사용하면 새로 만든 커넥션을 테스트할 수 있습니다. 커넥션을 새로 만들거나 새고 고칠 때마다 커넥션 풀 속성 "
TestTableName
"에 지정된 SQL 쿼리를 사용하여 테스트가 수행됩니다.이 기능을 사용하려면 MBean 구성에서
weblogic.management.configuration.JDBCConnectionPoolMBean
의 "TestConnectionsOnCreate" 속성을 설정하십시오.InitSQL
이 기능을 사용하면 커넥션을 만들거나 새로 고칠 때 해당 커넥션에서 실행할 SQL 명령문을 구성할 수 있습니다. 이 기능은 물리적 커넥션 생성 시 이에 대한 1회 초기화를 수행하기 위해 사용됩니다.
이 기능을 사용하려면 MBean 구성에서
weblogic.management.configuration.JDBCConnectionPoolMBean
의 "InitSQL" 속성을 설정하십시오.동적 재구성
대부분의 커넥션 풀 구성 속성을 이제 동적으로 튜닝할 수 있습니다. 새로운 속성 값을 적용하기 위해 WebLogic Server를 재시동하거나 커넥션 풀을 재배포하지 않아도 됩니다.
java.sql.SQLException에 대한 WebLogic Server 확장
JDBC 드라이버가 SQLExceptions를 throw하는 경우, 이러한 예외의 원인을 예외 메시지 내에 포함할 수도 있고 벤더 전용 오류 코드에 둘 수도 있습니다. 이렇게 하려면 애플리케이션이 실패를 진단하기 위해 예외 메시지를 구문 분석할 수 있어야 합니다. WebLogic Server는 이제 애플리케이션이 커넥션 풀에서 커넥션을 얻으려 할 때 발생할 수 있는 특정 실패 조건을 나타낼 수 있도록 java.sql.SQLException에 사용자 지정 익스텐션 유형을 제공합니다.
익스텐션 유형에 대한 자세한 내용은 http://e-docs.bea.com/wls/docs81/javadocs/weblogic/jdbc/extensions/package-summary.html 에서 WebLogic Server JDBC Java Javadoc을 참조하십시오.
5.동적 래퍼
WebLogic Server 8.1 이전에는 애플리케이션으로 반환되는 래퍼 객체가 기본 물리적 객체에 대한 정적 프록시였습니다. 예를 들어 WebLogic Server 7.0의 경우 "
weblogic.jdbc.pool.Connection
" 래퍼 객체는 "weblogic.jdbc.vendor.oracle.OracleConnection
" 인터페이스를 구현했는데, 여기에는 Oracle에서 커넥션 객체에 제공하는 하드 코드된 고유한 익스텐션 목록이 포함되었습니다. 애플리케이션은 WebLogic Server에 의해 반환되는 래퍼 커넥션 객체를 "weblogic.jdbc.vendor.oracle.OracleConnection
"으로 캐스팅하고 해당 목록에서 고유한 메서드 중 하나를 호출할 수 있었습니다.이런 방식을 사용할 경우 WebLogic Server JDBC 래퍼 객체가 컴파일 시 알려지지 않은 기본 물리적 객체의 메서드를 동적으로 찾아내서 래핑하지 못하는 문제가 있었습니다.
WebLogic Server 8.1에서는 래퍼 객체를 만들기 위해 새로운 동적 프록시 생성 기술이 사용되었습니다. 이 새로운 기술을 통해 WebLogic Server JDBC는 이제 다음과 같은 기능을 제공할 수 있습니다.
- 이제 애플리케이션이 기본 물리적 객체에 의해 구현되는 모든 공용 인터페이스의 메서드에 액세스할 수 있습니다. 더 이상
weblogic.jdbc.vendor.oracle.OracleConnection
와 같은 WebLogic Server 전용 인터페이스에 정의된 익스텐션만 사용하도록 제한되지 않으며 객체를 이러한 인터페이스로 캐스팅할 필요도 없습니다. - 이제 애플리케이션이 기본 물리적 커넥션 객체에 액세스할 수 있습니다.
- 애플리케이션 코드가 커넥션 풀과 같은 JVM에서 실행되는 경우 래퍼 객체가 RMI 래퍼로 래핑되지 않습니다.
6. Prepared statement 캐시
이전의 WebLogic Server 릴리스에는 XA-사용 JDBC 드라이버가 사용 중인 경우와 XA-비사용 JDBC 드라이버가 사용 중인 경우를 위해 두 개의 서로 다른 명령문 캐시 구현 방식이 존재했습니다. 이러한 캐시는
JDBCConnectionPoolMBean
의 서로 다른 속성을 사용하여 구성되었으며, 캐시 내용을 대체하기 위해 서로 다른 스키마가 사용되었습니다. 비-XA JDBC 드라이버의 캐시에서는 캐시 항목을 대체할 수 없었던 반면 XA JDBC 드라이버의 캐시에는 Least Recently Used 알고리즘이 사용되었습니다.WebLogic Server 8.1에서는 이 두 가지가 모두 단일 캐시 구현으로 대체되었습니다. 새로운 구현을 통해 애플리케이션에서 다음과 같은 작업을 수행할 수 있습니다.
- 미리 정의된 목록("LRU", "FIXED")으로부터 캐시 동작을 제어하는 알고리즘을 선택합니다.
- 캐시된 prepared statements의 수를 동적으로 재구성합니다.
- 캐시를 동적으로 비활성화하고 지웁니다.
"LRU" 캐싱 알고리즘을 사용하는 경우에는 캐시의 최대 구성 크기에 도달하면, 캐시되어야 하는 추가 명령문에 의해 Least Recently Used 캐시가 대체됩니다. "FIXED" 캐싱 알고리즘을 사용하는 경우에는 캐시의 최대 구성 크기에 도달하면 추가 명령문이 캐시에 추가되지 않습니다.
Prepared statement 캐시에 대한 자세한 내용은 다음을 참조하십시오.
http://e-docs.bea.com/wls/docs81/ConsoleHelp/jdbc_connection_pools.html#statementcache
7. JDBC Assistant
모든 JDBC 드라이버에는 URL, 클래스 이름, 드라이버 속성 등 구성 속성에 대한 고유한 구문이 있습니다. 이전 릴리스에서는 WebLogic Server JDBC 커넥션 풀을 구성할 때 구문을 정확히 알고 직접 지정해야 했습니다.
WebLogic Server 8.1에서는 벤더 전용 JDBC 드라이버 구성 정보에 대한 기술 자료가 포함된 "JDBC Assistant"라는 구성 마법사가 제공됩니다. JDBC Assistant를 사용하면 커넥션 풀을 쉽게 구성할 수 있으며, 벤더 전용 구성 세부 사항에 대해 염려할 필요가 없습니다. 이러한 정보는 사용자가 튜닝할 수도 있습니다.
JDBC Assistant에 대한 자세한 내용은 http://edocs.bea.com/wls/docs81/ConsoleHelp/jdbc_connection_pools.html에서 찾아 볼 수 있습니다.