Pregunta

¿Alguien tiene ejemplos de cómo utilizar? DBMS_APPLICATION_INFO paquete con JBOSS?

Tenemos varias aplicaciones que se ejecutan dentro de JBOSS y comparten grupos de bases de datos.Me gustaría, al inicio de cada sesión, que estas aplicaciones se identifiquen en la base de datos usando DBMS_APPLICATION_INFO para poder rastrear más fácilmente qué secciones de la aplicación están causando problemas en la base de datos.

No estoy muy familiarizado con los ciclos de vida de las sesiones en JBOSS, pero al final del día, lo que debe suceder es que al inicio y al final de una transacción, se debe llamar a este paquete.

¿Alguien ha hecho esto antes?

¿Fue útil?

Solución

Sí, puede escribir una clase de envoltorio alrededor de su grupo de conexión, y una caminata alrededor de la conexión, así que digamos que tiene:

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

Cámbielo a:

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

Tenga en cuenta el uso de WrappedOracleConnection anterior.Necesitas esto porque necesitas atrapar la llamada cercana.

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 esto ayude, hago algo similar en un servidor de desarrollo para detectar conexiones que no están cerradas (que no se devuelven al grupo).

Otros consejos

Si está utilizando JBoss, puede utilizar un "verificador de conexión válida".Esta clase se utiliza normalmente para comprobar la validez de la Conexión.Pero, como se invocará cada vez que el grupo de conexiones proporcione una conexión al usuario, puede usarlo para configurar DBMS_APLICATION_INFO.

Dicha clase se declara en oracle-ds.xml de esta manera:

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

Su clase debe implementar la interfaz org.jboss.resource.adapter.jdbc.ValidConnectionChecker.Si usa Maven, puede incluir esta interfaz con la siguiente dependencia:

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

Esta interfaz tiene un solo método:esConexiónValida.Copio mi implementación:

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 eso ayude !

Benoît

En tus -ds.xml, puede establecer una propiedad de conexión llamada v$sesión.programa y el valor de esa propiedad poblará el PROGRAMA columna de cada sesión en el V$SESIÓN vista creada para las conexiones que se originan en su grupo de conexiones.Normalmente lo configuro en jboss.nombre.servidor propiedad.

Ver aquí para un ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top