9장. 데이터소스 서브시스템

Name

Date

Reason For Changes

Version

오픈나루

2013/11

Initial Version

1.0

전준식, jjeon@opennaru.com

2018/02

Second Version

2.0

이 장에서는 JBoss EAP 6의 데이터소스 개요와 그 설정 방법에 대해 설명한다. 대부분의 웹 애플리케이션들은 데이터베이스에서 정보를 가져와 출력하거나, 입력한 값을 저장하는 것이다. 따라서 데이터베이스와의 연결을 제공하는 데이터소스 서브시스템은 가장 많이 사용되는 서브시스템이다.

앞으로 JBoss EAP 6의 데이터소스의 구조에 대해 설명한 후 실제 데이터소스 설정 방법을 순서대로 설명한다.

09-1.데이터소스 서브시스템에 대해

  • 데이터소스란

    데이터소스란 데이터베이스에 연결하는 방법을 캡슐화한 것으로 RDBMS와 상관없이 공통의 인터페이스를 사용해 연결할 수 있도록 하는 방식이다. 데이터베이스 드라이버나 URL에 대한 정보를 애플리케이션에서 분리하여 서버 측에서 별도로 관리하기 때문에, 애플리케이션은 데이터소스를 네이밍 서비스에서 룩업하여 가져다가 데이터베이스 연결을 사용할 수 있다. 이 네이밍 서비스는 Java Naming and Directory Interface (이하, JNDI)를 사용하고 있기 때문에, 애플리케이션에서 룩업할 때 데이터소스의 JNDI 이름만 있으면 된다.

데이터베이스와의 연결 관리는 클라이언트 애플리케이션이 아닌 JBoss EAP 6에서 하게 된다. 비교적 비용이 많이 소요되는 데이터베이스와의 연결도 풀 형태로 관리하여 데이터베이스 연결에 대한 부하를 최소화한다.

  • 데이터소스 관련 리소스

    JBoss EAP 6의 데이터소스 서브시스템은 Java 표준 데이터소스와 JDBC 드라이버 리소스를 하나로 통합하여 관리한다.

데이터소스 리소스에서는 데이터소스의 동작에 대한 여러 가지 설정을 할 수 있다. 또, 이 리소스를 여러 개 작성하여 데이터소스를 여러 개 정의할 수 있다.

JDBC 드라이버 리소스에서는 모듈 형태로 참조하기 위한 설정이 필요하다. 여기서 말하는 모듈은 JDBC 드라이버의 jar 파일을 EAP 6용 모듈로 만드는 것이다. JBoss EAP 6에서는 클래스 패스가 없어 jar 파일을 직접 참조하지 않기 때문에, 데이터소스에서 사용하는 JDBC 드라이버도 모듈화해야 한다.

JBoss EAP 6에서 데이터소스를 만들려면, JDBC 드라이버를 모듈로 설치하고 데이터소스를 정의해야 한다.

데이터소스는 일반 데이터소스(Non-XA)와 XA 데이터소스 두 가지 형태가 있다.

XA 데이터소스는 하나의 트랜잭션이 여러 데이터베이스에 걸쳐 사용되는 경우에 사용된다. 그래서 XA 데이터소스를 사용하게 되면 오버 헤드가 늘어나게 된다.

Non-XA데이터소스는 한 개의 데이터베이스에 대해서만 트랜잭션을 사용하는 애플리케이션에서 사용한다.

관리 콘솔 또는 CLI에서 데이터소스를 만들 때, 애플리케이션의 요구사항에 따라 데이터소스를 XA데이터소스로 만들지, Non-XA 데이터소스로 만들지 결정하게 된다.

JDBC란?

JDBC API는 Java 애플리케이션이 데이터베이스에 접근하는 방법을 정의하는 표준이다. JDBC 드라이버를 참조하는 데이터소스는 애플리케이션 서버에서 설정한다. 그런 다음 애플리케이션에서는 애플리케이션 서버에서 설정한 데이터소스를 룩업하여, 표준 JDBC API를 사용하여 코드를 작성하면, 드라이버가 그 코드를 해당 데이터베이스에 사용할 수 있도록 변환하여 실행한다. 따라서 애플리케이션에서 JDBC 드라이버를 참조하는 코드를 한 번만 작성하면 어떤 데이터베이스에도 사용할 수 있다.

JDBC 4.0 표준은 다음 사이트에 정의되어 있다.http://jcp.org/en/jsr/detail?id=221

JPA와 데이터소스

|최근에는 Java EE의 애플리케이션에서 데이터베이스에 접근하는 경우 JPA를 사용하는 경우가 있다. JPA는 O/R맵핑 아키텍처를 사용하는 Java 프레임워크이며 Java EE6 표준이다. JPA를 사용하면, Java의 오브젝트 구조와 데이터베이스의 테이블 구조가 자동으로 변환되기 때문에 애플리케이션의 코딩 및 데이터베이스 변경이 쉬워진다. JPA에서 데이터베이스에 접근할 때에도 데이터소스를 사용한다.

09-2.MariaDB 설치

이 책에서 데이터소스 테스트에 MariaDB 데이터베이스를 사용한다. MariaDB는 MySQL의 후속 데이터베이스로 오라클 소유의 불확실한 MySQL의 라이선스 상태에 반발하여 MySQL과 같은 소스코드를 기반으로 만들어졌다. MySQL 핵심 개발자들이 설립한 MariaDB Foundation에서 개발하고 있다.

Maria라는 이름은 핵심 개발자인 Michael Widenius의 둘째 딸 이름에서 따온 것이라고 한다. 재미있게도 My는 첫째 딸 이름이다. 부모가 같은 소스를 기반으로 하므로 MySQL과 MariaDB는 자매 관계라고 부를 수 있다.

MariaDB는 MySQL과 소스코드가 같아서 5.5버전까지는 사용 방법과 구조가 같다. 차이점이 있다면, 성능이다. MariaDB는 MySQL과 비교해 복제 속도가 약 4~5천 배 빠르며, 성능도 최고 70% 정도 향상되었다.

새롭게 추가된 기능들도 많다. MariaDB에는 새로운 저장 엔진인 Aira 뿐만 아니라 InnoDB를 교체할 수 있는 XtraDB 저장 엔진을 포함하고 있다. 스레드 풀이나 샤딩 기술도 제공한다.

MariaDB의 사용 방법은 이 책에서 설명하지 않는다. 자세한 사용 방법은 http://www.mariadb.org를 참고하라.

JBoss EAP 6의 데이터소스 서브시스템 설정을 위해, 먼저 RHEL(CentOS) 6.x에 MariaDB를 설치하자.

따라해보기

  1. MariaDB 레파지토리 설정

  2. MariaDB 설치

  3. MariaDB 시작

  4. 암호 설정

  5. 데이터베이스 연결 확인

  1. MariaDB 레파지토리 설정

    먼저 MariaDB의 YUM 레파지토리를 설정한다.

    $ *sudo vi /etc/yum.repo/mariadb.repo*

    mariadb.repo의 파일 내용은 다음과 같다.

    # MariaDB 5.5 CentOS repository list - created 2013-12-15 04:12 UTC
    
    # http://mariadb.org/mariadb/repositories/
    
    [mariadb]
    
    name = MariaDB
    
    baseurl = http://yum.mariadb.org/5.5/centos6-amd64
    
    gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
    
    gpgcheck=1
  1. MariaDB 설치

    다음 명령을 입력하여 MariaDB 서버를 설치한다.

    $ sudo yum install MariaDB-server MariaDB-client
  1. MariaDB 시작

    MariaDB를 시작한다. 5.5버전까지는 MySQL과 사용방법이 같다.

    $ sudo /etc/init.d/mysql start
  1. 암호 설정

    MariaDB root 패스워드와 원격 접속 등을 설정한다.

    $ sudo mysql_secure_installation
    RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
    
    SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
    
    In order to log into MariaDB to secure it, we'll need the current
    
    password for the root user. If you've just installed MariaDB, and
    
    you haven't set the root password yet, the password will be blank,
    
    so you should just press enter here.
    
    Enter current password for root (enter for none): [엔터]
    
    OK, successfully used password, moving on...
    
    Setting the root password ensures that nobody can log into the MariaDB
    
    root user without the proper authorisation.
    
    Set root password? [Y/n] [엔터]
    
    New password: [password 입력]
    
    Re-enter new password: [password 입력]
    
    Password updated successfully!
    
    Reloading privilege tables..
    
    ... Success!
    
    By default, a MariaDB installation has an anonymous user, allowing anyone
    
    to log into MariaDB without having to have a user account created for
    
    them. This is intended only for testing, and to make the installation
    
    go a bit smoother. You should remove them before moving into a
    
    production environment.
    
    Remove anonymous users? [Y/n] [엔터]
    
    ... Success!
    
    Normally, root should only be allowed to connect from 'localhost'. This
    
    ensures that someone cannot guess at the root password from the network.
    
    Disallow root login remotely? [Y/n] n
    
    ... skipping.
    
    By default, MariaDB comes with a database named 'test' that anyone can
    
    access. This is also intended only for testing, and should be removed
    
    before moving into a production environment.
    
    Remove test database and access to it? [Y/n] n
    
    ... skipping.
    
    Reloading the privilege tables will ensure that all changes made so far
    
    will take effect immediately.
    
    Reload privilege tables now? [Y/n] [엔터]
    
    ... Success!
    
    Cleaning up...
    
    All done! If you've completed all of the above steps, your MariaDB
    
    installation should now be secure.
    
    Thanks for using MariaDB!
  1. 데이터베이스 연결 확인

    MariaDB 클라이언트로 MariaDB 서버에 연결하여 테스트한다.

    $ mysql -u root -p
    
    Enter password: [패스워드 입력]
    
    Welcome to the MariaDB monitor. Commands end with ; or \g.
    
    Your MariaDB connection id is 14
    
    Server version: 5.5.34-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]> use test;
    
    Database changed
    
    MariaDB [test]> show tables;
    
    Empty set (0.00 sec)
    
    MariaDB [test]>

09-3.JDBC 드라이버 등록

JBoss EAP 6 에서 JDBC 드라이버를 등록하는 두 가지의 방법이 있다. 하나는 JDBC 드라이버인 jar 파일 자체를 애플리케이션처럼 배포하여 등록하는 방법과 JDBC 드라이버 jar 파일을 모듈 형태로 패키징하여 등록하는 방법이다. 다음의 표는 두 가지 JDBC 드라이버 등록 방법에 대한 비교표이다.

  • JDBC 드라이버 등록 방법 - jar 파일 배포와 모듈 패키지 배포의 비교

    항목 jar 파일 배포 모듈형태 배포

    설치 방법

    jar 파일로 배포하는 경우에 동적 모듈로 인식하여 데이터소스로부터 참조 가능한 상태가 된다.

    •$JBOSS_HOME/modules 디렉터리 아래에 복사하여 모듈화한다. 이러한 커스텀 모듈은 다른 모듈로부터 의존관계(dependencies)로 참조되는 경우 사용된다.

    도메인 관리 여부

    도메인 환경에서 여러 개의 인스턴스를 관리하는 경우 배포도 일괄 관리할 수 있어, 여러 개의 인스턴스가 사용하고 있는 JDBC 드라이버를 일괄적으로 버전 업그레이드하는 관리가 가능하다.

    커스텀 모듈은 도메인모드의 관리 대상이 아니어서, 여러 개의 노드에 대해 일괄 관리할 수 없다.

    JDBC 드라이버 패키지

    JDBC 드라이버가 여러 개의 jar 파일로 구성된 경우, 배포하면 다른 모듈로 인식되기 때문에, 이 방법을 사용할 수 없다.

    모듈을 정의할 때 jar 파일을 여러 개 지정할 수 있기 때문에 JDBC 드라이버의 jar 파일이 여러 개일 경우에도 사용할 수 있다.

    표 1. JDBC 드라이버 배포 방법 비교

위의 두 가지 방법은 설치나 사용 조건이 달라서, 필요에 따라서 구분하여 사용하여야 한다.

다음에서 두 가지 방법에 대해서 JDBC 드라이버의 설치 방법을 순서대로 설명한다. 관리 리소스의 /subsystem=datasources 리소스 아래에 jdbc-driver라는 리소스 타입이 존재한다. JAR 파일을 배포하여 설치하는 경우 jdbc 리소스를 작성할 필요는 없지만, 커스텀 모듈을 작성하여 설치하는 경우에는 jdbc 에 대한 모듈 리소스를 작성해야 한다.

JDBC 드라이버 다운로드

데이터베이스에 연결하려면 먼저 데이터베이스 벤더에서 제공하는 JDBC 드라이버가 필요하다. 사용하려는 데이터베이스 벤더가 제공하는 JDBC 드라이버를 다음 표의 URL에서 다운로드 받을 수 있다. 이 책에서는 MariaDB를 사용하고 있어 ‘MariaDB Client Library for Java Applications’을 다운로드 받는다.

Vendor 다운로드 위치

MariaDB

https://downloads.mariadb.org/

MySQL

http://www.mysql.com/products/connector/

PostgreSQL

http://jdbc.postgresql.org/

Oracle

http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

IBM DB2

http://www-306.ibm.com/software/data/db2/java/

Sybase

http://www.sybase.com/products/allproductsa-z/softwaredeveloperkit/jconnect

Microsoft SQL Server

http://msdn.microsoft.com/data/jdbc/

표2. JDBC 드라이버 다운로드 위치

배포를 통한 JDBC 드라이버 설치

따라하기

  1. JDBC jar 파일 다운로드

  2. DataSource 등록

  3. DataSource 속성 등록

  4. JDBC 드라이버 선택

  5. JDBC Connection 정보 입력

  6. 등록 데이터소스 [Enable]

  7. 데이터소스 [Enable] 확인

  8. Test Connection 선택

  9. JDBC 데이터소스 테스트 확인

  1. JDBC jar 파일 다운로드

    다음의 URL에서 JDBC 드라이버를 다운로드 한다.

    • MariaDB Client Library for Java Applications 1.1.5 Stable- https://downloads.mariadb.org/client-java/1.1.5/

    • JDBC 드라이버 jar 파일의 배포는 일반 애플리케이션과 마찬가지로 관리도구를 사용하면 된다. 관리 콘솔로 JDBC 드라이버를 설치하는 방법은 일반적인 애플리케이션archive파일을 배포하는 것과 같다.

      아래는 관리 CLI를 사용해 JDBC 드라이버 mariadb-java-client-1.1.5.jar를 설치하는 예이다.

      [standalone@localhost:9999 /] *deploy /EAP6book/download/mariadb-java-client-1.1.5.jar*
  1. DataSource 등록

    image

  1. DataSource 속성 등록

    데이터소스에 대한 JNDI 이름 등록

    image

  1. JDBC 드라이버 선택

    설치한 MariaDB JDBC 드라이버 선택

    image

  1. JDBC Connection 정보 입력

    ‘Connection Settings’ 입력 값은 다음 표와 같다.

    항목 설정 값

    Connection URL

    jdbc:mysql://locahost:3306/test

    Username

    root

    Password

    password

    Security Domain

    (공백)

    Connection 설정 부분은 아래의 그림과 같습니다.

    image

  1. 등록 데이터소스 [Enable]

    image

  1. 데이터소스 [Enable] 확인

    image

  1. Test Connection선택

    image

  1. JDBC 데이터소스 테스트 확인

    image

모듈로 JDBC 드라이버 설치

배포하는 방법과 마찬가지로 MariaDB JDBC 드라이버를 모듈로 등록하는 방법을 살펴보자.

MariaDB 용 JDBC 드라이버 모듈로 등록하는 절차는 다음과 같다.

따라하기

  1. JDBC 드라이버 다운로드

  2. 사용자 모듈 배포를 위한 layers.conf 파일 작성

  3. 모듈배포를 위한 디렉터리 생성

  4. JDBC 드라이버 복사

  5. module.xml 파일 작성

  6. JDBC 드라이버등록

  1. JDBC 드라이버 다운로드

    다음URL에서 JDBC 드라이버를 다운로드한다.

    MariaDB Client Library for Java Applications 1.1.5 Stable- https://downloads.mariadb.org/client-java/1.1.5/

  1. 사용자 모듈 배포를 위한 layers.conf 파일 작성

    사용자 모듈을 별도의 디렉터리에 보관하기 위해 layers.conf 파일을 작성한다.

    $ *vi $JBOSS_HOME/modules/system/layers/layers.conf*

    파일의 내용은 다음과 같다.

    layers=ext
  1. 모듈 배포를 위한 디렉터리 생성

    $JBOSS_HOME/modules/system/layers/ext/ 디렉터리 아래와 같은 파일 경로를 생성한다. MariaDB의 경우 다음과 같이 디렉터리를 생성한다.

    $ *mkdir -p $JBOSS_HOME/modules/system/layers/ext/org/mariadb/main*
  1. JDBC 드라이버 복사

    $ *cd /EAP6book/download*
    
    $ *cp mariadb-java-client-1.1.5.jar $JBOSS_HOME/modules/system/layers/ext/org/mariadb/main/*
  1. module.xml 파일 작성

    $JBOSS_HOME/system/layers/base/org/mariadb/main/ 디렉터리에 다음 내용과 같은 MariaDB를 위한 module.xml 파일을 만든다.

    $ cd $JBOSS_HOME/modules/system/layers/ext/org/mariadb/main
    
    $ vi module.xml

    module.xml 파일의 내용은 다음과 같다.

    <?xml version="1.0" encoding="UTF-8"?>
    <module xmlns="urn:jboss:module:1.1" name="org.mariadb">
      <resources>
        <resource-root path="mariadb-java-client-1.1.5.jar"/>
      </resources>
      <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.servlet.api" optional="true"/>
      </dependencies>
    </module>

    모듈 이름 org.mariadb는 모듈의 디렉터리 구조와 같아야 한다.

  1. JDBC 드라이버등록

    JBoss 인스턴스를 시작하고, CLI를 사용하여 모듈로 등록한 MariaDB 드라이버를 등록한다.

    $ cd $JBOSS_HOME/bin
    
    $ ./standalone.sh

    JBoss CLI를 시작한다.

    $ cd $JBOSS_HOME/bin
    
    $ ./jboss-cli.sh -c

    모듈을 등록한다.

    [standalone@localhost:9999 /] /subsystem=datasources/jdbc-driver=mariadb:add(driver-name=mariadb,driver-module-name=org.mariadb)
    {"outcome" => "success"}

CLI의 module 명령을 사용한 등록방법

아래와 같이 CLI의 module 명령을 사용하여 JDBC 드라이버를 등록할 수도 있다.

따라하기

  1. JDBC 드라이버를 모듈로 등록

  2. JDBC 드라이버 등록

  3. JDBC 드라이버 확인

  4. CLI를 사용한 데이터소스 등록

  5. 데이터소스 Enable

  6. 테이터소스 연결 테스트

  7. 등록된 module에 대한 정보 확인

  1. JDBC 드라이버를 모듈로 등록

    [standalone@localhost:9999 /] module add --name=system.layers.ext.org.mariadb --resources=/EAP6book/download/mariadb-java-client-1.1.5.jar --dependencies=javax.api,javax.transaction.api
  1. JDBC 드라이버 등록

    [standalone@localhost:9999 /] */subsystem=datasources/jdbc-driver=mariadb:add(driver-module-name=system.layers.ext.org.mariadb,driver-name=mariadb,driver-xa-datasource-class-name=org.mariadb.jdbc.jdbc2.optional.MysqlXADataSource)*
    {"outcome" => "success"}
  1. JDBC 드라이버 확인

    • JDBC 드라이버 리스트

      [standalone@localhost:9999 /] jdbc-driver-info
      
      NAME SOURCE
      
      h2 com.h2database.h2/main
      
      mariadb system.layers.ext.org.mariadb/main
    • JDBC 드라이버 등록 정보 확인

      [standalone@localhost:9999 /] jdbc-driver-info mariadb
      
      driver-name mariadb
      
      deployment-name n/a
      
      driver-module-name system.layers.ext.org.mariadb
      
      module-slot main
      
      driver-datasource-class-name
      
      driver-xa-datasource-class-name org.mariadb.jdbc.jdbc2.optional.MysqlXADataSource
      
      driver-class-name org.mariadb.jdbc.Driver
      
      driver-major-version 1
      
      driver-minor-version 1
      
      jdbc-compliant false
  1. CLI를 사용한 데이터소스 등록

    [standalone@localhost:9999 /] */subsystem=datasources/data-source=MariaDB_DS:add(jndi-name="java:jboss/datasources/MariaDB_DS",use-java-context=true,user-name=root,password=password,connection-url="jdbc:mysql://localhost:3306/test",min-pool-size=20,max-pool-size=50,driver-name=mariadb,flush-strategy=FailingConnectionOnly)*
    {"outcome" => "success"}
  1. 데이터소스 Enable

    [standalone@localhost:9999 /] *data-source enable --name=MariaDB_DS*
  1. 테이터소스 연결 테스트

    [standalone@localhost:9999 /] */subsystem=datasources/data-source=MariaDB_DS:test-connection-in-pool*
    {
      "outcome" => "success",
      "result" => [true]
    }
  1. 등록된 module에 대한 정보 확인

    module 명령 실행 후 $JBOSS_HOME/modules 디렉터리 아래를 확인하면, module커멘드로 정의한 커스텀 모듈이 작성된 것을 확인 할 수 있다.

    • 등록된 module에 대한 정보 확인

      $ cd $JBOSS_HOME/modules/system/layers/ext/org/mariadb/main
      
      $ ls
      
      mariadb-java-client-1.1.5.jar module.xml
    • 해당 디렉터리의 module.xml 을 확인해 보면 다음과 같다.

      <?xml version="1.0" ?>
      <module xmlns="urn:jboss:module:1.1" name="system.layers.ext.org.mariadb">
        <resources>
          <resource-root path="mariadb-java-client-1.1.5.jar"/>
        </resources>
        <dependencies>
          <module name="javax.api"/>
          <module name="javax.transaction.api"/>
        </dependencies>
      </module>

모듈 등록 시 사용하는 파라미터

표3. 모듈 등록 시 사용하는 주요 파라미터

속성 설명 예제

name

  • 모듈 이름을 지정

  • 이 모듈 이름은 $JBOSS_HOME/modules 디렉터리로부터의 상대 경로를 ‘. ‘로 연결한 것이다.

org.mariadb

resource

모듈화 대상이 되는 리소스를 지정. 절대 경로 또는 `$JBOSS_HOME/bin`부터의 상대 경로로 지정

/EAP6book/download/mariadb-java-client-1.1.5.jar

dependencies

  • 의존관계(dependencies)를 지정

  • 여러 개를 지정하려면 컴마로 구분한다.

  • JDBC 드라이버는 javax.api와 javax.transaction.api를 지정해야 한다.

  • javax.api

  • javax.transaction.api

09-4.데이터소스 관련 주요 CLI

데이터소스 등록하는 CLI 명령

다음 CLI는 ‘MariaDB_DS’ 데이터소스를 추가하는 명령이다.

[standalone@localhost:9999 /] /subsystem=datasources/data-source=MariaDB_DS:add(jndi-name="java:jboss/datasources/MariaDB_DS ",use-java-context=true,user-name=root,password=password,connection-url="jdbc:mysql://localhost:3306/test",min-pool-size=20,max-pool-size=50,driver-name=mariadb,flush-strategy=FailingConnectionOnly)
{"outcome" => "success"}

데이터소스 확인 하는 CLI 명령

JBoss EAP 6에서는 기본적으로 ExampleDS 라는 샘플 데이터소스가 정의되어 있다.

[standalone@localhost:9999 /] /subsystem=datasources:read-resource
{
  "outcome" => "success",
  "result" => {
    "xa-data-source" => undefined,
    "data-source" => {
      "ExampleDS" => undefined,
      "MariaDB_DS" => undefined
    },
    "jdbc-driver" => {
      "h2" => undefined,
      "mariadb" => undefined
    }
  }
}

여기에 표시되는 data-source와 xa-data-source가 데이터소스의 리소스 타입이다.

data-source와 xa-data-source의 차이는 JTA나 JTS의 분산 트랜잭션의 XA리소스로 사용할 수 있는지에 따라 다르다. 즉, data-source는 분산 트랜잭션를 지원하지 않는 데이터소스이며, xa-data-source는 분산 트랜잭션을 지원한다. 애플리케이션에서 분산 트랜잭션을 사용하는지에 따라 필요한 데이터소스 설정 항목이 달라서 JBoss EAP 6에서도 두 종류의 데이터소스 리소스 타입을 지원한다. 일반적으로 data-source를 Non-XA데이터소스라고 부르고, xa-data-source를 XA데이터소스라고 한다.

데이터소스는 Non-XA 데이터소스와 XA데이터소스의 두 가지 모두를 정의할 수도 있다. 두 가지 데이터소스를 함께 사용하는 경우 JNDI이름을 Non-XA와 XA 를 구분할 수 있도록 설정하는 것이 좋다. 데이터소스를 만들 때 JDBC 드라이버가 먼저 설치되어 있어야 한다.

데이터소스 상세 정보 확인

설정은 관리 자원의 /subsystem=datasources/data-source=<추가할 데이터소스명> 자식 속성에 대해서 ‘:write-attirbute’를 사용할 수 있지만, 아래와 같은 data-source 명령으로 설정할 수 있다.

[standalone@localhost:9999 /] data-source read-resource --name=MariaDB_DS

allocation-retry=n/a

allocation-retry-wait-millis=n/a

allow-multiple-users=false

background-validation=n/a

background-validation-millis=n/a

blocking-timeout-wait-millis=n/a

check-valid-connection-sql=n/a

connection-properties=n/a

connection-url=jdbc:mysql://localhost:3306/mysql

datasource-class=n/a

driver-class=n/a

driver-name=mariadb

enabled=true

………..[생략]

jdbc=n/a

pool=n/a

데이터소스 Enable/Disable

새로 작성한 데이터소스는 기본적으로 ‘disable’ 상태이다. ‘enable’로 변경하여야, 애플리케이션에서 사용할 수 있다. ‘disable’ 상태인 Non-XA 데이터소스는 data-source 명령으로 ‘enable’로 변경할 수 있다.

  • 데이터소스 enable

    [standalone@localhost:9999 /] data-source enable --name=MariaDB_DS
    [standalone@localhost:9999 /] /subsystem=datasources/data-source=MariaDB_DS:test-connection-in-pool
    {
      "outcome" => "success"`,
      "result" => [true]`
    }
  • 데이터소스 disable

    사용 중인 Non-XA 데이터소스를 ‘disable’으로 변경하려면 다음과 같은 data-source 명령으로 ‘enable’을 ‘disable’’로 변경할 수 있지만, ‘disable’로 변경할 때는 서버를 재기동할 때까지 설정에 반영하지 않기 때문에, 서버를 재기동하여야 한다. 도메인 모드에서는 reload 명령을 실행하면 서버가 재기동 된다.

    [standalone@localhost:9999 /] data-source disable --name=MariaDB_DS
    operation-requires-reload true
    process-state reload-required
    [standalone@localhost:9999 /] /:reload

    데이터소스가 disable 되어 있을 때 연결에 대해서 연결 테스트를 하게 되면 아래와 같은 에러 메시지가 출력된다.

    [standalone@localhost:9999 /] /subsystem=datasources/data-source=MariaDB_DS:test-connection-in-pool
    {
      "outcome" => "failed",
      "failure-description" => "JBAS010440: failed to invoke operation: JBAS010442: failed to match pool. Check JndiName: java:jboss/datasources/MariaDB_DS",
      "rolled-back" => true
    }

데이터소스 제거 하기

data-source 명령의 remove를 사용하여 데이터소스를 삭제할 수 있다.

[standalone@localhost:9999 /] data-source remove --name=MariaDB_DS

JDBC 드라이버를 확인하는 CLI 명령

  • jdbc-driver-info

    설치된 JDBC 드라이버들을 확인한다.

    [standalone@localhost:9999 /] jdbc-driver-info
    
    NAME SOURCE
    
    h2 com.h2database.h2/main
    
    mariadb-java-client-1.1.5.jar mariadb-java-client-1.1.5.jar
  • jdbc-driver-info mariadb

    JDBC 드라이버에 대한 상세한 정보를 확인한다.

    [standalone@localhost:9999 /] jdbc-driver-info mariadb
    
    driver-name mariadb
    
    deployment-name n/a
    
    driver-module-name system.layers.base.org.mariadb
    
    module-slot main
    
    driver-datasource-class-name
    
    driver-xa-datasource-class-name org.mariadb.jdbc.jdbc2.optional.MysqlXADataSource
    
    driver-class-name org.mariadb.jdbc.Driver
    
    driver-major-version 1
    
    driver-minor-version 1
    
    jdbc-compliant false
  • /subsystem=datasources:installed-drivers-list

    설치된 JDBC 드라이버들에 대한 상세 정보를 표시한다.

    [standalone@localhost:9999 /] /subsystem=datasources:installed-drivers-list
    {
      "outcome" => "success",
      "result" => [
        {
          "driver-name" => "h2",
          "deployment-name" => undefined,
          "driver-module-name" => "com.h2database.h2",
          "module-slot" => "main",
          "driver-datasource-class-name" => "",
          "driver-xa-datasource-class-name" => "org.h2.jdbcx.JdbcDataSource",
          "driver-class-name" => "org.h2.Driver",
          "driver-major-version" => 1,
          "driver-minor-version" => 3,
          "jdbc-compliant" => true
        },
        {
          "driver-name" => "mariadb-java-client-1.1.5.jar",
          "deployment-name" => "mariadb-java-client-1.1.5.jar",
          "driver-module-name" => undefined,
          "module-slot" => undefined,
          "driver-datasource-class-name" => undefined,
          "driver-xa-datasource-class-name" => undefined,
          "driver-class-name" => "org.mariadb.jdbc.Driver",
          "driver-major-version" => 1,
          "driver-minor-version" => 1,
          "jdbc-compliant" => false
        }
      ]
    }

JDBC 드라이버를 제거하는 CLI 명령

  • `/subsystem=datasources/jdbc-driver`에서 JDBC 드라이버 제거하기

    설치된 JDBC 드라이버를 다음과 같은 방법으로 제거한다.

    [standalone@localhost:9999 /] /subsystem=datasources/jdbc-driver=mariadb:remove
    {"outcome" => "success"}
    [standalone@localhost:9999 /] jdbc-driver-info
    
    NAME SOURCE
    
    h2 com.h2database.h2/main
  • module remove 통한 JDBC 드라이버 제거하기

    설치된 JDBC 드라이버를 다음과 같은 방법으로 제거한다.

    [standalone@localhost:9999 /] module remove --name=system.layers.base.org.mariadb

09-5.데이터소스 설정

데이터소스 등록하는 CLI 명령

다음 CLI 명령을 사용하면 이미 설치한 JDBC 드라이버를 사용하여 데이터소스를 만들 수 있다. add 명령의 파라미터로 데이터소스 설정항목들을 입력하였다.

[standalone@localhost:9999 /] /subsystem=datasources/data-source=MariaDB_DS:add(jndi-name="java:jboss/datasources/MariaDB_DS ",use-java-context=true,user-name=root,password=password,connection-url="jdbc:mysql://localhost:3306/test",min-pool-size=20,max-pool-size=50,driver-name=mariadb,flush-strategy=FailingConnectionOnly)
{"outcome" => "success"}

CLI를 사용하여 데이터소스를 추가할 때 파라미터로 사용한 설정항목들은 다음 표와 같다.

항목 설명 설정 예제

connection-url

접속할 데이터베이스에 대한 연결 URL

jdbc:mysql://localhost:3306/test

name

Non-XA 데이터소스 이름

MariaDB_DS

driver-name

사용하는 JDBC 드라이버를 설정.

JDBC 드라이버를 배포하여 사용하는 경우 deployments 디렉터리 아래에 배포한 JDBC 드라이버의 파일명으로 설정한다.

JDBC 드라이버를 모듈 등록해 사용하는 경우는, jdbc-driver에 추가한 리소스 이름을 지정한다.

mariadb

jndi-name

데이터소스를 룩업할 때 사용하는 JNDI명을 설정한다. 이 설정은 ‘java:/’ 또는 ‘java:jboss/’로 시작되는 JNDI명을 지정해야 한다.

java:jboss/datasources/MariaDB_DS

user-name

데이터베이스 사용자 아이디를 설정.

root

password

데이터베이스 사용자 패스워드를 설정한다.

password

jta

JTA사용여부. JTA를 사용한 트랜잭션에 데이터소스를 참가시키려고 할 때 true로 설정한다. JPA에서 데이터소스를 사용하는 경우, persistence.xml의 <jta-data-source>로 정의하면 true로 설정한다.

true

표 4. 데이터소스 설정 시 주요 파라미터

웹 관리 콘솔에서 데이터소스 등록 방법

웹 관리 콘솔을 사용하여 MariaDB 데이터소스를 등록하는 방법은 다음과 같다.

따라하기

  1. 웹 콘솔의 데이터소스 추가

  2. 데이터소스 속성 설정

  3. JDBC 드라이버 선택

  4. JDBC 연결 설정

  5. 데이터소스 Enable

  6. 데이터소스 연결 테스트

  1. 웹 콘솔의 데이터소스 추가

    ‘Profiles’ → ‘Subsystems’ → ‘Connector’ → ‘Datasources’ → ‘JDBC Datasources’ → ‘Add’를 선택한다.

  1. 데이터소스 속성 설정

    Name에 ‘MariaDB_DS’를 입력하고, JNDI Name에 ‘java:jboss/datasources/MariaDB_DS’를 입력한다.

    image

  1. JDBC 드라이버 선택

    maraidb JDBC 드라이버를 선택한다.

    image

  1. JDBC 연결 설정

    Connection URL에 ‘jdbc:mysql://localhost:3306/test’를 입력한다. Username에는 ‘root’, Password에 ‘password’를 입력한다.

    image

  1. 데이터소스 Enable

    등록한 MariaDB_DS를 선택하고 ‘Enable’ 버튼을 클릭한다.

    image

  1. 데이터소스 연결 테스트

    • MariaDB_DS를 선택하고, ‘Connection’ 탭 ‘Test Connection’ 버튼을 클릭하여 데이터소스 연결 테스트를 진행한다.

      image

    • 작성된 데이터소스에 대한 연결을 확인한다.

      image

09-6.XA JDBC 드라이버와 데이터소스 설정

XA데이터소스 작성 및 설정 방법에 대해 설명한다. XA 데이터소스를 설정하기 위해서는 먼저 분산 트랜잭션을 지원하는 JDBC 드라이버가 설치되어 있어야 한다.

XA데이터소스를 추가하는 절차도 Non-XA 데이터소스를 추가하는 절차와 같이 ‘데이터소스 등록’ ‘연결 정보 수정’ ‘JDBC 드라이버 선택’ ‘데이터소스 Enable’ 순서로 설정한다.

XA데이터소스

다음에서 MariaDBXA_DS라는 이름의 XA 데이터소스를 작성한다. xa-data-source 자원을 추가하려면, 아래와 같은 항목들을 설정해야 한다.

항목 설명 설정 예제

connection-url

접속할 데이터베이스에 대한 연결 URL

jdbc:mysql://localhost:3306/mysql

name

XA 데이터소스 이름

MariaDB_XA_DS

driver-name

사용할 JDBC 드라이버 이름을 설정.

JDBC 드라이버를 배포하여 사용하는 경우 deployments 디렉터리 아래의 JDBC 드라이버의 파일명으로 설정한다.

JDBC 드라이버를 모듈로 등록해 사용하는 경우 jdbc-driver에 추가한 이름을 사용한다.

mariadb

jndi-name

데이터소스를 lookup 할 때에 사용하는 JNDI 이름을 설정. 이 설정은 ‘java:/’나 ‘java:jboss/’로 시작하는 JNDI이름을 사용하여야 한다.

java:/MariaDB_XA_DS

user-name

데이터베이스 사용자 이름을 설정.

root

password

데이터베이스 사용자에 대한 패스워드.

password

jta

JTA사용여부. JTA를 사용한 트랜잭션에 데이터소스를 참가시키려고 할 때 true로 설정한다. JPA에서 데이터소스를 사용하는 경우, persistence.xml의 <jta-data-source>로 정의하면 true로 설정한다.

true

표 5. XA 데이터소스 주요 설정 항목

Non-XA 데이터소스에서 data-source라는 명령을 사용해 데이터소스를 등록하고 설정했지만, XA데이터소스에서는 xa-data-source라는 명령을 사용한다.

XA데이터소스를 추가하려면 아래와 같이 xa-data-source 명령을 사용한다.

CLI를 사용한 MariaDB XA데이터소스 등록방법을 따라 해 보자.

따라하기

  1. 데이터소스 등록

  2. 연결 정보설정

  3. JDBC 드라이버 선택

  4. 데이터소스 Enable

  5. 데이터소스 연결 테스트

  1. 데이터소스 등록

    [standalone@localhost:9999 /] /subsystem=datasources/xa-data-source="MariaDB_XA_DS":add(jndi-name="java:/MariaDB_XA_DA",driver-name=mariadb,user-name=root,password=password)
    {"outcome" => "success"}
  1. 연결 정보설정

    connection 프로퍼티는 RDBMS와 접속하기 위한 설정 정의이다. 설정할 수 있는 프로퍼티 항목은 사용하려는 JDBC 드라이버에 따라서 다르다.

    XA데이터소스의 경우 xa-datasource-properties 자원을 사용해 이것를 설정한다.

    설정할 수 있는 프로퍼티에 대한 상세한 정보는 JDBC 드라이버를 제공하는 각 벤더의 웹 사이트에서 확인하여야 한다. 데이터베이스마다 설정하는 프로퍼티 이름이 달라서 주의하여야 한다.

    [standalone@localhost:9999 /] /subsystem=datasources/xa-data-source=MariaDB_XA_DS/xa-datasource-properties=URL/:add(value="jdbc:mysql://localhost:3306/test")
    {"outcome" => "success"}
  1. JDBC 드라이버 선택

    [standalone@localhost:9999 /] */subsystem=datasources/xa-data-source=MariaDB_XA_DS/:write-attribute(name=xa-datasource-class,value=org.mariadb.jdbc.MySQLXAResource)*
    {"outcome" => "success"}
  1. 데이터소스 Enable

    XA데이터소스도 Non-XA 데이터소스와 같이 추가된 후 바로 사용할 수 없다. xa-data-source 명령을 사용해 XA데이터소스를 사용함으로 변경해야 한다.

    [standalone@localhost:9999 /] */subsystem=datasources/xa-data-source=MariaDB_XA_DS:enable*
    {"outcome" => "success"}
  1. 데이터소스 연결 테스트

    [standalone@localhost:9999 /] */subsystem=datasources/xa-data-source=MariaDB_XA_DS:test-connection-in-pool*
    {"outcome" => "success"}

추가로 사용 중인 XA데이터소스를 사용하지 않으려면 위의 xa-data-source 명령의 ‘enable’ 파라미터를 ‘disable’으로 변경하면 된다. 다만, Non-XA 데이터소스와 같이 ‘disable’ 로 설정 후에는 서버를 재기동 하여야 한다.

09-7.주요 속성

데이터소스 Connection Pool 공통 파라미터

애플리케이션에서 DB커넥션이 병목이 되는 경우, 커넥션 풀 설정을 한다. 커넥션 풀 수 설정에서 Non-XA 및 XA 공통의 데이터소스 자원의 주요한 속성은 아래 표와 같다.

항목 설명 기본 값

min-pool-size

커넥션 풀에서 유지하는 최소 연결 수

지정한 커넥션 수만큼 풀에서 커넥션을 생성하지만, 시기는 prefill 속성에 따라 다르다.

0

max-pool-size

커넥션 풀에서 유지하는 최대 연결 수

20

prefill

커넥션 풀을 미리 채우도록 설정

  • 데이터소스를 작성할 때 min-pool-size 로 지정된 수의 연결을 미리 맺어 풀 안에 확보할 것인지를 true / false 로 지정한다.

  • prefill 이 true 인 경우에는 min-pool-size 개수 만큼의 연결이 풀에 생성된다.

  • prefill 이 false 인 경우에는 커넥션 풀에서 최초의 커넥션이 연결될 때 min-pool-size 에 지정된 수만큼 커넥션이 생성된다.

false

use-strict-min

커넥션 풀에 연결된 개수가 최소값 이상으로 정확하게 생성되어 있는지 확인한다.

false

flush-strategy

연결에 오류가 있는 경우 풀에 있는 연결에 대한 처리 방법을 설정한다. 설정할 수 있는 옵션은 다음과 같다.

  • FailingConnectionOnly : 연결 오류가 발생한 연결만 제거한다.

  • IdleConnections : Idle 상태의 연결을 제거한다.

  • EntirePool : 모든 연결을 제거한다.

FailingConnectionOnly

allow-multiple-users

여러 사용자가 getConnection (user, password) 메서드를 사용하여 데이터소스에 접근할 때 사용하는 옵션이다.

표 6. 데이터소스의 주요 공통 파라미터

min-pool-size과 max-pool-size을 같게 설정하는 이유

일반적으로 커넥션 풀의 최솟값은 시스템의 일반적인 운영 상태에서 정상적인 DB 동시 액세스 수나 성능 요건에 따라 값을 지정한다.

커넥션 풀의 최댓값은 장애가 발생할 때나 피크 시간에서 DB에 동시 접근할 수 있도록 여유 있는 값을 설정한다. DB 서버 성능 요건 (동시에 몇 개의 트랜잭션를 처리할 수 있는지)에 따라 제한하는 등 시스템에 따라 설정 값을 지정한다.

실제의 운영이나 부하 테스트 시 애플리케이션이 DB 커넥션을 얻기 위해 대기하는 시간이 문제가 되는 경우 연결 풀의 최댓값을 늘린다.

pool-prefill 속성에 대해서는 애플리케이션이 맨 처음DB 연결 시 연결 대기 시간이 발생하는 것이 시스템상 문제가 되는 경우 true로 설정한다.

데이터소스 장애 감지 옵션

커넥션 풀 안의 Idle 상태 커넥션에 대해 정기적 혹은 애플리케이션 스레드에서 연결을 맺기 전에 연결에 대한 유효성 검증을 한다.

JDBC 데이터소스 커넥션 풀에 대한 장애 감지를 위한 파라미터들은 다음과 같다.

항목 설명 기본 값

valid-connection-checker

유효성 점검을 하기 위한 클래스 이름을 지정한다.

  • org.jboss.jca.adaptors.jdbc.ValidConnectionChecker 인터페이스의 구현.

  • 연결이 끊기면 예외가 발생.

  • check-valid-connection-sql 보다 이 파라미터가 우선

  • 데이터베이스에 따라 클래스의 이름이 다르다.

MySQL에 대한 설정 예는 다음과 같다.

<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>

-

check-valid-connection-sql

  • 커넥션 풀의 유효성을 확인하는 SQL 문을 지정

  • 유효성 검증을 하려면, 이 속성은 또는 valid-connection-checker-class-name둘 중 하나를 지정한다.

new-connection-sql

  • 데이터베이스 연결을 생성할 때 맨 처음 한 번만 특정 초기화 SQL 을 보내고 싶은 경우에 설정한다.

validate-on-match

  • getConnection()을 사용하여 연결을 얻어오는 시점에서 커넥션이 정상인지 검사하는 옵션으로 true로 지정하는 것을 권장한다.

  • background validation과 함께 사용할 수 없는 옵션이다.

False

background-validation

  • 연결하는 시점에서 유효성을 확인하는 것이 아니라 백그라운드 스레드를 사용하여 유효성을 확인한다.

  • validate-on-match 과 함께 사용할 수 없는 옵션이다.

background-validation-millis

  • 0보다 큰 값을 지정하여 백그라운드 스레드에서 연결을 검사(분 단위) 한다. 커넥션 풀에서 사용 중인 연결은 지정된 밀리 초 간격으로 연결을 체크한다. 기본값 0으로 사용하지 않도록 설정되어 있다.

0

use-fast-fail

  • 애플리케이션에서 커넥션을 가져 올 때 유효성 검증에서 에러가 발생했을 때 커넥션을 어떻게 전달할지 제어하는 파라미터이다.

  • validate-on-match 옵션을 true로 하면 풀에서 가져온 연결을 사용할 수 없는 경우 풀에서 다음 연결을 가져오는 것이 아니라, 새로운 연결을 생성한다. 예를 들어 데이터베이스를 다시 시작하는 경우와 같이 모든 연결을 사용할 수 없게 된 경우 빨리 다시 연결할 수 있도록 하기 위한 옵션이다. 하지만 다른 연결에 대해 체크를 하지 않기 때문에 사용할 수 없는 연결이 풀에 남아 있게 된다. use-fast-fail을 false로 설정하면 반대로 모든 연결을 확인하고 삭제한 후 새로운 연결을 하나 만들게 된다. 이 경우 풀의 연결은 하나만 만들어지며, min-pool-size 만큼 만들지 않는다. 백그라운드에서 연결이 삭제되는 경우엔 min-pool-size까지 회복하게 된다.

false

flush-strategy

  • 연결에 오류가 있는 경우 풀에 대한 플래시 정책을 설정한다.

stale-connection-checker

  • 오래되어 사용되지 않는 연결을 체크하는 클래스를 설정한다. 데이터베이스마다 클래스 이름이 다르다.

  • 오라클 데이터베이스에 대한 설정은 다음과 같고, MySQL은 지원하지 않는다.

<stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/>

exception-sorter

  • javax.sql.SQLException 가 발생했을 때 DB 벤더 고유의 에러 코드/에러 메시지를 해석하는 클래스를 지정한다.

  • MySQL에 대한 exception-sorter 설정은 다음과 같다.

<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>

표 7. 데이터소스의 주요 장애 감지 파라미터

valid-connection-checker-class-name 및 exception-sorter-class-name는 데이터베이스마다 다른 이름을 갖는다. 이 설정 값은 JBoss EAP 6 매뉴얼을 참조하라.

유효성 검증 방식

유효성 검증은 풀 안의 커넥션 장애를 감지하기 위한 기능으로 일반적인 운영 환경에서 설정하여 사용한다. 유효성 검증을 설정하려면 valid-connection-checker-class-name 또는 check-valid-connection-sql 을 지정한다.

유효성 점검을 하는 시기는 백그라운드로 정기적으로 실행(background-validation)하거나 애플리케이션에서 커넥션을 가져올 때(validate-on-match)하도록 설정할 수 있다. 일반적으로 애플리케이션에서 커넥션을 가져올 때 유효성을 점검하여 DB 재기동, Stand-by DB로 변환, 네트워크 장애 등에 의해 유효하지 않은 연결이 풀 안에 존재하는 경우 애플리케이션이 유효한 연결을 얻을 가능성이 높아진다. use-fast-fail에 대해서는 특별한 이유가 없으면 기본값인 false를 적용한다.

데이터소스 시간 관련 파라미터

데이터소스는 풀 안 연결의 Idle 시간의 최대치, 애플리케이션의 연결 취득시의 최대 대기 시간 등의 타임아웃 설정이 가능하다. 주요한 타임아웃 설정은 다음 그림과 같다.

image

그림 1. 데이터 소스 타임아웃 시간

그림에서 ①~③ 은 각각 다음의 주요한 타임아웃을 나타낸다.

  • ①:Idle 연결의 생존 기간(idle-timeout-minutes)

  • ②:연결 취득시 최대 대기 시간(blocking-timeout-wait-millis)

  • ③:DB 처리의 최대 실행 시간(query-timeout /set-tx-query-timeout)

타임아웃에 관련하는, Non-XA 및 XA 공통의 데이터소스 자원의 주요한 속성은 아래 표와 같다.

항목 설명 기본 값

blocking-timeout-millis

커넥션을 가져올 때까지 대기할 수 있는 최대 시간을 밀리 초로 지정한다. 이 시간을 초과하면 javax.resource.ResourceException이 발생한다.

30000 (3분)

idle-timeout-minutes

풀에 있는 커넥션 중에 사용하지 않는 커넥션에 대해 주기적으로 삭제한다. 커넥션이 마지막에 사용되고 나서 지정된 시간 동안 사용하지 않으면 폐기된다. 기본값은 30이며 30 분 동안 사용하지 않는 연결이 삭제된다. 연결에 대한 검사는 (지정된 값 / 2) 간격으로 실행된다. 즉, 기본값에서는 15분마다 확인한다.

30 (분)

set-tx-query-timeout

트랜잭션 타임아웃이 발생하기까지 남아있는 시간을 기준으로 쿼리 타임아웃을 설정할 것인지를 설정한다. 트랜잭션 타임아웃이 발생했을 경우, 트랜잭션 타임아웃 발생 시점에 실행 중인 쿼리는 중단된다.

false

query-timeout

JDBC 쿼리 타임아웃을 초 단위로 지정한다. 기본값은 ‘0’ 제한 없음이다.

쿼리 실행전에 java.sql.Statement#setQueryTimeout 를 사용해 타임아웃을 적용한다.

기본값은 타임아웃을 적용하지 않는다.

0

allocation-retry

커넥션을 가져올 때 예외가 발생할 때 재시도 횟수를 지정한다. 기본값은 0으로 에러가 발생하면 바로 예외를 반환한다.

0

allocation-retry-wait-millis

연결 할당까지 대기하는 시간(밀리 초). 기본값은 5000로 5초이다.

5000

xa-resource-timeout

설정되어 있으면 XAResource.setTransactionTimeout 메서드에 값을 전달한다.

표 8. 데이터소스의 타임아웃 관련 파라미터

타임아웃 설정 튜닝

일반적으로 DB 처리의 최대 실행 시간 제어는 set-tx-query-timeout 을 true로 설정하여 제어한다. Idle 연결의 생존 기간에 대해서는 연결의 생성, 소멸의 처리가 자주 발생하는 것이 바람직하지 않은 경우라면 0을 지정한다.

이외의 설정 항목에 대해서는, 기본적으로는 기본값을 적용하는 것을 추천한다.

Statement를 제어하기 위한 설정들은 다음과 같은 것이 있다.

항목 설명 기본값

track-statements

Statement와 ResultSet의 누수(Leak)가 생겼을 경우 자동으로 닫아준다. 기본값은 nowarn으로 로그를 남기지 않고 닫는다. true로 설정하면 로그 파일에 누수가 발생한 지점의 스택 트레이스와 로그를 출력한다. 최근에는 프레임워크를 많이 사용하기 때문에 누수가 생기는 경우가 많지 않다. 직접 JDBC를 사용해 개발하는 경우에는 개발할 때 반드시 true로 설정한다.

nowarn

prepared-statement-cache-size

데이터베이스 연결마다 보관할 Prepared Statement 캐시의 크기를 지정한다. LRU(Least Recently Used) 캐시가 사용된다.

0

share-prepared-statements

PreparedStatement 캐시를 사용할 때 PreparedStatement를 버리지 않고 같은 SQL 을 다시 실행할 때 사용하는 옵션이다. 기본값은 false이다.

false

표 9. 데이터소스의 Statement관련 파라미터