java - create - utilizando DBMS_APPLICATION_INFO con Jboss
jboss module oracle jdbc (3)
¿Alguien tiene ejemplos de cómo usar el paquete DBMS_APPLICATION_INFO con JBOSS?
Tenemos varias aplicaciones que se ejecutan dentro de JBOSS y comparten grupos de db. Al inicio de cada sesión, quisiera que estas aplicaciones se identifiquen en la base de datos utilizando DBMS_APPLICATION_INFO para que pueda rastrear más fácilmente qué secciones de la aplicación están causando problemas en la base de datos.
No estoy muy familiarizado con los ciclos de vida de la sesión en JBOSS, pero al final del día, lo que debe suceder es al inicio y al final de una transacción, este paquete debe ser llamado.
¿Alguien ha hecho esto antes?
En su -ds.xml , puede establecer una propiedad de conexión llamada v $ session.program y el valor de esa propiedad rellenará la columna PROGRAM de cada sesión en la vista V $ SESSION creada para las conexiones que se originan en su grupo de conexiones. Normalmente lo configuro para la propiedad jboss.server.name .
Vea aquí para un ejemplo.
Si está utilizando JBoss, puede usar un "corrector de conexión válido". Esta clase se usa normalmente para verificar la validez de la Conexión. Pero, como se invocará cada vez que el grupo de conexiones le proporcione una conexión al usuario, puede usarlo para configurar DBMS_ APPLICATION _INFO.
Usted declara tal clase en el oracle-ds.xml así:
<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>
Su clase debe implementar la interfaz org.jboss.resource.adapter.jdbc.ValidConnectionChecker. Si usa Maven, puede incluir esta interfaz con la siguiente dependencia:
<dependency>
<groupId>jboss</groupId>
<artifactId>jboss-common-jdbc-wrapper</artifactId>
<version>3.2.3</version>
<scope>provided</scope>
</dependency>
Esta interfaz tiene solo un método: isValidConnection. Copio mi implementación:
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;
}
Espero eso ayude !
Benoît
sí, puedes escribir una clase contenedora alrededor de tu grupo de conexiones, y un wraper alrededor de la conexión, así que digamos que tienes:
OracleConnection conn=connectionPool.getConnection("java:scott@mydb");
Cambiarlo a:
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); }
Tenga en cuenta el uso de WrappedOracleConnection anterior. Lo necesitas porque necesitas atrapar la llamada cercana
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); } ... }
Espero que esto ayude, hago algo similar en un servidor de desarrollo para capturar conexiones que no están cerradas (no se devuelven al grupo).