2009. 6. 2. 09:14

JBoss DataSource 설정





JBoss에서 DataSource 설정 절차

(1) JDBC 라이브러리 설치

     해당 DB 벤더의 JDBC 라이브러리를 $JBOSS_HOME/server/<instance>/lib 디렉터리에 복사한다.

     절대로 어플리케이션과 함께 패키징해서는 안된다. 예를 들어 ojdbc14.jar를 WEB-INF/lib에 두면 다양한 에러를 경험할 수 있다.

 

(2) xxx-ds.xml 작성 및 디플로이

     JBoss에서 데이터소스 설정은 파일명이 -ds.xml로 끝나는 XML 파일을 작성해 deploy 디렉터리에 두면 된다. $JBOSS_HOME/docs/examples/jca 디렉터리를 보면 벤더별 데이터소스 설정 예제들을 볼 수 있다.

 

이제 예제를 통해 설정항목들을 살펴본다.

 $JBOSS_HOME/server/default/deploy/example-ds.xml

 <?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>jdbc/OracleDS</jndi-name>
    <connection-url>jdbc:oracle:thin:@203.231.14.100:1521:XE</connection-url>
    <driver-class>oracle.jdbc.OracleDriver</driver-class>
    <user-name>scott</user-name>
    <password>tiger</password>
    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>


    <min-pool-size>0</min-pool-size>
    <max-pool-size>20</max-pool-size>


    <blocking-timeout-millis>5000</blocking-timeout-millis>
    <idle-timeout-minutes>15</idle-timeout-minutes>


    <prepared-statement-cache-size>100</prepared-statement-cache-size>
    <track-statements>false</track-statements>


    <valid-connection-checker-class-name>
        org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
    </valid-connection-checker-class-name>
    <exception-sorter-class-name>
        org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
    </exception-sorter-class-name>


    <metadata>
         <type-mapping>Oracle9i</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>

 

먼저 root element가 <datasources>로 복수형인게 눈에 띄는데 글자 그대로 하나의 -ds.xml 파일 하나에 여러 개의 데이터소스를 설정할 수 있다.

 

그 하위에 <local-tx-datasource>가 선언되어 있는데 JBoss에서는 트랜잭션 유형에 따라 <local-tx-datasource>, <xa-datasource>, <no-tx-datasource>로 element 레벨에서 구분해서 데이터소스를 설정한다. 분산 트랜잭션 처리를 위해 XA를 사용한다면 <xa-datasource>를, 그렇지 않다면 <local-tx-datasource>를 사용하면 된다.

 

그러면 <local-tx-datasource>로 선언할 때의 기본 설정 항목부터 살펴본다.

 

기본 설정 항목

1) <driver-class>

 위의 example-ds.xml에서와 같이 <local-tx-datasource>를 사용할 경우에는 java.sql.Driver 인터페이스를 구현한 드라이버 클래스를 <driver-class>에 설정한다.

Oracle 8i

oracle.jdbc.driver.OracleDriver

Oracle 9i/10g

oracle.jdbc.OracleDriver

Informix

com.informix.jdbc.IfxDriver

MS SQL

com.microsoft.jdbc.sqlserver.SQLServerDriver

MySQL

com.mysql.jdbc.Driver

 

2) <connection-url>

 DB접속 URL을 명시한다.

Oracle thin

jdbc:oracle:thin:@host:port:sid

Oracle thin (description)

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=port))(CONNECT_DATA=(SERVICE_NAME=sid)))

Oracle oci

jdbc:oracle:oci:@sid

Informix

jdbc:informix-sqli://host:port/dbname:INFORMIXSERVER=servername

MS SQL

jdbc:microsoft:sqlserver://host:port;DatabaseName=dbname

MySQL

jdbc:mysql://host:port/dbname

 

3) <jndi-name>과 <use-java-context>

 JNDI에서 데이터소스를 찾을 때 사용할 이름으로 jdbc/xxx 형식을 사용하는 것을 권장한다.

주의할 점은 데이터소스는 JNDI에 바인딩될 때 java: 네임스페이스로 바인딩된다는 점이다. 이때문에 Context.lookup()시에 java:/jdbc/xxx와 같이 명시해야 데이터소스를 찾을 수 있다.

만약 WebLogic에서 처럼 global하게 바인딩하려면 <use-java-context>false</use-java-context>로 설정하면 된다. 이 때는 Context.lookup()시에 jdbc/xxx로 명시한다.

 

4) <user-name>과 <password>

 DB 접속 계정과 패스워드를 명시한다. 패스워드를 따로 암호화할 필요가 있다면 이전 포스트를 참고한다.

 

5) <transaction-isolation>

트랜잭션 격리 레벨을 설정한다. TRANSACTION_NONE, TRANSACTION_READ_UNCOMMITTED, TRANSACTION_READ_COMMITTED, TRANSACTION_REPEATABLE_READ,
TRANSACTION_SERIALIZABLE 중에서 DB에서 지원하는 레벨을 설정할 수 있다.

 

Connection Pool 크기 설정

1) <min-pool-size>

 Pool에 유지할 최소 connection 개수로 기본값은 0. 기본적으로 최초 getConnection() 호출전까지 물리적인 db connection은 만들어지지 않는다. 데이터소스 디플로이시에 <min-pool-size>만큼 connection을 만들고자 한다면 <prefill>true</prefill>을 추가로 설정해준다.

 

2) <max-pool-size>

 최대 connection 개수를 설정한다. 기본값은 20.

 

각종 Timeout 설정

1) <blocking-timeout-millis>

 모든 connection이 사용중일 때 getConnection()에서 connection이 반환될 때까지 기다릴 시간으로 ms 단위이다.

 

2) <idle-timeout-minute>

 pool에서 일정 시간동안 사용되지 않고 있는 connection을 닫도록 설정할 수 있는데 그 시간을 분 단위로 설정한다.

 

3) <query-timeout>

 query에 대한 응답을 기다리며 대기할 수 있는 시간을 초 단위로 설정한다.  트랜잭션 Timeout이 설정되어 있는 경우에는 <set-tx-query-timeout>true</set-tx-query-timeout>을 추가로 설정해 트랜잭션 timeout까지 남아 있는 시간을 query timeout으로 자동으로 설정할 수 있다.

 

Connection 에러 처리 설정

1) <check-valid-connection-sql>

 getConnection()시 pool에서 어플리케이션에 connection을 반환하기 전에 connection 상태를 체크하는데 사용할 SQL을 명시한다.

 ex) SELECT 1 FRORM DUAL

 

2) <valid-connection-checker-class-name>

 getConnection()시 pool에서 어플리케이션에 connection을 반환하기 전에 connection 상태를 체크하는 DB 벤더별 클래스를 명시한다. Oracle, MySQL에 대한 구현체가 제공된다

Oracle

org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker

MySQL

org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker

 

3) <exception-sorter-class-name>

 SQLException 발생시 connection error를 검출하는데 사용할 클래스를 명시한다. 예외가 Connection 문제로 발생한 경우 해당 connection을 close하게 된다.

Oracle

org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter

MySQL

org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter

Sybase

org.jboss.resource.adapter.jdbc.vendor.SybaseExceptionSorter

Informix

org.jboss.resource.adapter.jdbc.vendor.InformixExceptionSorter

 

4) <background-validation>

 connection 상태를 매번 getConnection()시마다 체크하지 않고 일정주기로 백그라운드에서 체크할지 여부를 설정한다. 기본값은 false이다.

 

5) <background-validation-minutes>

 connection 상태를 백그라운드로 체크하도록 설정한 경우 그 주기를 분 단위로 설정한다. 기본값은 10분

 

최적화 관련 설정 항목

1) <prepared-statement-cache-size>

 PreparedStatement를 캐쉬해서 성능 향상을 꾀한다. 기본값은 0이다. 이 값이 Oracle에 설정된 open_cursor 값 보다 크면 ORA-01000 "maximum open cursors exceeded"가 발생할 수 있다.

 

Connection 초기 설정

1) <new-connection-sql>

 새로 물리적인 connection을 생성할 때 마다 수행할 SQL을 설정한다. DB session 설정이 필요한 경우 유용하다.

  ex) <new-connection-sql>ALTER SESSION SET nls_date_format="YYYY-MM-DD HH24:MI:ss"</new-connection-sql>