티스토리 뷰
본 포스팅은 Oracle / Tibero 접속세션을 구분하는 방법에 대한 고찰입니다.
Oracle과 Tibero를 사용할 때 JDBC를 통해 접속한 세션을 구분 할 수 있도록 JDBC접속시 Connection Properties를 통해 구분자를 넣어줄 수 있습니다. 하나의 Node에 다수의 WAS Instance가 있을 경우 DB관점에서 모니터링, Session Kill 시 등의 동작 수행 시 원하는 Session을 선택하는데 용이하게 사용할 수 있습니다.
1. ConnectionPool을 사용하는 경우 설정방법
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>
위의 같이 ConnectionProperties에 v$session.program의 값을 원하는 대로 정의 해 주면 됩니다.
WebAdmin 의 Resources > DataSource 에서 변경할 DataSource를 선택 한 후 고급 선택사항의 Property 부분에 다음과 같이 설정할 수 있습니다.
ConnectionProperties:java.util.Properties=v$session.program=ms1_orads
이 기능은 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__>>
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>
위의 같이 ConnectionProperties에 v$session.program의 값을 원하는 대로 정의 해 주면 됩니다.
WebAdmin 의 Resources > DataSource 에서 변경할 DataSource를 선택 한 후 고급 선택사항의 Property 부분에 다음과 같이 설정할 수 있습니다.
ConnectionProperties:java.util.Properties=program_name=ms2_tbds
2. Stand-Alone JAVA Application에서 설정 방법
다음과 같이 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);
다음과 같이 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);
아래와 같은 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에 권한을 부여해야 합니다.
아래와 같은 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 계정에서 다음 명령을 통해 권한을 부여 해 주면 확인 이 가능합니다.
ConnectionProperties 를 통해서 user와 password까지 설정이 가능합니다.
하지만JEUS에서 ConnectionProperties를 사용할 경우 다음의 주의사항을 숙지하셔야 합니다.
Oracle의 경우는 ConnectionProperties에 설정된 user와 password를 무시합니다.
따라서 JEUS의 DataSource설정시 <user>, <password> 태그를 사용하거나 <property>로 user, password를 설정해야만 DB Connection을 생성할 수 있습니다.
이 두 가지 설정 중 하나라도 없이 ConnectionProperties 에 user, password를 설정할 경우 에러가 발생하게 됩니다.
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를 설정하지 않을 것을 권고 합니다.
고맙습니다.
'④ 미들웨어 > ⓙ JEUS' 카테고리의 다른 글
[Web Application Server] JEUS7 중복로그인 방지기능 (2) | 2018.07.10 |
---|---|
[JEUS] ClassLoader(Classloading) 및 Class 동적반영 (2) | 2018.07.09 |
[JEUS] Encoding 설정에 따른 출력 Test (2) | 2018.07.03 |
[Web Application Server] JEUS7 Password 변경 가이드 (0) | 2018.07.03 |
[Web Application Server] JEUS8 Managed Server Status (2) | 2018.07.02 |
- Total
- Today
- Yesterday
- openstack token issue
- aa
- JEUS6
- apache
- openstack tenant
- wildfly
- JEUS7
- SWA
- SA
- git
- JBoss
- webtob
- 마이크로서비스
- 오픈스택
- nodejs
- aws
- TA
- API Gateway
- MSA
- 마이크로서비스 아키텍처
- 쿠버네티스
- OpenStack
- Architecture
- 아키텍처
- k8s
- Da
- kubernetes
- jeus
- node.js
- Docker
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |