문제

누구든지 사용 방법에 대한 예가 있습니까? 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.서버.이름 재산.

보다 여기 예를 들어.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top