将 DBMS_APPLICATION_INFO 与 Jboss 一起使用
题
有谁有如何使用的示例 DBMS_APPLICATION_INFO 与 JBOSS 一起打包吗?
我们有各种在 JBOSS 中运行并共享数据库池的应用程序。我希望在每个会话开始时,这些应用程序使用 DBMS_APPLICATION_INFO 向数据库标识自己,以便我可以更轻松地跟踪应用程序的哪些部分导致数据库问题。
我不太熟悉 JBOSS 中的会话生命周期,但最终,需要发生的是在事务开始和结束时,需要调用这个包。
以前有人这样做过吗?
解决方案
是的,您可以在连接池周围写一个包装班,以及在连接周围的wraper,因此可以说您有:
OracleConnection conn=connectionPool.getConnection("java:scott@mydb");
将其更改为:
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); }
注意上面 WrappedOracleConnection 的使用。你需要这个因为你需要捕获千钧一发的情况
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); } ... }
希望这有帮助,我在开发服务器上执行类似的操作来捕获未关闭的连接(未返回到池中)。
其他提示
如果您使用 JBoss,则可以使用“有效连接检查器”。该类通常用于检查连接的有效性。但是,由于每次连接池为用户提供连接时都会调用它,因此您可以使用它来设置 DBMS_ APPLICATION _INFO。
您可以在 oracle-ds.xml 中声明这样一个类,如下所示:
<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>
您的类必须实现 org.jboss.resource.adapter.jdbc.ValidConnectionChecker 接口。如果您使用 Maven,则可以通过以下依赖项包含此接口:
<dependency>
<groupId>jboss</groupId>
<artifactId>jboss-common-jdbc-wrapper</artifactId>
<version>3.2.3</version>
<scope>provided</scope>
</dependency>
该接口只有一个方法:isValidConnection。我复制我的实现:
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;
}
希望能帮助到你 !
伯努瓦
在你的 -ds.xml, ,您可以设置一个名为的连接属性 v$session.program 该属性的值将填充 程序 每个会话的列 V$会话 为源自连接池的连接创建的视图。我通常将其设置为 jboss.服务器名称 财产。
看 这里 举个例子。