将DBMS_APPLICATION_INFO与Jboss一起使用

时间:2008-09-10 03:37:33

标签: java oracle jboss

有没有人有关于如何在JBOSS中使用DBMS_APPLICATION_INFO包的示例?

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

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

以前有人这样做过吗?

3 个答案:

答案 0 :(得分:1)

是的,您可以围绕连接池编写一个包装类,并在连接周围创建一个包装器 所以,假设你有:

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

希望这有帮助,我在开发服务器上执行类似的操作来捕获未关闭的连接(不返回池)。

答案 1 :(得分:1)

如果您使用的是JBoss,则可以使用“valid-connection-checker”。 此类通常用于检查Connection的有效性。 但是,每次Connection Pool为用户提供Connection时都会调用它,您可以使用它来设置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;
}

希望它有所帮助!

伯努瓦

答案 2 :(得分:0)

-ds.xml 中,您可以设置名为 v $ session.program 的连接属性,该属性的值将填充 PROGRAM < / strong>为来自连接池的连接创建的 V $ SESSION 视图中每个会话的列。我通常将其设置为 jboss.server.name 属性。

有关示例,请参阅here