2008-09-10 37 views
1

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

Wir haben verschiedene Anwendungen, die in JBOSS ausgeführt werden und Db-Pools freigeben. Ich möchte, dass sich diese Anwendungen zu Beginn jeder Sitzung mit DBMS_APPLICATION_INFO an die Datenbank identifizieren, damit ich leichter nachvollziehen kann, welche Teile der Anwendung Datenbankprobleme verursachen.

Ich bin nicht vertraut mit Sitzungslebenszyklen in JBOSS, aber am Ende des Tages, was am Anfang und Ende einer Transaktion passieren muss, muss dieses Paket aufgerufen werden.

Hat jemand das schon mal gemacht?

Antwort

1

ja, können Sie eine Wrapper-Klasse um den Verbindungspool und wraper um die Verbindung schreiben können so sagen, Sie haben:

 
OracleConnection conn=connectionPool.getConnection("java:[email protected]"); 

Ändern Sie es an:

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

Notiere die Verwendung von WrappedOracleConnection oben. Sie müssen dies, weil Sie den engen Anruf zu stoppen müssen

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

hoffte, das hilft, das tue ich etwas ähnliches auf einem Entwicklungs-Server-Verbindungen zu fangen, die nicht geschlossen sind (nicht an den Pool zurückgegeben).

1

Wenn Sie JBoss verwenden, können Sie einen "valid-connection-checker" verwenden. Diese Klasse wird normalerweise verwendet, um die Gültigkeit der Verbindung zu überprüfen. Da es jedoch jedes Mal aufgerufen wird, wenn der Connection-Pool dem Benutzer eine Verbindung gibt, können Sie mit ihm das DBMS_ APPLICATION_INFO setzen.

Sie erklären, eine solche Klasse in der Oracle-ds.xml wie folgt aus:

<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 die org.jboss.resource.adapter.jdbc.ValidConnectionChecker Schnittstelle implementieren müssen. Wenn Sie Maven verwenden, können Sie diese Schnittstelle mit der folgenden Abhängigkeit umfassen:

<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

0

In Ihrem -ds.xml Sie eine Verbindungseigenschaft festlegen v $ session.program und der Wert dieser Eigenschaft wird bevölkern die PROGRAM Spalte jeder Sitzung in der angerufene V $ SESSION Ansicht erstellt für Verbindungen, die aus Ihrem Verbindungspool stammen. Normalerweise setze ich es auf die jboss.server.name Eigenschaft.

Siehe here für ein Beispiel.

Verwandte Themen