Pergunta

Alguém tem exemplos de como usar DBMS_APPLICATION_INFO pacote com JBOSS?

Temos vários aplicativos que são executados no JBOSS e compartilham pools de banco de dados.Gostaria que, no início de cada sessão, esses aplicativos se identificassem no banco de dados usando DBMS_APPLICATION_INFO para que eu pudesse rastrear mais facilmente quais seções do aplicativo estão causando problemas no banco de dados.

Não estou muito familiarizado com os ciclos de vida das sessões no JBOSS, mas no final das contas, o que precisa acontecer é no início e no final de uma transação, esse pacote precisa ser chamado.

Alguém já fez isso antes?

Foi útil?

Solução

Sim, você pode escrever uma aula de invólucro ao redor do seu pool de conexões e um Wraper ao redor da conexão, então digamos que você tenha:

OracleConnection conn=connectionPool.getConnection("java:scott@mydb");

Altere para:

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);
    }

Observe o uso de WrappedOracleConnection acima.Você precisa disso porque precisa capturar o perigo

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);
    }
    ...
}

Espero que isso ajude, faço algo semelhante em um servidor de desenvolvimento para capturar conexões que não estão fechadas (não retornadas ao pool).

Outras dicas

Se você estiver usando o JBoss, poderá usar um "verificador de conexão válida".Esta classe é normalmente usada para verificar a validade da Conexão.Mas, como ele será invocado toda vez que o pool de conexões fornecer uma conexão ao usuário, você poderá usá-lo para definir DBMS_APPLICATION_INFO.

Você declara essa classe no oracle-ds.xml assim:

<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>

Sua classe deve implementar a interface org.jboss.resource.adapter.jdbc.ValidConnectionChecker.Se você usa Maven, você pode incluir esta interface com a seguinte dependência:

<dependency>
    <groupId>jboss</groupId>
    <artifactId>jboss-common-jdbc-wrapper</artifactId>
    <version>3.2.3</version>
    <scope>provided</scope>
</dependency>

Esta interface possui apenas um método:isValidConnection.Copio minha implementação:

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;
}

Espero que ajude !

Benoit

Na tua -ds.xml, você pode definir uma propriedade de conexão chamada v$sessão.programa e o valor dessa propriedade preencherá o PROGRAMA coluna de cada sessão na V$SESSÃO visualização criada para conexões originadas do seu pool de conexões.Eu costumo configurá-lo para o jboss.servidor.nome propriedade.

Ver aqui Por exemplo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top