티스토리 뷰

728x90
반응형

 포스팅에서는 WildFly의 datasouce 연동방식(Thin,OCI)에 대해 알아보겠습니다. 


 각 DB벤더사에서는 4가지 종류의 JDBC Driver가 있습니다. 그중에서도 Type2와 Type4형태의 Driver를 많이 제공합니다. Type2 Driver란, Oracle로 이야기한다면 Sql*Net을 필요로 하며, .dll또는 .so형태의 H/W 종속적인 Native Module을 통해서 DB와 연결합니다. Oracle의 경우, JDBC Type2형태를 OCI(Oracle Call Interface) Driver라고 부릅니다. 

 Type4 형태의 JDBC Driver는 순수하게 Java package만으로 바로 DB연결이 가능합니다. Oracle의 경우, JDBC Type4형태를 Thin Driver라고 부릅니다. 


 

 Type2(OCI)

Type4(Thin) 

 장점

 성능이 빠르다.

 성능이 OCI에 비해 느리다

 단점

 Sql*Net과 같은 Native Module이 있어야하므로, 물리적인 H/W구성에 다소 종속적인 형태가 될수있다. 

 Java Package만으로 DB와 접속이 가능하므로, 어떤 H/W, OS에서도 유연하게 연결이 가능하다.


일반적으로 Type4 형태의 JDBC Driver를 많이 사용하며, 

관련 포스팅은 아래에서 확인가능합니다. 


[Web Application Server] WildFly - Datasource 연동

http://waspro.tistory.com/174


이번 포스팅에서는 DBC Type2형태의 OCI(Oracle Call Interface) Driver를 사용하여 연동하도록 하겠습니다. 


먼저 연동에 필요한 OCI라이브러리들을 다운받아야겠지요. 이를 Oracle Instant Client라고 합니다. 


1. Oracle Instant Client 설치파일을 다운받기위해, 아래 페이지에 접속합니다. 

https://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html


OS를 선택합니다.


 



2.아래 파일을 다운로드받습니다.

instantclient-basic-linux.x64-18.3.0.0.0dbru.zip


 


3.해당 파일의 압축을 해제하면, instantclient_18_3 이라는 디렉토리에 풀리게됩니다.

 

[oracledb@kmkang instantclient_18_3]$ pwd

/home/oracledb/instantclient_18_3 

[oracledb@kmkang instantclient_18_3]$ ls -al

합계 233376

drwxrwxr-x  4 oracledb oracledb      4096 10월 10 12:59 .

drwx------ 25 oracledb oracledb      4096 10월 10 18:56 ..

-rw-r--r--  1 oracledb oracledb      1317  6월 28 19:53 BASIC_README

-rwxr-xr-x  1 oracledb oracledb     40617  6월 28 19:53 adrci

-rwxr-xr-x  1 oracledb oracledb     57556  6월 28 19:53 genezi

lrwxrwxrwx  1 oracledb oracledb        17 10월  1 16:01 libclntsh.so -> libclntsh.so.18.1

-rwxrwxr-x  1 oracledb oracledb  77879517  6월 28 19:53 libclntsh.so.18.1

-rwxrwxr-x  1 oracledb oracledb   8348633  6월 28 19:53 libclntshcore.so.18.1

-r-xr-xr-x  1 oracledb oracledb     18744  6월 28 19:53 libheteroxa18.so

-r-xr-xr-x  1 oracledb oracledb   3537979  6월 28 19:53 libipc1.so

-r-xr-xr-x  1 oracledb oracledb    467468  6월 28 19:53 libmql1.so

-r-xr-xr-x  1 oracledb oracledb   6636088  6월 28 19:53 libnnz18.so

lrwxrwxrwx  1 oracledb oracledb        15 10월  1 16:01 libocci.so -> libocci.so.18.1

-rwxrwxr-x  1 oracledb oracledb   2229347  6월 28 19:53 libocci.so.18.1

-rwxr-xr-x  1 oracledb oracledb 126950232  6월 28 19:53 libociei.so

-r-xr-xr-x  1 oracledb oracledb    160875  6월 28 19:53 libocijdbc18.so

-r-xr-xr-x  1 oracledb oracledb    394835  6월 28 19:53 libons.so

-rwxrwxr-x  1 oracledb oracledb    118171  6월 28 19:53 liboramysql18.so

-rwxr-xr-x  1 oracledb oracledb   1616347  6월 28 19:53 libsqlplus.so

-rwxr-xr-x  1 oracledb oracledb   1655813  6월 28 19:53 libsqlplusic.so

-rwxr-xr-x  1 oracledb oracledb   1118312  6월 28 19:53 libsqora.so.18.1

drwxr-xr-x  3 oracledb oracledb        19  6월 28 19:53 network

-rwxr-xr-x  1 oracledb oracledb      4961  6월 28 19:53 odbc_update_ini.sh

-r--r--r--  1 oracledb oracledb   4161744  6월 28 19:53 ojdbc8.jar

-r--r--r--  1 oracledb oracledb   1398331  6월 28 19:53 ucp.jar

-rwxr-xr-x  1 oracledb oracledb    242009  6월 28 19:53 uidrvci

-rw-r--r--  1 oracledb oracledb     74263  6월 28 19:53 xstreams.jar

[oracledb@kmkang instantclient_18_3]$


4. instantclient_18_3 디렉토리에서 ojdbc8.jar을 복사하여, WildFly module directory에 위치시킵니다.


[wildfly@kmkang~/wildfly13/modules/com/oracle/main$]pwd

/home/wildfly/wildfly13/modules/com/oracle/main

[wildfly@kmkang~/wildfly13/modules/com/oracle/main$]ls -al

합계 9752

drwxrwxr-x 3 wildfly wildfly      89 10월 10 13:07 .

drwxrwxr-x 3 wildfly wildfly      18  8월  6 10:45 ..

-rw-rw-r-- 1 wildfly wildfly     303 10월 10 13:07 module.xml

-rw-r--r-- 1 wildfly wildfly 4161744 10월 10 10:58 ojdbc8.jar

[wildfly@kmkang~/wildfly13/modules/com/oracle/main$] 


5.추가적으로, 해당 위치에 lib directory를 생성하며, 그 하위에 linux-x86_64 directory를 생성합니다. (directory명은 변경해도 무방합니다.


 [wildfly@kmkang~/wildfly13/modules/com/oracle/main/lib/linux-x86_64$]


5.module.xml 파일을 수정합니다.


<?xml version="1.0" encoding="UTF-8"?>


<module xmlns="urn:jboss:module:1.3" name="com.oracle">


    <resources>

         <resource-root path="ojdbc8.jar"/>

          <resource-root path="lib"/>

     </resources>

     <dependencies>

         <module name="javax.api"/>

     </dependencies>

 </module>



6.instantclient_18_3 directory 하위에 존재하는 모든 .so 파일을, ~/wildfly13/modules/com/oracle/main/lib/linux-x86_64 경로에 copy합니다.


/home/wildfly/wildfly13/modules/com/oracle/main/lib/linux-x86_64

[wildfly@kmkang~/wildfly13/modules/com/oracle/main/lib/linux-x86_64$]ls -al

합계 303988

drwxrwxr-x 2 wildfly wildfly      4096 10월 10 13:02 .

drwxrwxr-x 3 wildfly wildfly        26 10월 10 11:19 ..

-rwxr-xr-x 1 wildfly wildfly  77879517 10월 10 11:26 libclntsh.so

-rwxr-xr-x 1 wildfly wildfly  77879517 10월 10 11:26 libclntsh.so.18.1

-rwxr-xr-x 1 wildfly wildfly   8348633 10월 10 11:26 libclntshcore.so.18.1

-rwxr-xr-x 1 wildfly wildfly     18744 10월 10 13:02 libheteroxa18.so

-rwxr-xr-x 1 wildfly wildfly   3537979 10월 10 11:26 libipc1.so

-rwxr-xr-x 1 wildfly wildfly    467468 10월 10 11:26 libmql1.so

-rwxr-xr-x 1 wildfly wildfly   6636088 10월 10 11:26 libnnz18.so

-rwxr-xr-x 1 wildfly wildfly   2229347 10월 10 11:26 libocci.so

-rwxr-xr-x 1 wildfly wildfly   2229347 10월 10 11:26 libocci.so.18.1

-rwxr-xr-x 1 wildfly wildfly 126950232 10월 10 11:26 libociei.so

-rwxr-xr-x 1 wildfly wildfly    160875 10월 10 11:26 libocijdbc18.so

-rwxr-xr-x 1 wildfly wildfly    394835 10월 10 11:27 libons.so

-rwxr-xr-x 1 wildfly wildfly    118171 10월 10 11:27 liboramysql18.so

-rwxr-xr-x 1 wildfly wildfly   1616347 10월 10 11:27 libsqlplus.so

-rwxr-xr-x 1 wildfly wildfly   1655813 10월 10 11:27 libsqlplusic.so

-rwxr-xr-x 1 wildfly wildfly   1118312 10월 10 13:02 libsqora.so.18.1

[wildfly@kmkang~/wildfly13/modules/com/oracle/main/lib/linux-x86_64$]


7.WildFly standalone.xml파일의 datasource 항목을 oci로 수정합니다.


             <datasources>

                <datasource jndi-name="java:jboss/oracleDataSource" pool-name="oracleDs" enabled="true" use-java-context="true" use-ccm="true">

                    <connection-url>jdbc:oracle:oci:@IP:PORT/SID</connection-url>

                    <driver>oracle</driver>

                    <security>

                        <user-name>***</user-name>

                        <password>***</password>

                    </security>

                </datasource>

                <drivers>

                    <driver name="oracle" module="com.oracle">

                        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>

                    </driver>

                </drivers>

            </datasources>

        </subsystem>


8. LD_LIBLARY_PATH를 so파일들이 위치하는 directory로 지정합니다. (.bash_profile수정)


export LD_LIBRARY_PATH=/home/wildfly/wildfly13/modules/com/oracle/main/lib/linux-x86_64 


*LD_LIBLARY_PATH란?

우선 so 파일이 무엇인지 알아 보겠습니다. so 파일은 shared object 파일이란 뜻으로 *.so.* 일텐데, 특정한 기능을 구현해 놓은 파일을 의미합니다. 즉, 프로그램들은 일반적으로 필요한 기능을 전부 구현하기 보다는 특정 기능이 이미 구현되어 있으면 그 기능이 구현된 파일을 메모리에 올린 후 그 기능을 사용하게 됩니다. 해당 파일은 C로 구현되어있기때문에 non-JAVA영역이며, 이를 사용하기위해서는 명시적으로 지정을 해주어야 합니다. 따라서 환경변수로 지정해주게 됩니다. 


9. WAS 재기동

10. Test connection in pool 

[standalone@IP:PORT /] /subsystem=datasources/data-source=oracleDs:test-connection-in-pool

{

    "outcome" => "success",

    "result" => [true]

} 


연동이 완료되었습니다. 


- 만약 LD_LIBLARY_PATH 를 지정해주지 않을 경우, 아래와 같은 error가 발생하게 됩니다. 

2018-10-10 13:17:13,511 WARN  [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (management-handler-thread - 1) IJ000604: Throwable while attempting to get a new connection: null: javax.resource.ResourceException: IJ031084: Unable to create connection

        at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createLocalManagedConnection(LocalManagedConnectionFactory.java:345)

...
Caused by: java.lang.UnsatisfiedLinkError: /home/wildfly/wildfly13/modules/com/oracle/main/lib/linux-x86_64/libocijdbc18.so: libclntsh.so.18.1: 동적 오브젝트 파일을 열 수 없습니다: 그런 파일이나 디렉터리가 없습니다


Oracle의 driver마다 성능과 용이함에 장단점이 존재합니다. 따라서 시스템 환경에 맞는 database연동방식을 선택하는것이 좋습니다.

고맙습니다.






728x90
반응형