Frage

Hat jemand Beispiele für die Verwendung von DBMS_APPLICATION_INFO Paket mit JBOSS?

Wir haben verschiedene Anwendungen, die laufen in JBOSS und teilen Sie db-pools.Ich möchte zu Beginn jeder Sitzung diese Anwendungen zu identifizieren, die sich in der Datenbank mit DBMS_APPLICATION_INFO so kann ich Sie leichter verfolgen, welche Abschnitte der Anwendung verursacht, Datenbank-Probleme.

Ich bin nicht allzu vertraut mit session-Lebens-Zyklen in JBOSS, aber am Ende des Tages, was geschehen muss, ist am Anfang und Ende einer Transaktion, wird dieses Paket muss genannt werden.

Hat jemand dies getan, bevor?

War es hilfreich?

Lösung

ja, können Sie schreiben eine wrapper-Klasse um Ihre Verbindungs-pool und ein wraper um die Verbindung so können sagen, Sie haben:

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

Ändern Sie es:

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

Beachten Sie die Verwendung von WrappedOracleConnection oben.Sie benötigen diese, da müssen Sie die trap-close call

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

Hoffe, das hilft, mache ich etwas ähnliches auf einem Entwicklungsserver zu fangen verbindungen, die nicht geschlossen werden (nicht an den pool zurückgegeben).

Andere Tipps

Wenn Sie mithilfe von JBoss, die Sie verwenden können, eine "valid-connection-checker".Diese Klasse wird normalerweise verwendet, um zu überprüfen die Gültigkeit der Verbindung.Aber, wie wird es aufgerufen wird, jedes mal, wenn der Verbindungs-pool gibt dem Benutzer eine Verbindung besteht, können Sie es verwenden, um set die DBMS_ ANWENDUNG _INFO.

Sie erklären, wie eine Klasse in der oracle-ds.xml wie diese:

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

Ihre Klasse implementieren muss, die org.jboss.Ressource.adapter.jdbc.ValidConnectionChecker-Schnittstelle.Wenn Sie Maven verwenden, können Sie diese Schnittstelle mit den folgenden Abhängigkeiten:

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

Diese Schnittstelle hat nur eine Methode:isValidConnection.Ich kopiere meine Implementierung:

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

Hoffe, es hilft !

Benoît

In Ihrem -ds.xml, Sie können einstellen, dass connection-Eigenschaft genannt v$session.Programm und der Wert dieser Eigenschaft wird ein Auffüllen des PROGRAMM Spalte jeder Sitzung in den V$SESSION - Ansicht erstellt für verbindungen mit Ursprung aus Ihrer Verbindung pool.Ich in der Regel setzen Sie es auf die jboss.server.name Eigenschaft.

Finden hier für ein Beispiel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top