이번에는 JEUS에서 DB와의 연결기능을 제공하는
DataSource와 DBConnectionPool에 대해 알아보도록 하겠습니다.
▣ 제목
DataSource와 DBConnectionPool이란 무엇인가?
▣ 내용
1. JDBC란?
Java DataBase Connectivity.
Java에서 DataBase와 연동하기 위한 표준 기술을 말한다.
DB의 종류와는 상관 없이 표준 API를 사용하여 DB와의 연동을 할 수 있다.(물론 SQL은 DB별로 달라질 수 있음)
일반적은 JDBC 코딩 절차
1. JDBC Driver를 로딩 or 등록
2. DB에 대한 Connection 생성
(DB와 소켓 연결이 되고 DB에 session 하나가 생성됨)
3. 수행할 SQL에 대해 Statement를 생성하고 Statement의 SQL을 수행
(DB에서 SQL이 수행되고 cursor가 생성됨)
4. 3의 결과로 ResultSet이 생성되고 이것으로 부터 SQL의 수행결과를 조회함.
5. 반드시 ResultSet, Statement를 close
6. 반드시 Connection을 close
(DB와 소켓 연결이 해제되고 DB의 session도 소멸됨)
위의 경우 문제점
매번 DB와의 Connection을 얻어서 SQL을 수행하는 구조는
DB와의 socket을 connect/close 하는 오버헤드,
DB에서 session의 생성/소멸 하는 오버헤드
가 있으며 이 부분이 실제로 DB의 부하 뿐만 아니라
AP의 수행시간 중 상당시간이 소요하게 된다.
즉, 속도나 부하측면에서 바람직하지 않다.
개선 방법
매번 DB와의 Connection을 얻어서 SQL을 수행하는 구조대신에
한 번 얻어온 DB와의 Connection을 끊지 않고 재사용하는 구조.
1. 먼저 Connection Pool에서는 DB로 부터 Connection을 미리 일정갯수 만큼 얻어와서 가지고 있는다.
2. AP에서 DB Connection이 필요한 경우 직접 DB와 연결을 맺지 않고
Connection Pool에 요청하여 Connection Pool이 가지고 있는 Connection들 중 사용가능한 Connection의
reference를 얻는다.(DB와 Connection을 새로 생성하는 것이 아님)
3. AP에서 필요한 작업을 수행한 후 Connection Pool로 사용했던 Connection을 반납한다.
이 때 Connection의 생성과 관계되는 어떠한 작업도 하지 않으며
기존에 DB로 부터 얻어온 Connection을 계속 재사용하게 된다.
Pooling을 하는 것과 하지 않는 것의 수행시간 차이는 수십배에 달한다.
2. WAS에서 DB Connection Pooling 기능을 제공하지 않았던 시절에는?
해당 프로젝트의 선임급 개발자가 직접 DB Connection Pooling 기능을 하는 모듈을 작성하거나,
이미 공개되어있는 Connection Pool 라이브러리를 가져다 사용하였다.
직접 작성한 것이나 공개된 모듈은 안정성이나 여러 장애 상황에 취약한 점이 있다.(상용 WAS에서 제공하는 것에 비해)
그리고 구현된 API가 각 라이브러리 마다 천차만별이어서 서로 호환성이 없고
Connection Pool에서 Connection을 get, put 하는 코드가 서로 달랐다.
3. JEUS 에서 제공하는 DataBase Connection Pooling 기능
* DBConnectionPool
2번 항목에서 설명한 것과 동일한 형태의 Connection Pool 모듈이다.
Web Container(Servlet Engine)에 설정(container.xml, WEBMain.xml)하며 2번 항목의 것과 마찬가지로
Connection을 얻는 코드가 표준적이지 않다.
* DataSource
J2EE 스펙에서 정의되어 있는 DB 연결방식이다.
Pooling 기능을 제공하며, XA(분산트랜잭션) 기능을 제공한다.
즉, DBConnectionPool 과 기능상 동일하며 XA 기능을 제공한다.
DataSource는 JNDI 에 등록되어 있고, 표준화된 API를 사용하여 얻어올 수 있다.
J2EE Application(Servlet, JSP, EJB, ...)을 호환성있게 작성하려면 DataSource를 사용하여야 한다.
JEUS 서버 환경(JeusMain.xml, JEUSMain.xml)에 설정한다.
* 두 모듈의 장단점
DataSource를 사용하기 위해서는 JNDI 기반의 API를 사용하여 lookup하는 과정이 필요하다.
이 때 InitialContext 생성 및 lookup 시간에 약간의 시간이 더 소요된다.
DBConnectionPool은 DriverManager나 Driver 기반의 API를 사용하므로
DataSource에 비해 속도가 (아주)약간 빠르다.
대신 DBConnectionPool은 J2EE 표준이 아니다.
만일 J2EE 스펙에 맞추어 개발해야 하거나, XA 기능을 사용하거나, EJB를 사용한다면
DataSource를 사용해야 한다.
두 모듈의 기능적인 차이는 없다. 요즘은 대부분 DataSource를 사용하는 추세이다.
DBConnectionPool
▣ 내용
DBConnectionPool은 JEUS의 Servlet Engine에서 제공해 주는 DB Connection Pool이다.
이전 TechLetter에서 설명한 바와 같이 DBConnectionPool은 J2EE 표준이 아니며,
특정한 코드를 사용하여 Connection을 Pool 로 부터 얻어올 수 있다.
DBConnectionPool은 Servlet Engine이 존재하는 JVM에서만 참조할 수 있다.
Servlet Engine1에서 설정한 DBConnectionPool을 Servlet Engine 2에서 얻어올 수 없다는 이야기다.
간단한 샘플(JEUS 4.x, Oracle)
WEBMain.xml
-----------------------------------------------------------
<web-container>
...
<db-connection-pool>
<pool-name>oraclePool</pool-name>
<pool-type>shared</pool-type>
<connection-url>jdbc:oracle:thin:@192.168.0.2:1521:ora9i</connection-url>
<driver-class-name>oracle.jdbc.driver.OracleDriver</driver-class-name>
<connection-argument>user=scott;password=tiger</connection-argument>
<dynamic-increment>false</dynamic-increment>
<close-long-active-connection>true</close-long-active-connection>
<max-active-time>300000</max-active-time>
<db-pool-control>
<min>2</min>
<max>10</max>
<step>2</step>
<max-idle-time>300000</max-idle-time>
</db-pool-control>
</db-connection-pool>
...
</web-container>
-----------------------------------------------------------
설정항목(반드시 메뉴얼 참조하여 설정값의 의미를 정확하게 알아둘 것)
* pool-name
DBConnectionPool의 이름. AP에서 DBConnectionPool을 찾을 때 사용.
* pool-type
DBConnectionPool내의 Connection을 worker thread들이 공유할지 여부.
반드시 shared로 사용할 것.
* connection-url
해당 DB에 접속하기 위한 JDBC connection URL. DB마다 다름
* driver-class-name
JDBC driver의 class name. DB마다 다름.
* connection-argument
DB에 connection을 맺을 때 넘겨줄 정보. ";"로 구분.
기본적으로 user, password를 포함해야 하고 기타 다른 옵션을 포함할 수 있음.
* dynamic-increment
DBConnectionPool의 connection 갯수가 max에 도달하였을 때
AP로 부터 connection 요청이 있는 경우에 DB와 Connection을 임시적으로 증가시킬지 여부.
true라면 connection을 DB로 부터 하나 더 맺어서 AP에 넘겨주고, AP에서 해당 connection을
반납하면 해당 connection은 DBConnectionPool로 반납하는 것이 아니라 DB와의 연결을
완전히 해제해 버린다.
false이면 DBConnectionPool에 다른 AP가 connection을 반납할 때 까지 대기한다.
* close-long-active-connection
Pool로 부터 AP가 얻어간 connection이 <max-active-time> 동안 반환되지 않고 있는 경우에
timeout으로 간주하고 강제로 connection을 회수하여 Pool로 반납한다.
단, DB connection pool monitoring interval을 주기로 하여 검사하기 때문에
반드시 여기에 지정된 시간과 일치하지는 않는다.
* max-active-time
Pool로 부터 얻어온 connection의 timeout을 판단하는 시간주기
* min
Pool의 초기 갯수
* max
Pool의 최대 갯수
* step
min -> max로 증가할 때의 증가폭
* max-idle-time
DBConnectionPool 내의 connection 갯수가 min과 max 사이인 경우
DBConnectionPool은 자체적으로 max 에서 min으로 줄어들려는 시도를 한다.
이 때 이값을 초과하는 connection이 있는 경우 DBConnectionPool에서 제거하는 기준이 된다.
DBConnectionPool로 부터 Connection을 얻는 코드
메뉴얼을 보면 3종류의 코드가 나와 있으나 JDBC driver의 동기화와 관련된 문제가 많이 발생하기 때문에
반드시 반드시(매우 중요) 아래의 코드를 사용하도록 한다.
Driver myDriver = (Driver)Class.forName("jeus.jdbc.pool.Driver").newInstance();
Connection conn = myDriver.connect("jdbc:jeus:pool:oraclePool", null);
빨간글씨는 pool-name에 지정한 문자열이다.
▣ 참고사항
위의 설정예에서 설명한 설정항목은 기본적인 항목을 설명한 것이며
이외의 다른 수많은 설정항목이 존재하므로 반드시 메뉴얼을 숙지하여
사이트 지원시 적절하게 구성하여야 한다.
장애나 속도 저하를 유발할 수 있으므로
의미를 알 수 없는 설정이 있는 경우에는 반드시 메뉴얼이나 선배사원에게 문의 후 사용할 것.
이하 설정예.(사이트 지원시 복사/수정해서 사용하도록 한다.)
JEUS 3.x
=========================================================
Oracle
-----------------------------
<DBConnectionPool
ConnectionPoolID="sharedOraclePool"
ConnectionPoolType="shared"
ConnectionURL="jdbc:oracle:thin:@harry.freens.org:1521:ORA9i"
DriverClassName="oracle.jdbc.driver.OracleDriver"
ConnectionArguments="user=system;password=manager"
CloseLongActiveConnection="true"
MaxActiveTimeSecs="60">
<DBPoolControl
InitCapacity="2"
MaxCapacity="10"
IncrementRate="2"
MaxIdleTimeSecs="300"/>
</DBConnectionPool>
MS-SQL
--------------------------------
<Container>
...
</ContextGroup>
...
<DBConnectionPool MaxUseCount="-1"
ConnectionPoolType="shared"
CloseDelayMillis="-1"
MaxActiveTimeSecs="-1"
ConnectionPoolID="mssql_pool"
ConnectionArguments="user=sa;password=xxx"
DriverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
DynamicIncrement="true"
ConnectionURL="jdbc:microsoft:sqlserver://165.141.142.136:1433"
LoginDelayMillis="-1"
CloseLongActiveConnection="false"
ConnectionTimeOutSecs="10">
<DBPoolControl
MaxCapacity="10"
InitCapacity="5"
MaxIdleTimeSecs="300"
IncrementRate="2" />
</DBConnectionPool>
...
</Container>
Informix
----------------------------------
<DBConnectionPool
ConnectionPoolID="infor"
ConnectionPoolType="shared"
ConnectionURL="jdbc:informix-sqli://tmaxs1:1526/kangto94:informixserver=ids921"
DriverClassName="com.informix.jdbc.IfxDriver"
ConnectionArguments="user=informix;password=hope123"
CloseLongActiveConnection="false"
MaxActiveTimeSecs="60"
DynamicIncrement="false"
ConnectionTimeOutSecs="10">
<DBPoolControl
InitCapacity="4"
MaxCapacity="10"
IncrementRate="2"
MaxIdleTimeSecs="300"/>
</DBConnectionPool>
DB2
--------------------------------------
<DBConnectionPool
ConnectionPoolID="ibmPool"
ConnectionPoolType="shared"
ConnectionURL="jdbc:db2:KFBCIDB"
DriverClassName="COM.ibm.db2.jdbc.app.DB2Driver"
ConnectionArguments="user=db2cibt;password=kfbcibt01"
CloseLongActiveConnection="false"
MaxActiveTimeSecs="60"
DynamicIncrement="false"
ConnectionTimeOutSecs="10">
<DBPoolControl InitCapacity="0"
MaxCapacity="25"
IncrementRate="5"
MaxAliveTimeSecsWhenRequest="300"
MaxIdleTimeSecs="300"/>
</DBConnectionPool>
JEUS 4.x
=========================================================
Oracle
---------------------------------
<web-container>
...
<db-connection-pool>
<pool-name>oraclePool</pool-name>
<pool-type>shared</pool-type>
<connection-url>jdbc:oracle:thin:@192.168.0.2:1521:ora9i</connection-url>
<driver-class-name>oracle.jdbc.driver.OracleDriver</driver-class-name>
<connection-argument>user=scott;password=tiger</connection-argument>
<dynamic-increment>true</dynamic-increment>
<close-long-active-connection>true</close-long-active-connection>
<max-active-time>300000</max-active-time>
<db-pool-control>
<min>2</min>
<max>10</max>
<step>2</step>
<max-idle-time>300000</max-idle-time>
</db-pool-control>
</db-connection-pool>
...
</web-container>
Sybase
-------------------------------------
<db-connection-pool>
<pool-name>sybaseTest</pool-name>
<pool-type>shared</pool-type>
<pooling-rule>stack</pooling-rule>
<!-- sybase script examples ip : listen port -->
<connection-url>jdbc:sybase:Tds:166.104.172.31:4000</connection-url>
<driver-class-name>com.sybase.jdbc2.jdbc.SybDriver</driver-class-name>
<connection-argument>user=aaa;password=bbbb</connection-argument>
<db-pool-control>
<min>3</min>
<max>10</max>
</db-pool-control>
</db-connection-pool>
MS-SQL
------------------------------------------
<web-container>
...
<db-connection-pool>
<pool-name>mssql_pool</pool-name>
<pool-type>shared</pool-type>
<connection-url>jdbc:microsoft:sqlserver://165.141.142.136:1433</connection-url>
<driver-class-name>com.microsoft.jdbc.sqlserver.SQLServerDrive</driver-class-name>
<connection-argument>user=sa;password=</connection-argument>
<dynamic-increment>true</dynamic-increment>
<close-long-active-connection>true</close-long-active-connection>
<max-active-time>300000</max-active-time>
<db-pool-control>
<min>2</min>
<max>10</max>
<step>2</step>
<max-idle-time>300000</max-idle-time>
<max-alive-time>600000</max-alive-time>
</db-pool-control>
</db-connection-pool>
...
</web-container>
MySQL
---------------------------------------------
<web-container>
...
<db-connection-pool>
<pool-name>mysqlPool</pool-name>
<pool-type>shared</pool-type>
<connection-url>jdbc:mysql://localhost:3306/test</connection-url>
<driver-class-name>org.gjt.mm.mysql.Driver</driver-class-name>
<connection-argument>user=root;password=passwd</connection-argument>
<dynamic-increment>true</dynamic-increment>
<close-long-active-connection>true</close-long-active-connection>
<max-active-time>300000</max-active-time>
<db-pool-control>
<min>2</min>
<max>10</max>
<step>2</step>
<max-idle-time>300000</max-idle-time>
<max-alive-time>600000</max-alive-time>
</db-pool-control>
</db-connection-pool>
...
</web-container>
▣ 제목
DataSource
▣ 내용
J2EE 표준?
DataSource는 J2EE 스펙에 포함되어 있다.
이 말은 J2EE Application 작성에서 DB와의 연동은 DataSource를 사용하는 것이 바람직하고
Connection을 얻는 코드나 사용법, 동작 등이 표준화 되어 있다는 말이다.
즉, 타 WAS로의 소스 수정 없이 migration 가능하다.
그리고 connection Pooling 뿐만 아니라 DBConnectionPool에서는 제공하지 않는 분산 환경에서의 Transaction(XA)
기능을 제공한다.(EJB에서는 반드시 DataSource를 사용해야 한다.)
DataSource는 JNDI 기반의 코드로 얻어온다.
DataSource는 JNDI 서버에 등록되어 있다가 InitialContext의 lookup() 메소드로 얻어올 수 있다.
즉, 원격(다른 JVM)에서도 InitialContext를 생성하여 DataSource를 얻어서 사용할 수 있다.
DataSource의 장점
1. JDBC 코딩시 DB정보에 대한 하드코딩이 필요없다. 설정은 JEUSMain.xml에 들어간다.
2. Pooling이 지원된다.
3. XA(분산트랜젝션)이 지원된다.
4. J2EE 표준이다.(모든 WAS에서의 사용 코드 동일)
5. 다른 JVM에서도 호출하여 사용할 수 있다.
JEUS에서 DataSource의 설정과 생성
DataSource는 JeusMain.xml(or JEUSMain.xml)에 설정한다.
JEUS는 기동시 jeus manager가 DataSource 설정을 읽어들여 JNDI에 DataSource를 등록(BIND)한다.
하지만 이 과정에서 DB와의 Connection이 생성되지는 않는다.
DataSource를 lookup()하는 JVM에 Pool이 생성되고 DB와의 Connection을 맺어서 Pool에 집어넣게 된다.
물론 최초 lookup 시에 한번만 Pool 초기화/생성이 이루어지게 된다.
(lookup 이 호출되기 이전에는 Pool이 생성되지 않음에 주의)
요약하면, DataSource는 jeus manager가 JNDI에 bind 시키며 DataSource를 JNDI에서 최초로 lookup할 때
(lookup하는)해당 JVM에서는 Pool이 생성되고 DB와 connection을 생성한다.
샘플로 알아보자(환경 : JEUS 4.x, Oracle)
----------------------------------------------------------
<jeus-system>
...
<resource>
<data-source>
<database>
<vendor>oracle</vendor>
<export-name>jdbc/mohwDS</export-name>
<data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>
<data-source-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-name>
<data-source-type>ConnectionPoolDataSource</data-source-type>
<database-name>dbs001</database-name>
<user>gworks</user>
<password>gworks</password>
<server-name>152.99.129.41</server-name>
<port-number>1521</port-number>
<driver-type>thin</driver-type>
<connection-pool>
<pooling>
<min>20</min>
<max>50</max>
<step>5</step>
<period>10</period>
</pooling>
<wait-free-connection>
<enable-wait>true</enable-wait>
<wait-time>15000</wait-time>
</wait-free-connection>
<operation-to>180000</operation-to>
</connection-pool>
</database>
</data-source>
...
</resource>
----------------------------------------------------------
설정항목
* database
이 태그 하나가 DataSource 설정 1개를 나타낸다.
* vendor
DB제공업체. oracle, db2, sybase, others 등의 값을 갖는다.
* export-name
JNDI에 등록될 이름. JNDI에 등록될 이름은 중복되면 안된다.
* data-source-class-name
DataSource에서 사용될 JDBC driver내의 class name.
DB 마다 다르며 data-source-type에 따라서도 달라진다.
* data-source-name
일반적으로 data-srouce-class-name을 따른다.
* data-source-type
용도에 따라 DataSource, ConnectionPoolDataSource, LocalXADataSource, XADataSource 중 선택
* database-name
Database의 이름. Oracle은 SID.
* user
DB의 user. OS의 user와는 별개임.
* password
DB user의 password
* server-name
DB 의 IP or hostname. hostname을 사용할 경우 hosts 파일에 등록되어 있어야 함.
* port-number
DB 의 listen port
* driver-type
JDBC driver type. DB 마다 다름.
* min
Pool의 최소값
* max
Pool의 최대값
* step
min에서 max로 증가시 증가폭
* period
max에서 min으로 감소할 때 제거할 connection 판단 기준시간.(주의 : 분단위임.)
* wait-free-connection
pool의 connection이 모두 사용중이어서 사용가능한 connection이 없을 때
AP에서 getConnection()을 호출한 경우의 동작에 대한 설정부분.
enable-wait이 true이면 wait-time에 지정된 시간만큼 기다리고
false이면 대기하지 않고 (아마도)null을 리턴할 것이다.(or Exception 발생)
만일 wait-time에 지정된 시간만큼 기다려도 connection을 얻지 못하는 경우는
Exception이 던져진다.
* operation-to
DB와의 연동 작업시 time out 시간.
이외에도 많은 설정항목이 있으므로 반드시 메뉴얼을 숙지하여
각 설정항목에 대해 명확히 이해하도록 한다.
DataSource의 4가지 type
* DataSource
Connection만 반환한다. Pooling 기능 없음.
* ConnectionPoolDataSource
Pooling 기능을 하며 connection을 반환한다.
* XADataSource
Pooling 기능을 하며 XA(분산트랜젝션)을 지원하는 connection을 반환한다.
* LocalXADataSource
Pooling 기능을 하며 connection을 반환한다.
Local DB(단일 DB에 단일 user를 사용하는 경우)인 경우 XADataSource처럼 동작한다.(트랜젝션 지원)
일반적으로 트랜젝션 지원이 필요없는 작업에는 ConnectionPoolDataSource를 사용한다.
트랜젝션이 지원되는 DataSource인 경우에는 ConnectionPoolDataSource보다
시스템과 DB에 부하를 많이 주게 된다.
트랜젝션 지원이 필요한 작업(EJB, UserTransaction 등)에는 XADataSource나 LocalXADataSource를
사용한다. LocalXADataSource는 실제로는 ConnectionPoolDataSource이지만
단일DB(단일user)에 대해서는 XA처럼 동작하는 DataSource이다.
따라서 multi-DB가 아닌 경우에는 트랜젝션이 필요한 경우에 LocalXADataSource를 사용하는 것이
속도나 부하 측면에서 유리하다.
그리고 DataSource type에 따라서 <data-source-class-name>, <data-source-name> 의 설정값이
달라지므로 주의한다.
type별 class name
DataSource
For Oracle : oracle.jdbc.pool.OracleDataSource
For Sybase : com.sybase.jdbc2.jdbc.SybDataSource
For db2: COM.ibm.db2.jdbc.DB2DataSource
ConnectionPoolDataSource and LocalXADataSource
For Oracle : oracle.jdbc.pool.OracleConnectionPoolDataSource
For Sybase: com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource
For db2: COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource
XADataSource
For Oracle : oracle.jdbc.xa.client.OracleXADataSource
For Sysbae : com.sybase.jdbc2.jdbc.SybXADataSource
For db2: COM.ibm.db2.jdbc.DB2XADataSource
▣ 참고사항
XADataSource는 트랜젝션을 container에서 관리하기 때문에
AP에서 명시적인 트랜젝션 관리(Connection.setAutocommit(xxx), commit(), rollback())는
Exception이 발생한다.
XADataSource를 사용하는 경우에 트랜젝션에 포함되지 않는 select 문장의 수행은
원칙적으로 ConnectionPoolDataSource를 사용해야하나
개발의 편의를 위해 select 문장의 수행도 XADataSource를 사용하는 경우에는
반드시 transaction delegation 기능을 사용하여야 한다.
EJB에서 트랜젝션을 사용할 경우나 UserTransaction을 사용할 경우
반드시 XADataSource나 LocalXADataSource를 사용하여야 한다.
DataSource는 JEUS 시스템 내(servlet engine, ejb engine, jms engine 등) 뿐만 아니라
단독 java application에서도 JNDI의 lookup 코드를 사용하여 DataSource기능을 사용할 수 있다.
단, DB의 Connection Pool은 JNDI 서버내에 생기는 것이 아니라 해당 JVM에 생기고
Pool은 해당 JVM의 종료시에 소멸된다.
JEUS 3.x 설정샘플
=================================================
Oracle
--------------------------
<JeusSystemConfig>
<DataSource>
<Database>
<Vendor>oracle</Vendor>
<ExportName>dbsource</ExportName>
<DatabaseName>orcl</DatabaseName>
<DataSourceClassName>oracle.jdbc.pool.OracleConnectionPoolDataSource</DataSourceClassName>
<DataSourceName>oracle.jdbc.pool.OracleConnectionPoolDataSource</DataSourceName>
<ServiceName/>
<Description/>
<NetworkProtocol/>
<Password>tiger</Password>
<PortNumber>1521</PortNumber>
<ServerName>192.168.85.1</ServerName>
<User>scott</User>
<DriverType>thin</DriverType>
<DataSourceType>ConnectionPoolDataSource</DataSourceType>
<ConnectionPool>
<MinPoolSize>2</MinPoolSize>
<MaxPoolSize>6</MaxPoolSize>
<IncreasingStep>1</IncreasingStep>
<ResizingPeriod>10</ResizingPeriod>
<OperationTimeout>30000</OperationTimeout>
<WaitForFreeConnection>
<WaitingTime>10000</WaitingTime>
</WaitForFreeConnection>
</ConnectionPool>
</Database>
</DataSource>
MS-SQL
----------------------------
<Database>
<Vendor>unknown</Vendor>
<ExportName>sqlDS</ExportName>
<DataSourceClassName>jeus.jdbc.driver.blackbox.BlackboxConnectionPoolDataSource</DataSourceClassName>
<Property>
<Name>URL</Name>
<Type>java.lang.String</Type>
<Value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=testDB;SelectMethod=cursor</Value>
</Property>
<Property>
<Name>DriverClassName</Name>
<Type>java.lang.String</Type>
<Value>com.microsoft.jdbc.sqlserver.SQLServerDriver</Value>
</Property>
<Property>
<Name>Password</Name>
<Type>java.lang.String</Type>
<Value>iidol</Value>
</Property>
<Property>
<Name>User</Name>
<Type>java.lang.String</Type>
<Value>iidol</Value>
</Property>
<DataSourceType>ConnectionPoolDataSource</DataSourceType>
<ConnectionPool>
<MinPoolSize>1</MinPoolSize>
<MaxPoolSize>2</MaxPoolSize>
<IncreasingStep>1</IncreasingStep>
<ResizingPeriod>10</ResizingPeriod>
<OperationTimeout>30000</OperationTimeout>
<WaitForFreeConnection>
<WaitingTime>10000</WaitingTime>
</WaitForFreeConnection>
</ConnectionPool>
</Database>
Sybase
---------------------------
<DataSource>
<Database>
<Vendor>sybase</Vendor>
<ExportName>test_sy</ExportName>
<DatabaseName>master</DatabaseName>
<DataSourceName>com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource</DataSourceName>
<Description>test11</Description>
<NetworkProtocol />
<Password>xlaortm</Password>
<PortNumber>4100</PortNumber>
<ServerName>pollux5</ServerName>
<User>sa</User>
<DriverType />
<DataSourceType>ConnectionPoolDataSource</DataSourceType>
<ConnectionPool>
<MinPoolSize>6</MinPoolSize>
<MaxPoolSize>10</MaxPoolSize>
<IncreasingStep>2</IncreasingStep>
<ResizingPeriod>3</ResizingPeriod>
</ConnectionPool>
</Database>
</DataSource>
Informix
-----------------------------
<DataSource>
<Database>
<Vendor>unknown</Vendor>
<ExportName>datasource1</ExportName>
<DataSourceClassName>jeus.jdbc.driver.blackbox.BlackboxConnectionPoolDataSource</DataSourceClassName>
<Property>
<Name>URL</Name>
<Type>java.lang.String</Type>
<Value>jdbc:informix-sqli://61.33.32.126:1526/bank959:informixserver=tmax5</Value>
</Property>
<Property>
<Name>DriverClassName</Name>
<Type>java.lang.String</Type>
<Value>com.informix.jdbc.IfxDriver</Value>
</Property>
<Property>
<Name>Password</Name>
<Type>java.lang.String</Type>
<Value>7skswkddl</Value>
</Property>
<Property>
<Name>User</Name>
<Type>java.lang.String</Type>
<Value>root</Value>
</Property>
<DataSourceType>ConnectionPoolDataSource</DataSourceType>
<ConnectionPool>
<MinPoolSize>4</MinPoolSize>
<MaxPoolSize>4</MaxPoolSize>
<IncreasingStep>1</IncreasingStep>
<ResizingPeriod>10</ResizingPeriod>
<OperationTimeout>30000</OperationTimeout>
<WaitForFreeConnection>
<WaitingTime>10000</WaitingTime>
</WaitForFreeConnection>
</ConnectionPool>
</Database>
</DataSource>
JEUS 4.x
======================================================
DB2
--------------------------------
<jeus-system>
. . .
<resource>
<data-source>
<database>
<vendor>db2</vendor>
<export-name>db2local</export-name>
<data-source-class-name>
COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource
</data-source-class-name>
<data-source-type>LocalXADataSource</data-source-type>
<database-name>SAMPLE</database-name>
<description>Customer DB</description>
<password>jeus2013</password>
<encryption>false</encryption>
<port-number>0</port-number>
<server-name/>
<user>db2inst1</user>
<connection-pool>
<pooling>
<min>2</min>
<max>4</max>
<step>1</step>
<period>10</period>
</pooling>
<wait-free-connection>
<enable-wait>true</enable-wait>
<wait-time>10000</wait-time>
</wait-free-connection>
<operation-to>30000</operation-to>
</connection-pool>
</database>
. . ..
</data-source>
. . .
</resource>
</jeus-system>
Oracle
----------------------------
<jeus-system>
<resource>
<data-source>
<database>
<vendor>oracle</vendor>
<export-name>jdbc/mohwDS</export-name>
<data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>
<data-source-type>ConnectionPoolDataSource</data-source-type>
<database-name>dbs001</database-name>
<data-source-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-name>
<user>gworks</user>
<password>gworks</password>
<port-number>1521</port-number>
<server-name>152.99.129.41</server-name>
<driver-type>thin</driver-type>
<connection-pool>
<pooling>
<min>20</min>
<max>50</max>
<step>5</step>
<period>10</period>
</pooling>
<wait-free-connection>
<enable-wait>true</enable-wait>
<wait-time>15000</wait-time>
</wait-free-connection>
<operation-to>180000</operation-to>
</connection-pool>
</database>
</data-source>
...
</resource>
Sybase
-----------------------
<resource>
<data-source>
<database>
<vendor>sybase</vendor>
<export-name>pms</export-name>
<data-source-class-name>com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource</data-source-class-name>
<data-source-type>ConnectionPoolDataSource</data-source-type>
<database-name>smaf</database-name>
<data-source-name>com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource</data-source-name>
<description>pms DB</description>
<network-protocol>Tds</network-protocol>
<user>smaf</user>
<password>smaf2003</password>
<encryption>false</encryption>
<port-number>6100</port-number>
<server-name>210.103.193.3</server-name>
<connection-pool>
<pooling>
<min>10</min>
<max>100</max>
<step>5</step>
<period>10</period>
</pooling>
<wait-free-connection>
<enable-wait>true</enable-wait>
<wait-time>10000</wait-time>
</wait-free-connection>
<operation-to>30000</operation-to>
</connection-pool>
</database>
</data-source>
</resource>
Informix
--------------------------
<jeus-system>
. . .
<resource>
<data-source>
<database>
<vendor>others</vendor>
<export-name>informixdatasource</export-name>
<data-source-class-name>
jeus.jdbc.driver.blackbox.BlackboxConnectionPoolDataSource
</data-source-class-name>
<data-source-type>
ConnectionPoolDataSource
</data-source-type>
<connection-pool>
<pooling>
<min>4</min>
<max>8</max>
<step>1</step>
<period>600000</period>
</pooling>
<wait-free-connection>