Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Jboss中使用DBMS_应用程序_信息_Java_Oracle_Jboss - Fatal编程技术网

Java 在Jboss中使用DBMS_应用程序_信息

Java 在Jboss中使用DBMS_应用程序_信息,java,oracle,jboss,Java,Oracle,Jboss,有人举过如何使用JBOSS软件包的例子吗 我们有各种各样的应用程序,它们在JBOSS中运行并共享db池。我希望,在每个会话开始时,这些应用程序使用DBMS_APPLICATION_INFO向数据库标识自己,这样我就可以更轻松地跟踪应用程序的哪些部分导致了数据库问题 我不太熟悉JBOSS中的会话生命周期,但是在一天结束时,需要发生的是在事务的开始和结束时,需要调用这个包 以前有人这样做过吗?是的,您可以围绕连接池编写包装器类,围绕连接编写包装器 假设你有: OracleConnection con

有人举过如何使用JBOSS软件包的例子吗

我们有各种各样的应用程序,它们在JBOSS中运行并共享db池。我希望,在每个会话开始时,这些应用程序使用DBMS_APPLICATION_INFO向数据库标识自己,这样我就可以更轻松地跟踪应用程序的哪些部分导致了数据库问题

我不太熟悉JBOSS中的会话生命周期,但是在一天结束时,需要发生的是在事务的开始和结束时,需要调用这个包


以前有人这样做过吗?

是的,您可以围绕连接池编写包装器类,围绕连接编写包装器 假设你有:

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