Jboss와 함께 DBMS_APPLICATION_INFO 사용
문제
누구든지 사용 방법에 대한 예가 있습니까? DBMS_APPLICATION_INFO JBOSS와 패키지를 사용하시겠습니까?
우리는 JBOSS 내에서 실행되고 DB 풀을 공유하는 다양한 애플리케이션을 보유하고 있습니다.각 세션이 시작될 때 이러한 애플리케이션이 DBMS_APPLICATION_INFO를 사용하여 데이터베이스에 대해 자신을 식별함으로써 애플리케이션의 어떤 섹션이 데이터베이스 문제를 일으키는지 더 쉽게 추적할 수 있기를 바랍니다.
저는 JBOSS의 세션 수명 주기에 대해 잘 알지 못하지만 결국 트랜잭션의 시작과 끝에서 발생해야 하는 작업은 이 패키지를 호출해야 합니다.
전에 이런 일을 해본 사람이 있나요?
해결책
예, 연결 풀 주변에 래퍼 클래스와 연결 주위에 레퍼를 쓸 수 있으므로 다음과 같이 가정 해 보겠습니다.
OracleConnection conn=connectionPool.getConnection("java:scott@mydb");
다음으로 변경하세요.
public class LoggingConnectionPool extends ConnectionPool{ public OracleConnection getConnection(String datasourceName, String module, String action){ OracleConnection conn=getConnection(datasourceName); CallableStatement call=conn.preparedCall("begin dbms_application_info.setModule(module_name => ?, action_name => ?); end;"); try{ call.setString(1,module); call.setString(2,action); call.execute(); finally{ call.close(); } return new WrappedOracleConnection(conn); }
위의 WrappedOracleConnection 사용에 유의하세요.아슬아슬한 통화를 트랩해야 하기 때문에 이것이 필요합니다.
public class WrappedOracleConnection extends OracleConnection{ public void close(){ CallableStatement call=this.preparedCall("begin dbms_application_info.setModule(module_name => ?, action_name => ?); end;"); try{ call.setNull(1,Types.VARCHAR); call.setNull(2,Types.VARCHAR); call.execute(); finally{ call.close(); } } // and you need to implement every other method //for example public CallableStatement prepareCall(String command){ return super.prepareCall(command); } ... }
이것이 도움이 되기를 바랍니다. 닫히지 않은(풀로 반환되지 않은) 연결을 잡기 위해 개발 서버에서 비슷한 작업을 수행합니다.
다른 팁
JBoss를 사용하는 경우 "valid-connection-checker"를 사용할 수 있습니다.이 클래스는 일반적으로 연결의 유효성을 확인하는 데 사용됩니다.그러나 Connection 풀이 사용자에게 Connection을 제공할 때마다 호출되므로 이를 사용하여 DBMS_APPLICATION _INFO를 설정할 수 있습니다.
oracle-ds.xml에서 다음과 같이 이러한 클래스를 선언합니다.
<local-tx-datasource>
<jndi-name>jdbc/myDS</jndi-name>
<connection-url>jdbc:oracle:thin:@10.10.1.15:1521:SID</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<security-domain>MyEncryptDBPassword</security-domain>
<valid-connection-checker-class-name>test.MyValidConn</valid-connection-checker-class-name>
<metadata>
<type-mapping>Oracle9i</type-mapping>
</metadata>
</local-tx-datasource>
여러분의 클래스는 org.jboss.resource.adapter.jdbc.ValidConnectionChecker 인터페이스를 구현해야 합니다.Maven을 사용하는 경우 다음 종속성과 함께 이 인터페이스를 포함할 수 있습니다.
<dependency>
<groupId>jboss</groupId>
<artifactId>jboss-common-jdbc-wrapper</artifactId>
<version>3.2.3</version>
<scope>provided</scope>
</dependency>
이 인터페이스에는 메서드가 하나만 있습니다.isValidConnection.구현 내용을 복사합니다.
public SQLException isValidConnection(Connection arg0) {
CallableStatement statement;
try {
statement = arg0.prepareCall("call dbms_application_info.set_client_info('"+getInfos()+"')");
statement.execute();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
도움이 되기를 바랍니다!
브누아
당신의 -ds.xml, 다음과 같은 연결 속성을 설정할 수 있습니다. v$session.program 해당 속성의 값이 프로그램 각 세션의 열 V$세션 연결 풀에서 발생하는 연결에 대해 생성된 보기입니다.저는 보통 으로 설정해요 jboss.서버.이름 재산.
보다 여기 예를 들어.