티스토리 뷰

가끔 테스트를 할 때나 모니터링을 할 때 JDBC를 통해 접속한 세션의 정보를 필요로 할 때가 있다.
이럴 때면 해당 세션의 SID를 가져 오기 위해 SQL을 수행하거나 아니면 세션 정보를 지정하기 위해 DBMS_APPLICATION_INFO 팩키지를 수행해야 한다. 이러한 작업은 번거롭기도 하고 Session의 정확한 일량을 체크하고자 할 때 껄끄러울 수도 있다.

그러나 JDBC Connection을 맺을 때 이런 정보를 설정해 놓고 시작한다면 이러한 작업 없이도 원하는 정보를 쉽게 찾을 수 있다. 아래와 같이 Connection을 위한 정보를 제공할 때 v$session의 정보도 포함시켜 보자.

테스트 결과 Oracle Server 10.2.0.4, JDBC Version 10.2.0.1.0 의 환경에서는 machine, program, module의 정보만 바꿔 치기 하는데 성공했다.

아래는 테스트 스크립트이다. 빨갛게 표시한 부분이 v$session의 정보를 바꾸는 부분이다.

 

Class.forName("oracle.jdbc.OracleDriver");
prop.setProperty("user", "test");
prop.setProperty("password", "test");
prop.setProperty("v$session.machine",  "@@artdb@@");
prop.setProperty("v$session.program",  "@@artdb@@");
prop.setProperty("v$session.module",   "@@artdb@@");
conn= DriverManager.getConnection("jdbc:oracle:thin:@server:port:sid", prop);
conn.setAutoCommit(false);
pstmt = conn.prepareStatement("select * from v$session where sid = userenv('sid') ");
rs = pstmt.executeQuery();
rs.next();

System.out.println("SID ==>"+rs.getString("SID"));
System.out.println("SERIAL ==>"+rs.getString("SERIAL#"));
System.out.println("MACHINE ==>"+rs.getString("MACHINE"));
System.out.println("PROGRAM ==>"+rs.getString("PROGRAM"));System.out.println("MODULE ==>"+rs.getString("MODULE"));

 

이 Application을 수행하면 아래와 같은 결과가 나온다.

 

SID ==>150
SERIAL ==>37
MACHINE ==>@@artdb@@
PROGRAM ==>@@artdb@@
MODULE ==>@@artdb@@


 

이 정보가 실제로 쓸만한지 SQLPlus를 통해 Program명을 지정한 값으로 넣고 검색을 해 보았다. 역시 같은 세션의 정보가 나타난다.

 

SQL>select sid, serial#, machine, program, module from v$session where program = '@@artdb@@';

 
SID        SERIAL#    MACHINE        PROGRAM        MODULE
---------- ---------- -------------- -------------- ---------------------------
150        37         @@artdb@@      @@artdb@@      @@artdb@@

 
1 row


 

이러한 방법은 Application에서 특정 업무에 따라 Connection Pool을 제각기 사용할 때 적용하여 사용하는 등으로 응용이 가능할 수도 있을 것 같다.

댓글
댓글쓰기 폼