2008-09-10 5 views
1

Est-ce que quelqu'un a des exemples d'utilisation du paquet DBMS_APPLICATION_INFO avec JBOSS?en utilisant DBMS_APPLICATION_INFO avec Jboss

Nous avons diverses applications qui s'exécutent dans JBOSS et partagent les pools de base de données. Je voudrais, au début de chaque session, que ces applications s'identifient à la base de données en utilisant DBMS_APPLICATION_INFO afin que je puisse plus facilement suivre quelles sections de l'application causent des problèmes de base de données. Je ne connais pas très bien les cycles de vie de session dans JBOSS, mais en fin de compte, ce qui doit arriver est au début et à la fin d'une transaction, ce paquet doit être appelé.

Quelqu'un at-il déjà fait cela?

Répondre

1

oui, vous pouvez écrire une classe wrapper autour de votre piscine de connexion et un wraper autour de la connexion permet donc dire que vous avez:

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

Modifier à:

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

Notez le utilisation de WrappedOracleConnection ci-dessus. Vous avez besoin de cela parce que vous avez besoin pour piéger l'appel près

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

Hope cette aide, je fais quelque chose de similaire sur un serveur de développement pour attraper les connexions qui ne sont pas fermées (pas retourné à la piscine).

1

Si vous utilisez JBoss, vous pouvez utiliser un "valid-connection-checker". Cette classe est normalement utilisée pour vérifier la validité de la connexion. Toutefois, comme il sera appelé chaque fois que le pool de connexion donne une connexion à l'utilisateur, vous pouvez l'utiliser pour définir l'instance _INFO DBMS_ APPLICATION.

Vous déclarez une telle classe dans l'oracle-ds.xml comme ceci:

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

Votre classe doit implémenter l'interface org.jboss.resource.adapter.jdbc.ValidConnectionChecker. Si vous utilisez Maven, vous pouvez inclure cette interface avec la dépendance suivante:

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

Cette interface a une seule méthode: isValidConnection. je copie mon implémentation:

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

Hope it helps!

Benoît

0

Dans votre -ds.xml, vous pouvez définir une propriété de connexion appelé v $ session.program et la valeur de cette propriété sera alimenter le PROGRAMME colonne de chaque session dans le V $ SESSION vue créée pour les connexions provenant de votre pool de connexions. Je le règle généralement à la propriété jboss.server.name.

Voir here pour un exemple.