Java 在Jboss中使用DBMS_应用程序_信息
有人举过如何使用JBOSS软件包的例子吗 我们有各种各样的应用程序,它们在JBOSS中运行并共享db池。我希望,在每个会话开始时,这些应用程序使用DBMS_APPLICATION_INFO向数据库标识自己,这样我就可以更轻松地跟踪应用程序的哪些部分导致了数据库问题 我不太熟悉JBOSS中的会话生命周期,但是在一天结束时,需要发生的是在事务的开始和结束时,需要调用这个包Java 在Jboss中使用DBMS_应用程序_信息,java,oracle,jboss,Java,Oracle,Jboss,有人举过如何使用JBOSS软件包的例子吗 我们有各种各样的应用程序,它们在JBOSS中运行并共享db池。我希望,在每个会话开始时,这些应用程序使用DBMS_APPLICATION_INFO向数据库标识自己,这样我就可以更轻松地跟踪应用程序的哪些部分导致了数据库问题 我不太熟悉JBOSS中的会话生命周期,但是在一天结束时,需要发生的是在事务的开始和结束时,需要调用这个包 以前有人这样做过吗?是的,您可以围绕连接池编写包装器类,围绕连接编写包装器 假设你有: OracleConnection con
以前有人这样做过吗?是的,您可以围绕连接池编写包装器类,围绕连接编写包装器 假设你有: OracleConnection conn=connectionPool.getConnection("java:scott@mydb"); 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); } 公共类LoggingConnectionPool扩展了ConnectionPool{ 公共OracleConnection getConnection(字符串数据源名称、字符串模块、字符串操作){ OracleConnection conn=getConnection(数据源名称); CallableStatement call=conn.preparedCall(“开始dbms_应用程序_信息.setModule(模块名称=>?,操作名称=>?);结束;”; 试一试{ call.setString(1,模块); call.setString(2,动作); call.execute(); 最后{ call.close(); } 返回新的Wrappedoracle连接(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); } ... } 公共类WrappedOracleConnection扩展了OracleConnection{ 公众假期结束(){ CallableStatement call=this.preparedCall(“开始dbms_应用程序_信息.setModule(模块名称=>?,操作名称=>?);结束;”; 试一试{ call.setNull(1,Types.VARCHAR); call.setNull(2,Types.VARCHAR); call.execute(); 最后{ call.close(); } } //您需要实现其他所有方法 //比如说 公共CallableStatement prepareCall(字符串命令){ 返回super.prepareCall(命令); } ... }
希望这有帮助,我在开发服务器上做了类似的事情来捕获未关闭(未返回到池)的连接。如果您使用JBoss,可以使用“有效连接检查器”。 此类通常用于检查连接的有效性。 但是,由于每次连接池给用户一个连接时都会调用它,因此您可以使用它来设置DBMS应用程序信息 在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>
希望有帮助
Benoît在-ds.xml中,可以设置一个名为v$session.program的连接属性,该属性的值将填充v$session视图中每个会话的program列,该视图是为来自连接池的连接创建的。我通常将其设置为jboss.server.name财产
有关示例,请参见
<dependency>
<groupId>jboss</groupId>
<artifactId>jboss-common-jdbc-wrapper</artifactId>
<version>3.2.3</version>
<scope>provided</scope>
</dependency>
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;
}