2014년 11월 26일 수요일

JBOSS EAP6,AS7 DB Pool 설정(귀차니즘 버젼)

아래에는 xml 파일을 직접 수정하여 등록하는 방법을 설명하며
GUI에서 등록시 좀더 편리하게 구성할 수 있다.... 하지만 안알랴줌...
GUI로 하는방법은 화면 스크린샷 떠야하고 첨부하고.... 포스팅 너무 귀찮음
너 님 알아서 잘 해보자


1. 순서 와 overview
1.1 DB Driver 파일 등록 (jdbc driver Deploy)  : 
일반적으로 tomcat 이나 weblogic등을 사용할때 db driver (???.jar) 을 $HOME/lib  또는 $WAR_PATH/WEB-INF/lib  등에 넣어서 사용했을 거임

JBOSS 는 6.x 버젼부터 5.x의 극악한 구동시간을 개선하기 위해 모듈이라는 개념을 적용했는데...
이러한 사유로 기존처럼 jar  파일을 업로드할 경우 WAR 안에서 직접 사용은 가능하지만 WAS DB Pool에서는 해당 드라이버로 Pool을 생성할 수 없다능!
(5.x 버젼 ???DS 나 web.xml에 등록해서 사용하는 방법 은 사용은 가능하나 권장하는 방법은 아님.)

권장방법은 일명 "디플로이"한다 라고 하는 방법으로  jdbc driver를 기존과 같이 그냥 classpath에 추가해 주는 방법이 아니라 "Deploy" 즉 WAS에 설치하는 방법으로 사용함

???  그러면 여러개의 WAR 를 배포하는데 이때 같은 ORACLE DB 인데 Driver 버젼이 달라야 하는경우는???

걱정안해도 되는거임  WAS개발하는놈들 졸라 똑똑함 웬간한 개발자나 엔지니어들 제품 욕 그만하자  그놈들 똑똑함 ㅎㅎ

드라이버를 다른이름으로 여러개 등록 가능하다능
driver의 물리적인 위치로 예를 들면 아래같이 하면 됨

$EAP_HOME/module.ext/com/oracle9  (oracle 9용 드라이버 정보가 들어갈 폴더)
$EAP_HOME/module.ext/com/oracle11 (oracle 11용 드라이버 정보가 들어갈 폴더)

그리고나서 DB Pool을 생성할때 모듈과 매핑을 해주면 된다.......
...
(씨바...뭔가 논리적이긴 한데 드럽게 복잡해졌다....   -.-;;)



1.2 Config 구성
모듈을 등록하고나면 해당 모듈을 참조하여 실제 APP에서 사용할 DB Pool을 구성한다.
EAP 6.x  부터는 도메인모드라는것이 도입되었다.
(웹로직 사용자는 익숙할거임. 톰켓이나 레진...등 오픈소스쪽은 뭔 개소리냐 할것이고,....)

쉽게 이야기하면  여러개의 WAS 를 구성할때 하나의 WAS를 서비스용이 아닌 관리용(Domain Master)으로 구성하고 해당 마스터에서 구성을 하면 모든 Slave WAS(실제 서비스용)에 설정이 반영되는.... 관리편의를 위한 구조라고 보면 됨...

인스턴스 열개 넘어가는 사이트는 알것이다.
배포 할 때 마다 그 개삽질을...  설정하나 바꾸는데 그 많은 ssh 터미널....

그래서....

DB Pool을 구성할 때 기존의 하나의 인스턴스(Standalone mode라고 함)로 운영하는 경우 /$INSTANCE/configuration/standalone-ha.xml 이라는 파일에 내용을 추가하면 되고
도메인모드의 경우 Master 인스턴스에서 /$INSTANCE/configuration/domain.xml 파일에 추가하면 됨

물론 추가하고나면 WAS를 재구동해야 반영된다....
수정하고 안되면 너님 손꾸락 문제일 가능성이 80% 넘음 지랄 금지!


2. 방법
2.1. Driver Install (ORACLE을 예로)

2.1.1 $EAP_HOME/modules.ext/com/oracle/main  폴더를 만든다. 이 폴더에 jar 파일고 module 구성정보를 넣을 것이다. PATH를 이렇게 한 이유는 따지지 말고 그냥 하는거.... 그냥 이렇게 하면 됨 (modules.ext 는 외부 모듈추가시 사용하는 폴더 com/oracle은 임의의 위치로 하고 module.xml과 맞추면 됨, main은 기본 폴더임)

2.1.2 jar 파일 복사 및  modules.xml 파일 생성
파일은 알아서 복사하시고
module.xml 예는 아래와 같음

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="com.oracle">
    <resources>
        <resource-root path="ojdbc6.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>

!! name 부분을 잘 보시라 com.oracle 이라고 되어 있다.  modules.ext 를 ROOT  로 해서 실제 PATH가 이 pkg path와 맞아야 한다.
!! path 부분에 file 이름을 넣자 PATH를 여기서 맞춰도 되는데 .... 아 구찮아 그냥 해논대로 따라하셈


2.2. Configuration
모듈을 등록했으니 이젠 DB Pool을 생성해야 한다.
앞서 overview에서 이야기 했듯이 단독실행 과 도메인모드에서는 수정하는 위치가 다르므로 주의 한다.  (너님들 대부분 단독실행 모드 일 것이다.)

/$INSTANCE/configuration/standalone-ha.xml  (또는 다른 프로파일)
도메인모드의 경우 Master 에서 작업해야 하며 domain.xml 에서 내용을 등록한다.


2.2.1 Module 설정 추가
GUI 에서 Deploy 메뉴를 사용해서 deploy하면 알아서 해주지만 우리는 xml을 수정해서 처리하므로  module에 대한 내용을 추가해 주어야 한다.
             
 <datasources>
       <datasource>
         .... DB POOL 설정이 여기에 들어온다.
       </datasource>
                    <drivers>
                        <driver name="mysql5" module="com.mysql">
                            <driver-class>com.mysql.jdbc.Driver</driver-class>
                        </driver>
                        <driver name="oracle6" module="com.oracle">
                            <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
                        </driver>
                        <driver name="cubrid" module="com.cubrid">
                            <driver-class>cubrid.jdbc.driver.CUBRIDDriver</driver-class>
                        </driver>
                    </drivers>
</datasources>



2.2.2 Pool 구성

파일을 열면 기존에 sample datasource가 등록되어 있을것이다.
그  아래쪽에 아래와 같이 추가하도록 한다.          

.... 옵션이 너무 많다... 씨알...구찮으니 너님이 찾자

인터넷에서 참고하자
https://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/beta500/html/ch13s13.html

                <datasource jndi-name="java:/ORACLE" pool-name="ORACLE" enabled="true">
                    <connection-url>jdbc:oracle:thin:@192.168.1.100:1521:DBNAME</connection-url>
                    <driver>oracle6</driver>
                    <pool>
                        <min-pool-size>20</min-pool-size>
                        <max-pool-size>20</max-pool-size>
                        <prefill>true</prefill>
                        <use-strict-min>true</use-strict-min>
                    </pool>
                    <security>
                        <user-name>rockplace</user-name>
                        <password>rockrock</password>
                    </security>
                    <validation>
                        <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
                        <validate-on-match>false</validate-on-match>
                        <background-validation>true</background-validation>
                        <background-validation-millis>60000</background-validation-millis>
                        <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/>
                        <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
                    </validation>
                    <timeout>
                        <query-timeout>60</query-timeout>
                    </timeout>
                    <statement>
                        <track-statements>true</track-statements>
                        <prepared-statement-cache-size>20</prepared-statement-cache-size>
                    </statement>
                </datasource>

2.2.3  확인
WAS를 재구동하고 server.log를 보자

/log/server.log 에 아래와 같이 로딩된 드라이버정보가 나온다.
20:36:26,714 INFO  [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 26) JBAS010404: Deploying non-JDBC-compliant driver class com.mysql.jdbc.Driver (version 5.1)
20:36:27,130 INFO  [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 26) JBAS010403: Deploying JDBC-compliant driver class oracle.jdbc.OracleDriver (version 11.2)
20:36:27,188 INFO  [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 26) JBAS010403: Deploying JDBC-compliant driver class cubrid.jdbc.driver.CUBRIDDriver (version 9.2)


DB Pool 설정도 아래와 같이 올라온다.
3:04:06,513 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-2) JBAS010400: Bound data source [java:/ORACLE]


DB POOL은 만들어졌지만  접속이 안되는 경우 아래 비슷한 오류가 발생한다.

23:04:36,458 WARN  [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (JCA PoolFiller) IJ000610: Unable to fill pool: javax.resource.ResourceException: Could not create connection
at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:288)
at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:246)
at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.createConnectionEventListener(SemaphoreArrayListManagedConnectionPool.java:788) [ironjacamar-core-impl-1.0.23.1.Final-redhat-1.jar:1.0.23.1.Final-redhat-1]
at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.fillToMin(SemaphoreArrayListManagedConnectionPool.java:732) [ironjacamar-core-impl-1.0.23.1.Final-redhat-1.jar:1.0.23.1.Final-redhat-1]
at org.jboss.jca.core.connectionmanager.pool.mcp.PoolFiller.run(PoolFiller.java:97) [ironjacamar-core-impl-1.0.23.1.Final-redhat-1.jar:1.0.23.1.Final-redhat-1]
at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_45]
Caused by: cubrid.jdbc.driver.CUBRIDException: Request timed out[CAS INFO - 192.168.56.100:33000,0],[SESSION-0],[URL-jdbc:cubrid:192.168.56.100:33000:demodb:root:********:].
at java.net.PlainSocketImpl.socketConnect(Native Method) [rt.jar:1.6.0_45]
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) [rt.jar:1.6.0_45]
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) [rt.jar:1.6.0_45]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) [rt.jar:1.6.0_45]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) [rt.jar:1.6.0_45]
at java.net.Socket.connect(Socket.java:529) [rt.jar:1.6.0_45]
at cubrid.jdbc.net.BrokerHandler.connectBroker(BrokerHandler.java:32)
at cubrid.jdbc.jci.UConnection.reconnectWorker(UConnection.java:1734)
at cubrid.jdbc.jci.UConnection.reconnect(UConnection.java:1835)
at cubrid.jdbc.jci.UConnection.checkReconnect(UConnection.java:2007)
at cubrid.jdbc.jci.UConnection.tryConnect(UConnection.java:311)
at cubrid.jdbc.driver.CUBRIDDriver.connect(CUBRIDDriver.java:234)
at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:260)
... 5 more






...
mysql 과 cubrid 옵션도 참고로 넣어봤다

나 졸라 착하다...

   <datasource jndi-name="java:/MySQL5" pool-name="MySQL5" enabled="false">
                    <connection-url>jdbc:mysql://192.168.1.100:3306/mysql</connection-url>
                    <driver>mysql5</driver>
                    <pool>
                        <min-pool-size>20</min-pool-size>
                        <max-pool-size>20</max-pool-size>
                        <prefill>true</prefill>
                        <use-strict-min>true</use-strict-min>
                    </pool>
                    <security>
                        <user-name>rockplace</user-name>
                        <password>rockrock</password>
                    </security>
                    <validation>
                        <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
                        <validate-on-match>false</validate-on-match>
                        <background-validation>true</background-validation>
                        <background-validation-millis>10000</background-validation-millis>
                        <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>
                    </validation>
                    <timeout>
                        <query-timeout>60</query-timeout>
                    </timeout>
                    <statement>
                        <track-statements>true</track-statements>
                        <prepared-statement-cache-size>20</prepared-statement-cache-size>
                    </statement>
                </datasource>

                <datasource jndi-name="java:/Cubrid" pool-name="CUBRID" enabled="false">
                    <connection-url>jdbc:cubrid:192.168.1.100:33000:demodb:::</connection-url>
                    <driver>cubrid</driver>
                    <new-connection-sql>select 2</new-connection-sql>
                    <pool>
                        <min-pool-size>20</min-pool-size>
                        <max-pool-size>20</max-pool-size>
                        <prefill>true</prefill>
                        <use-strict-min>true</use-strict-min>
                        <flush-strategy>FailingConnectionOnly</flush-strategy>
                    </pool>
                    <security>
                        <user-name>rockplace</user-name>
                        <password>rockrock</password>

                    </security>
                    <validation>
                        <check-valid-connection-sql>select 1</check-valid-connection-sql>
                        <validate-on-match>false</validate-on-match>
                        <background-validation>true</background-validation>
                        <background-validation-millis>60000</background-validation-millis>
                    </validation>
                    <timeout>
                        <query-timeout>60</query-timeout>
                    </timeout>
                    <statement>
                        <track-statements>true</track-statements>
                        <prepared-statement-cache-size>20</prepared-statement-cache-size>
                    </statement>
                </datasource>


위에것은 예이고

DB HA 구성여부나 제품에따라 Connection-url 은 다르므로 DBA에게 물어보자
...
아마도 모른다고 할것이다.
하지만 알아보라고 하자 ORACLE이라면 CTF가 뭔지 알아보라고 하자, DBA가 언제부터 SQL만 빨고 살기 시작했냐 쿼리문만 빨지말고 이건 니가 알아야 맞다고 설득하자 ....  이.해.할.때. 까~지! -

-벨리데이션 체크 방법 백그라운드, start-sql, on match....
-벨리데이션 체크 간격에 따른 Fail Over time의 연관관계
-쿼리타임아웃에 따른 처리끊어짐
-프리페어드의 케쉬의 의미 와 네이티브메모리 누수

등등...  할말은 많은데

귀찮음...


수고하자.

댓글 없음:

댓글 쓰기

본 블로그의 댓글은 검토후 등록됩니다.