Question

Quelqu'un aurait-il des exemples d'utilisation DBMS_APPLICATION_INFO package avec JBOSS?

Nous avons une variété d'applications qui s'exécutent au sein de JBOSS et de partager db piscines.Je voudrais, au début de chaque séance, ces applications afin d'identifier eux-mêmes à la base de données à l'aide de DBMS_APPLICATION_INFO afin que je puisse suivre plus facilement les sections de l'application est à l'origine de problèmes de base de données.

Je ne suis pas trop familier avec la session cycle de vie, dans JBOSS, mais à la fin de la journée, ce qui doit arriver est au début et à la fin d'une transaction, ce paquet doit être appelé.

Quelqu'un a fait cela avant?

Était-ce utile?

La solution

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

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

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 l'utilisation de WrappedOracleConnection ci-dessus.Vous avez besoin de ce parce que vous avez besoin pour intercepter l'appel à proximité

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

Espérons que cela 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).

Autres conseils

Si vous êtes à l'aide de JBoss, vous pouvez utiliser un "valide-connexion-checker".Cette classe est normalement utilisé pour vérifier la validité de la Connexion.Mais, comme il sera appelé à chaque fois que le pool de Connexion donne à l'utilisateur une Connexion, vous pouvez l'utiliser pour définir la DBMS_ APPLICATION _INFO.

Vous déclarez une telle classe dans le 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'org.jboss.de la ressource.l'adaptateur.jdbc.ValidConnectionChecker interface.Si vous utilisez Maven, vous pouvez inclure cette interface avec la dépendance suivant:

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

Cette interface n'a qu'une méthode:isValidConnection.Je copie mon application:

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

Espérons que cela aide !

Benoît

Dans votre -ds.xml, vous pouvez définir une propriété de connexion appelé v$session.programme et la valeur de cette propriété sera de remplir la PROGRAMME colonne de chaque séance, l' V$SESSION vue créé pour les connexions provenant de votre pool de connexion.J'ai l'habitude de le régler à l' jboss.serveur.nom de la propriété.

Voir ici pour un exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top