JBoss EAP 6과 친해지기 12탄 - 데이터소스 서브시스템
본문 바로가기
IT 이야기/JBoss EAP

JBoss EAP 6과 친해지기 12탄 - 데이터소스 서브시스템

by 찬찬이 아빠 2020. 12. 16.
반응형
  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 EE 6 표준입니다.
JPA를 사용하면 Java의 오브젝트 구조와 데이터베이스의 테이블 구조가 자동으로 변환되기 때문에 애플리케이션의 코딩 및 데이터베이스 변경이 쉬워집니다.
JPA에서 데이터베이스에 접근할때에도 데이터소스를 사용합니다.

 

 

 

  2. MariaDB 설치

데이터소스 테스트에 MariaDB 데이터베이스를 사용합니다.

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

 

Maria라는 이름은 핵심 개발자인 Michael Widenius의 딸 이름에서 따온것이라고 합니다. 부모가 같은 소스를 기반으로 하므로 MySQL과 MariaDB는 자매 관계라고 부를 수 있습니다.

 

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

 

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

 

MariaDB의 사용 방법은 http://www.mariadb.org를 참고 합니다.  

 

JBoss EAP 6의 데이터소스 서브시스템 설정을 위해 먼저 OS(RHEL)에 MariaDB를 설치합니다.

 

① MariaDB 레파지토리 설정

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

# vim /etc/yum.repo.d/mariadb.repo

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

 

② MariaDB 설치

다음 명령을 입력하여 MariaDB 서버와 클라이언트를 설치합니다.

# yum install MariaDB-server MariaDB-client

 

③ MariaDB 시작

아래와 같이 MariaDB를 시작합니다. 5.5 버전까지는 MySQL과 사용 방법이 같습니다.

# /etc/init.d/mysql start

 

④ 암호 설정

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

# mysql_secure_installation

NOTE: 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 onne): [엔터]
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!

 

⑤ 데이터베이스 연결 확인

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 '\n' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> use test;
Database changed
MariDB [test]> show tables;
Empty set (0.00 sec)

MariaDB [test]>

 

 

 

  3. JDBC 드라이버 등록

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

 

항목 jar 파일 배포 모듈형태 배포
설치 방법 jar 파일로 배포하는 경우에 동적 모듈로 인식하여 데이터소스로부터 참조 가능한 상태가 됩니다. $JBOSS_HOME/modules 디렉터리 아래에 복사하여 모듈화 합니다. 이러한 커스텀 모듈은 다른 모듈로부터 의존관계(dependencies)로 참조되는 경우 사용됩니다.
도메인 관리 여부 도메인 환경에서 여러 개의 인스턴스를 관리하는 경우 배포도 일괄 관리할 수 있어, 여러 개의 인스턴스가 사용하고 있는 JDBC 드라이버를 일괄적으로 버전 업그레이드하는 관리가 가능합니다. 커스텀 모듈은 도메인모드의 관리 대상이 아니어서 여러 개의 노드에 대해 일괄 관리할 수 없습니다.
JDBC 드라이버 패키지 JDBC 드라이버가 여러 개의 jar 파일로 구성된 경우, 배포하면 다른 모듈로 인식되기 때문에 이 방법을 사용할 수 없습니다. 모듈을 정의할 때 jar 파일을 여러 개 지정할 수 있기 때문에 JDBC 드라이버의 jar 파일이 여러 개일 경우에도 사용할 수 있습니다.

 

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

 

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

 

(1) JDBC 드라이버 다운로드

데이터베이스에 연결하려면 먼저 데이터베이스 벤더에서 제공하는 JDBC 드라이버가 필요합니다. 사용하려는 데이터베이스 벤더가 제공하는 JDBC 드라이버를 아래 URL에서 다운로드 받을 수 있습니다.

 

 

 

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

① 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 /CLOUD/mariadb-java-client-1.1.5.jar

 

② DataSource 등록

웹 관리 콘솔에서 Profile -> Connector에서 Datasources 클릭 -> Add 클릭

 

 

③ DataSource 속성 등록

아래와 같이 데이터소스에 대한 JNDI 이름을 등록합니다.

  • Name : MariaDB_DS
  • JNDI Name : java:jboss/datasources/MariaDB_DS

 

④ JDBC 드라이버 선택

설치한 MariaDB JDBC 드리아버를 선택합니다.

  • Detected Driver에서 mariadb-java-client-1.1.5.jar 파일 선택

 

⑤ JDBC Connection 정보 입력

Connection Setting 입력같은 아래와 같이 입력합니다.

  • Connection URL : jdbc:mysql//localhost:3306/test
  • Username : root
  • Password : password
  • Security Domain : (공백)

 

⑥ 등록 데이터소스 활성화

웹 관리 콘솔에서 등록한 MariaDB_DS를 선택하고 Enable 버튼을 클릭하여 데이터소스를 활성화 시킵니다.

 

 

⑦ Test Connection 수행

웹 관리 콘솔에 Test Connection 버튼을 클릭합니다.

"Successfully created JDBC connection" 팝업이 나오는지 확인합니다.

 

 

 

(3) 모듈로 JDBC 드라이버 설치

① JDBC jar 파일 다운로드

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

 

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

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

$ vim $JBOSS_HOME/modules/system/layers/layers.conf
layers=ext

 

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

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

$ mkdir -p $JBOSS_HOME/modules/system/layers/ext/org/mariadb/main

 

④ JDBC 드라이버 복사

$ cp /CLOUD/mariadb-java-client-1.1.5.jar $JBOSS_HOME/modules/system/layers/ext/org/mariadb/main/

 

⑤ module.xml 파일 작성

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

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

$ vim $JBOSS_HOME/modules/system/layers/ext/org/mariadb/main/module.xml
<?xml version="1.0" encoding='UTF-8"?>

<module xmlns="urn:jboss:module:1.1" name="org.maradb">
  <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>

 

⑥ JDBC 드라이버 등록

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

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

 

JBoss EAP 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" }

 

 

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

① JDBC 드라이버를 모듈로 등록

[standalone@localhost:9999 /] module add --name=sysstem.layers.ext.org.mariadb --resources=/CLOUD/mariadb-java-client-1.1.5.jar --dependencies=javax.api,javax.transaction.api

 

② JDBC 드라이버 등록

[standalone@localhost:9999 /] /subsystem=datasources/jdbc-driver=mariadb:add(driver-module-name=system.layers.ext.org.mariadb,dirver-name=mariadb,driver-xa-datasource-class-name=org.mariadb.jdbc.jdbc2.optional.MysqlXADataSource)
{ "outcome" => "success" }

 

③ 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
dirver-class-name				org.mariadb.jdbc.Driver
driver-major-version				1
driver-minor-version				1
jdbc-compliant				false

 

④ 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=passworj,connection-url="jdbc:mysql://localhost:3306/test",min-pool-size=20,max-pool-size=50,driver-name=mariadb,flush-strategy=FailingConnectionOnly)
{ "outcome" => "success" }

 

⑤ 데이터소스 활성화

[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]
}

 

⑦ 등록된 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" encoding='UTF-8"?>

<module xmlns="urn:jboss:module:1.1" name="org.maradb">
  <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>

 

 

<모듈 등록 시 사용하는 주요 파라미터>

속성 설명 예제
name 모듈 이름을 지정
이 모듈은 이름은 $JBOSS_HOME/modules 디렉터리로부터의 상대 경로를 '.'로 연결한 것
org.mariadb
resource 모듈화 대상이 되는 리소스를 지정
절대 경로 또는 $JBOSS_HOME/bin 부터의 상대 경로로 지정
/CLOUD/mariadb-java-client-1.1.5.jar
dependencies 의존관계(dependencies)를 지정
여러 개를 지정하려면 컴마로 구분
JDBC 드라이버는 javax.api와 javax.transaction.api를 지정해야 함
javax.api
javax.transaction.api

 

 

 

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

(1) 데이터소스 등록하는 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=passworj,connection-url="jdbc:mysql://localhost:3306/test",min-pool-size=20,max-pool-size=50,driver-name=mariadb,flush-strategy=FailingConnectionOnly)
{ "outcome" => "success" }

 

(2) 데이터소스 확인하는 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-dada-source는 분산 트랜잭션을 지원합니다.

 

애플리케이션에서 분산 트랜잭션을 사용하는지에 따라 필요한 데이터소스 설정 항목이 달라서 JBoss EAP 6에서도 두 종류의 데이터소스 리소스 타입을 지원합니다. 일반적으로 data-source를 Non_XA 데이터소스라고 부르고, xa-data-souces를 XA 데이터소스라고 합니다.

 

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

 

 ① 데이터소스 상세 정보 확인

설정은 관리 자원의 /subsystem=datasources/data-source=<추가할 데이터소스명> 자식 소성에 대해서 ':write-attribute'를 사용할 수 있지만, 아래와 같은 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
backgournd-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

 

(3) 데이터소스 활성화/비활성화

새로 작성한 데이터소스는 기본적으로 'disable' 상태입니다.

'enable'로 변경하여야 애플리케이션에서 사용할 수 있습니다.

'disable' 상태인 Non-XA 데이터소스는 data-source 명령으로 '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]
}

 

<데이터소스 비활성화>

사용중인 Non-XA 데이터소스를 'disable'로 변경하려면 다음과 같은 data-source 명령으로 'enable'을 'disable'로 변경할 수 있지만, 'disable'로 변경할 때는 서버를 재기동할 때까지 설정에 반영하지 않기 때문에, 서버를 재기동하여야합니다. 

도메인 모드에서는 reload 명령을 실행하면 서버가 재기동됩니다.

[staldalone@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/datasource/MariaDB_DS",
    "rolled-back" => true
}

 

 

(4) 데이터소스 제거하기

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

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

 

 

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

설치된 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 드라이버에 대한 상세한 정보를 아래와 같이 확인합니다.

[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
dirver-class-name				org.mariadb.jdbc.Driver
driver-major-version				1
driver-minor-version				1
jdbc-compliant				false

 

설치된 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
     }
  ]
}

 

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

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

설치된 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

 

 

 

  5. 데이터소스 설정

(1) 데이터소스 등록하는 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

 

 

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

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

 

① 웹 콘솔의 데이터소스 추가

'Profiles' → 'Subsystems' → 'Connector' →'Datasources' → 'JDBC Datasources' → 'Add'를 선택합니다.

 

② 데이터소스 속성 설정

Name에 'MariaDB_DS'를 입력하고, JNDI Name에 'java:jboss/datasources/MariaDB_DS'를 입력합니다.

 

③ JDBC 드라이버 선택

mariadb JDBC 드라이버를 선택합니다.

 

④ JDBC 연결 설정

Connection URL에 'jdbc:mysql://localhost:3306/test'를 입력합니다.

Username에는 'root', Password에 'password'를 입력합니다.

 

⑤ 데이터소스 Enable

등록한 MariaDB_DS를 선택하고 'Enable' 버튼을 클릭합니다.

 

⑥ 데이터소스 연결 테스트

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

데이터소스에 연결이 되었는지 확인합니다.

 

 

 

(6) XA JDBC 드라이버와 데이터소스 설정

XA 데이터소스를 설정하기 위해서는 먼저 분산 트랜잭션을 지원하는 JDBC 드라이버가 설치되어 있어야 합니다.

 

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

 

<XA 데이터소스>

xa-data-source 자원을 추가하려면 아래와 같은 항목들을 설정해야 합니다.

항목 설명 설정 예제
connection-url 접속할 데이터베이스에 대한 연결 URL jdbc:mysql://localhost:3306/mysql
name Non-XA 데이터소스 이름 MariaDB_XA_DS
driver-name 사용하는 JDBC 드라이버를 설정
JDBC 드라이버를 배포하여 사용하는 경우 deployments 디렉터리 아래에 배포한 JDBC 드라이버의 파일명으로 설정
JDBC 드라이버를 모듈로 등록해 사용하는 경우에는 jdbc-driver에 추가한 리소스 이름을 지정
mariadb
jndi-name 데이터소스를 룩업할 때 사용하는 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

 

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

 

① 데이터소스 등록

[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" }

 

② 연결 정보설정

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" }

 

③ JDBC 드라이버 선택

[standalone@localhost:9999 /] /subsystem=datasources/xa-data-source=MariaDB_XA_DS/:write-atribute(name=xa-datasource-class,value=org.mariadb,jdbc.MySQLXAResource)
{ "outcome" => "success" }

 

④ 데이터소스 Enable

XA 데이터소스도 Non-XA 데이터소스와 같이 추가된 후 바로 사용할 수 없습니다.

xa-data-source 명령을 사용해 XA 데이터소스를 사용함으로 변경해야 합니다.

[standalone@localhost:9999 /] /subsystem=datasources/xa-data-source=MariaDB_XA_DS:enable
{ "outcome" => "success" }

 

⑤ 데이터소스 연결 테스트

[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'로 설정 후에는 서버를 재기동해야 합니다.

 

 

 

  7. 주요 속성

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

애플리케이션에서 DB 커넥션이 병목이 되는 경우 커넥션 풀 설정을 해야 합니다.

커넥션 풀 수 설정에서 Non-XA 및 XA 공통의 데이터소스 자원의 주요한 속성은 아래 표와 같습니다.

항목 설명 기본값
min-pool-size 커넥션 풀에서 유지하는 최소 연결 수
지정한 커넥션 수 만큼 풀에서 커넥션을 생성하지만 시기는 prefill 속성에 따라 다름
0
max-pool-size 커넥션 풀에서 유지하는 최대 연결 수 20
prefill 커넥션 풀을 미리 채우도록 설정
데이터소스를 작성할 때 min-pool-size로 지정된 수의 연결을 미리 맺어 풀 안에 확보할 것인지를 true/false로 지정
pfrefill이 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) 메소드를 사용하여 데이터소스에 접근할 때 사용하는 옵션  

 

<min-pool-size와 max-pool-size를 같게 설정하는 이유>

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

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

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

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

 

 

(2) 데이터소스 장애 감지 옵션

커넥션 풀 안의 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.MySQL-ValidConnectionChecker"/> 
check-valid-connection-sql  커넥션 풀의 유효성을 확인하는 SQL 문을 지정
 유효성 검증을 하려면 이 check-valid-connection-sql 속성 또는 valid-connection-checker-class-name 둘 중 하나를 지정
 
new-connection-sql 데이터베이스 연결을 생성할 때 처음 한 번만 특정 초기화 SQL을 보내고 싶은 경우에 설정  
validate-on-match  getConnction()을 사용하여 연결을 얻어오는 시점에서 커넥션이 정상인지 검사하는 옵션으로 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은 지원하지 않음
<stale0connection-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.extension.mysql.MySQLExceptionSorter"/>
 

 

valid-connection-checker-class-name 및 exception-sorter-class-name은 데이터베이스마다 다른 이름을 갖습니다.

 

<유효성 검증 방식>

유효성 검증은 풀 안의 커넥션 장애를 감지하지 위한 기능으로 일반적인 운영 환경에서 설정하여 사용합니다.

유효성 검증을 설정하려면 valid-connection-checker-class-name 또는 check-valid-connection-sql을 지정합니다.

 

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

 

 

 

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

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

 

데이터소스 타임아웃 시간

 

그림에서 1 ~ 3은 각각 다음의 주요한 타임 아웃을 나타냅니다.

 

  • 1 : Idle 연결의 생존 기간(idle-timeout-minutes)
  • 2 : 연결 취득 시 최대 대기 시간(blocking-timeout-wait-millis)
  • 3 : 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 메소드에 값을 전달  

 

<타임아웃 설정 튜닝>

일반적으로 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

 

 

 

참고 서적 : 거침없이 배우는 JBoss

반응형

댓글