Domanda

Qualcuno ha esempi di come utilizzare DBMS_APPLICATION_INFO pacchetto con JBOSS?

Disponiamo di varie applicazioni che vengono eseguite all'interno di JBOSS e condividono pool di database.Vorrei che all'inizio di ogni sessione queste applicazioni si identificassero nel database utilizzando DBMS_APPLICATION_INFO in modo da poter monitorare più facilmente quali sezioni dell'applicazione causano problemi al database.

Non ho molta familiarità con i cicli di vita delle sessioni in JBOSS, ma alla fine, ciò che deve accadere è all'inizio e alla fine di una transazione, questo pacchetto deve essere chiamato.

Qualcuno lo ha già fatto?

È stato utile?

Soluzione

Sì, puoi scrivere una lezione di avvolgimento attorno al tuo pool di connessioni e una veratura attorno alla connessione, quindi diciamo che hai:

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

Cambialo in:

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

Nota l'uso di WrappedOracleConnection sopra.Ne hai bisogno perché devi intercettare la chiamata ravvicinata

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

Spero che questo aiuti, faccio qualcosa di simile su un server di sviluppo per rilevare le connessioni che non sono chiuse (non restituite al pool).

Altri suggerimenti

Se stai usando JBoss, puoi usare un "controllo connessione valido".Questa classe viene normalmente utilizzata per verificare la validità della Connessione.Tuttavia, poiché verrà richiamato ogni volta che il pool di connessioni fornisce all'utente una connessione, è possibile utilizzarlo per impostare DBMS_ APPLICATION _INFO.

Dichiari tale classe in oracle-ds.xml in questo modo:

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

La tua classe deve implementare l'interfaccia org.jboss.resource.adapter.jdbc.ValidConnectionChecker.Se usi Maven, puoi includere questa interfaccia con la seguente dipendenza:

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

Questa interfaccia ha un solo metodo:isValidConnection.Copio la mia implementazione:

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

Spero che sia d'aiuto !

Beneit

Nel tuo -ds.xml, è possibile impostare una proprietà di connessione denominata v$session.programma e il valore di quella proprietà popolerà il file PROGRAMMA colonna di ogni sessione nel file V$SESSIONE vista creata per le connessioni originate dal pool di connessioni.Di solito lo imposto su jboss.nome.server proprietà.

Vedere Qui per un esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top