티스토리 뷰

728x170

 포스팅은 Oracle / Tibero 접속세션을 구분하는 방법에 대한 고찰입니다.


Oracle Tibero를 사용할 때 JDBC를 통해 접속한 세션을 구분 할 수 있도록 JDBC접속시 Connection Properties를 통해 구분자를 넣어줄 수 있습니다하나의 Node에 다수의 WAS Instance가 있을 경우 DB관점에서 모니터링, Session Kill 시 등의 동작 수행 시 원하는 Session을 선택하는데 용이하게 사용할 수 있습니다.

 

1. ConnectionPool을 사용하는 경우 설정방법

1.1. 사용하는 DB Oracle인 경우

JEUS 6.x

JEUSMain.xml 파일에 다음 항목을 추가 합니다.

<database>

    <vendor>oracle</vendor>

    <export-name>orads</export-name>

    <data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>

    <data-source-type>ConnectionPoolDataSource</data-source-type>

    <database-name>ora11g</database-name>

    <port-number>1521</port-number>

    <server-name>192.168.70.155</server-name>

    <user>scott</user>

    <password>tiger</password>

    <property>

        <name>driverType</name>

        <type>java.lang.String</type>

        <value>thin</value>

    </property>

    <property>

        <name>ConnectionProperties</name>

        <type>java.util.Properties</type>

        <value>v$session.program=was1_orads</value>

    </property>

    <connection-pool>

        <pooling>

            <min>1</min>

            <max>20</max>

            <period>500000</period>

        </pooling>

        <wait-free-connection>

            <enable-wait>true</enable-wait>

            <wait-time>60000</wait-time>

        </wait-free-connection>

        <check-query>SELECT 1 FROM DUAL</check-query>

        <check-query-period>120000</check-query-period>

    </connection-pool>

</database>

위의 같이 ConnectionPropertiesv$session.program의 값을 원하는 대로 정의 해 주면 됩니다.

 

JEUS 7.x

WebAdmin Resources > DataSource 에서 변경할 DataSource를 선택 한 후 고급 선택사항의 Property 부분에 다음과 같이 설정할 수 있습니다.

ConnectionProperties:java.util.Properties=v$session.program=ms1_orads



 

 

1.2 사용하는 DB Tibero인 경우

이 기능은 Tibero 버전이 Tibero 5 rev.67823 이상에서 사용이 가능합니다.

버전 확인은 다음 명령을 통해 확인 할 수 있습니다.

1) JDBC Driver 버전 확인

$ java -jar tibero5-jdbc.jar

Tibero JDBC Driver 5.0   (Rev.68181M)

 

2) DB 버전 확인

$ tbboot -v

Tibero 5   (Build 68328, DB 5.0)

JDBC Driver 버전과 DB 버전이 모두 만족해야 이 기능 사용이 가능합니다. 

만약 ConnectionProperties program_name을 설정하고 사용했을 때 다음과 같은 에러가 발생한다면 Tibero JDBC Driver의 버전을 확인해 보시기 바랍니다.

[2014.03.22 17:44:50][0][0_576] [container1-15] [JDBC-0352] Could not find the property [ConnectionProperties] in the driver's class [com.tmax.tibero.jdbc.ext.TbConnectionPoolDataSource] for the data source [tbds]. Please check if it is valid property for this data source.

<<__Exception__>>

java.lang.NoSuchMethodException: com.tmax.tibero.jdbc.ext.TbConnectionPoolDataSource.setConnectionProperties(java.util.Properties)

at java.lang.Class.getMethod(Class.java:1581)

at jeus.jdbc.datasource.DBDSBinder.invokeMethod(DBDSBinder.java:98)

at jeus.jdbc.datasource.DataSourceGenerator.getDataSource(DataSourceGenerator.java:64)

at jeus.jdbc.connectionpool.ConnectionPool.getDataSource(ConnectionPool.java:328)

at jeus.jdbc.connectionpool.ConnectionPool.getPooledConnection(ConnectionPool.java:452)

at jeus.jdbc.connectionpool.ConnectionStore.createPooledConnection(ConnectionStore.java:424)

at jeus.jdbc.connectionpool.ConnectionStore.sizeup(ConnectionStore.java:418)

at jeus.jdbc.connectionpool.ConnectionStore.getJeusPooledConnectionUserMatched(ConnectionStore.java:178)

at jeus.jdbc.connectionpool.ConnectionPool.prepareConnection(ConnectionPool.java:854)

at jeus.jdbc.connectionpool.ConnectionPool.innerGetConnection(ConnectionPool.java:736)

at jeus.jdbc.connectionpool.ConnectionPool.getConnection(ConnectionPool.java:662)

at jeus.jdbc.datasource.DataSourceWrapper.getConnection(DataSourceWrapper.java:42)

at jeus_jspwork._500_ds2_5fjsp._jspService(_500_ds2_5fjsp.java:56)

at jeus.servlet.jsp.HttpJspBase.service(HttpJspBase.java:54)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)

at jeus.servlet.jsp.JspServletWrapper.executeServlet(JspServletWrapper.java:147)

at jeus.servlet.servlets.JspServlet.execute(JspServlet.java:365)

at jeus.servlet.engine.HttpRequestProcessor.run(HttpRequestProcessor.java:284)

<<__!Exception__>>

[2014.03.22 17:44:50][0][0_576] [container1-15] [JDBC-0003] Failed to create the new data source instance; export-name=[tbds]

[2014.03.22 17:44:50][1][0_576] [container1-15] [JDBC-0007] Failed to create a new PooledConnection from [tbds]

<<__Exception__>>

jeus.jdbc.connectionpool.JeusSQLException: Failed to create the new data source instance; export-name=[tbds]

at jeus.jdbc.connectionpool.ConnectionPool.getDataSource(ConnectionPool.java:331)

at jeus.jdbc.connectionpool.ConnectionPool.getPooledConnection(ConnectionPool.java:452)

at jeus.jdbc.connectionpool.ConnectionStore.createPooledConnection(ConnectionStore.java:424)

at jeus.jdbc.connectionpool.ConnectionStore.sizeup(ConnectionStore.java:418)

at jeus.jdbc.connectionpool.ConnectionStore.getJeusPooledConnectionUserMatched(ConnectionStore.java:178)

at jeus.jdbc.connectionpool.ConnectionPool.prepareConnection(ConnectionPool.java:854)

at jeus.jdbc.connectionpool.ConnectionPool.innerGetConnection(ConnectionPool.java:736)

at jeus.jdbc.connectionpool.ConnectionPool.getConnection(ConnectionPool.java:662)

at jeus.jdbc.datasource.DataSourceWrapper.getConnection(DataSourceWrapper.java:42)

at jeus_jspwork._500_ds2_5fjsp._jspService(_500_ds2_5fjsp.java:56)

at jeus.servlet.jsp.HttpJspBase.service(HttpJspBase.java:54)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)

at jeus.servlet.jsp.JspServletWrapper.executeServlet(JspServletWrapper.java:147)

at jeus.servlet.servlets.JspServlet.execute(JspServlet.java:365)

at jeus.servlet.engine.HttpRequestProcessor.run(HttpRequestProcessor.java:284)

Caused by: jeus.jdbc.datasource.DBDataSourceException: Could not find the property [ConnectionProperties] in the driver's class [com.tmax.tibero.jdbc.ext.TbConnectionPoolDataSource] for the data source [tbds]. Please check if it is valid property for this data source.

at jeus.jdbc.datasource.DataSourceGenerator.getDataSource(DataSourceGenerator.java:104)

at jeus.jdbc.connectionpool.ConnectionPool.getDataSource(ConnectionPool.java:328)

... 14 more

Caused by: java.lang.NoSuchMethodException: com.tmax.tibero.jdbc.ext.TbConnectionPoolDataSource.setConnectionProperties(java.util.Properties)

at java.lang.Class.getMethod(Class.java:1581)

at jeus.jdbc.datasource.DBDSBinder.invokeMethod(DBDSBinder.java:98)

at jeus.jdbc.datasource.DataSourceGenerator.getDataSource(DataSourceGenerator.java:64)

... 15 more

<<__!Exception__>>

 

JEUS 6.x

JEUSMain.xml 파일에 다음 항목을 추가 합니다.

<database>

    <vendor>tibero</vendor>

    <export-name>tbds3</export-name>

    <data-source-class-name>

com.tmax.tibero.jdbc.ext.TbConnectionPoolDataSource

</data-source-class-name>

    <data-source-type>ConnectionPoolDataSource</data-source-type>

    <database-name>tibero</database-name>

    <port-number>8629</port-number>

    <server-name>192.168.80.10</server-name>

    <user>tibero</user>

    <password>tmax</password>

    <property>

        <name>ConnectionProperties</name>

        <type>java.util.Properties</type>

        <value>program_name=was2_tbds</value>

    </property>

    <connection-pool>

        <pooling>

            <min>1</min>

            <max>10</max>

            <step>1</step>

            <period>300000</period>

        </pooling>

        <check-query>select 1 from dual</check-query>

    </connection-pool>

</database>

위의 같이 ConnectionPropertiesv$session.program의 값을 원하는 대로 정의 해 주면 됩니다.

 

JEUS 7.x

WebAdmin Resources > DataSource 에서 변경할 DataSource를 선택 한 후 고급 선택사항의 Property 부분에 다음과 같이 설정할 수 있습니다.

ConnectionProperties:java.util.Properties=program_name=ms2_tbds



 

 

2. Stand-Alone JAVA Application에서 설정 방법

2.1 사용하는 DB Oracle인 경우

다음과 같이 source code에 넣어준다.

public class JdbcTest{

public static void main(String[] args) throws Exception{

Class.forName("oracle.jdbc.driver.OracleDriver");

Properties prop = new Properties();

prop.setProperty("user","scott");

prop.setProperty("password","tiger");

prop.setProperty("v$session.program","JAVA");

Connection conn =

DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ora11g", prop);

 

2.2 사용하는 DB Tibero인 경우

다음과 같이 source code에 넣어준다.

public class JdbcTest{

public static void main(String[] args) throws Exception{

Class.forName("com.tmax.tibero.jdbc.TbDriver");

Properties prop = new Properties();

prop.setProperty("user","tibero");

prop.setProperty("password","tmax");

prop.setProperty("program_name","JAVA");

Connection conn =

DriverManager.getConnection("jdbc:tibero:thin:@localhost:8629:tibero", prop);

 

3. 확인 방법

3.1 사용하는 DB Oracle인 경우

아래와 같은 SQL 구문을 DB 세션을 조회할 수 있습니다.

SQL> select username, program, status, osuser, machine from v$session where username='SCOTT' order by program;

 

USERNAME   PROGRAM              STATUS          OSUSER     MACHINE

---------- -------------------- --------------- ---------- ---------------

SCOTT      JDBC Thin Client     INACTIVE        jeustest   public1

SCOTT      sqlplus@public1      INACTIVE        ora11g     public1

SCOTT      JAVA                 INACTIVE        ora11g     public1

SCOTT      was1_orads           INACTIVE        jeus6      testsvr1

SCOTT      ms1_orads            INACTIVE        jeus7      testsvr1

위에서부터 차례대로

- 첫 번째는 JEUS를 통해서 ConnectionProperties 설정 없이 접속한 경우

- 두 번째는 sqlplus 를 통해서 접속한 경우

- 세 번째는 Stand-Alone JAVA 프로그램을 통해 ConnectionProperties를 설정한 뒤 접속한 경우

- 네 번째는 JEUS6에서 ConnectionProperties를 설정한 뒤 접속한 경우

- 다섯 번째는 JEUS7에서 ConnectionProperties를 설정한 뒤 접속한 경우입니다.

 

만약 v$session의 조회 권한이 없을 시 sys or system 계정에서 다음 명령을 통해 권한을 부여 해 주면 확인 이 가능합니다.

SQL> grant select on v_$session to scott ;

v$session 아닌 v_$session 권한을 부여해야 합니다.

 

3.2 사용하는 DB Tibero인 경우

아래와 같은 SQL 구문을 DB 세션을 조회할 수 있습니다.

SQL> select username, prog_name, status, osuser, machine from v$session where username='TIBERO' order by prog_name;

 

USERNAME   PROG_NAME            STATUS          OSUSER     MACHINE

---------- -------------------- --------------- ---------- ---------------

TIBERO     JDBC Thin Client     ACTIVE          jeustest   public1

TIBERO     tbsql                ACTIVE          tibero     public1

TIBERO     JAVA                 ACTIVE          tibero     public1

TIBERO     was2_tbds            ACTIVE          jeus6      testsvr2

TIBERO     ms2_tbds            ACTIVE           jeus7      testsvr2

위에서부터 차례대로

- 첫 번째는 JEUS를 통해서 ConnectionProperties 설정 없이 접속한 경우

- 두 번째는 tbsql을 통해서 접속한 경우

- 세 번째는 Stand-Alone JAVA 프로그램을 통해 ConnectionProperties를 설정한 뒤 접속한 경우

- 네 번째는 JEUS6에서 ConnectionProperties를 설정한 뒤 접속한 경우

- 다섯 번째는 JEUS7에서 ConnectionProperties를 설정한 뒤 접속한 경우입니다.

 

만약 v$session의 조회 권한이 없을 시 sys 계정에서 다음 명령을 통해 권한을 부여 해 주면 확인 이 가능합니다.

SQL> grant select on v$session to tibero;

 

4. 주의사항

ConnectionProperties 를 통해서 user password까지 설정이 가능합니다.

하지만JEUS에서 ConnectionProperties를 사용할 경우 다음의 주의사항을 숙지하셔야 합니다.

 

4.1 사용하는 DB Oracle인 경우

Oracle의 경우는 ConnectionProperties에 설정된 user password를 무시합니다.

따라서 JEUS DataSource설정시 <user>, <password> 태그를 사용하거나 <property> user, password를 설정해야만 DB Connection을 생성할 수 있습니다.

이 두 가지 설정 중 하나라도 없이 ConnectionProperties user, password를 설정할 경우 에러가 발생하게 됩니다.

 

4.2 사용하는 DB Tibero인 경우

Tibero의 경우는 ConnectionProperties에 설정된 user password를 무시하지는 않지만 JEUS DataSource설정시 사용하는 tag들과 혼용하여 사용하게 되면 최종적으로 setting된 값이 적용되기에 순서에 주의하여 사용하여야 합니다.

ConnectionPorperties <value>user=sys,password=tibero,program_name=was1_tbds</value> <user>tibero</user> 를 동시에 쓸 경우 나중에 쓴 값이 적용됩니다.

JDBC Spec.에는 어떤 방식으로 사용하라고 명시된 것이 없습니다.

## CASE 1

<user>tibero</user>

<password>tmax</password>

<property>

    <name>ConnectionProperties</name>

    <type>java.util.Properties</type>

    <value>user=sys,password=tibero,program_name=tbds</value>

</property>

CASE 1의 경우는 sys 유저로 접속이 됩니다.

 

## CASE 2

<property>

    <name>ConnectionProperties</name>

    <type>java.util.Properties</type>

    <value>user=sys,password=tibero,program_name=tbds</value>

</property>

<user>tibero</user>

<password>tmax</password>

CASE2의 경우는 tibero 유저로 접속이 됩니다.

 

## CASE 3

<user>tibero</user>

<property>

    <name>ConnectionProperties</name>

    <type>java.util.Properties</type>

    <value>user=sys,password=tibero,program_name=tbds</value>     

</property>

<password>tmax</password>

CASE3의 경우는 sys 유저의 password tmax로 입력한 것과 같아서 에러가 발생합니다.

가능하면 ConnectionProperties user password를 설정하지 않을 것을 권고 합니다.

고맙습니다.

그리드형
댓글
댓글쓰기 폼