1

有没有人有如何将DBMS_APPLICATION_INFO包与 JBOSS 一起使用的示例?

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

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

有没有人这样做过?

4

3 回答 3

2

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

希望能帮助到你 !

贝努瓦

于 2008-12-18T14:43:59.450 回答
1

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

OracleConnection conn=connectionPool.getConnection("java:scott@mydb");

将其更改为:

公共类 LoggingConnectionPool 扩展 ConnectionPool{
    public OracleConnection getConnection(String datasourceName, String module, String action){
        OracleConnection conn=getConnection(datasourceName);
        CallableStatement call=conn.preparedCall("开始 dbms_application_info.setModule(module_name => ?, action_name => ?); end;");
        尝试{
            call.setString(1,module);
            call.setString(2,action);
            调用.execute();
        最后{
            调用.close();
        }
        返回新的 WrappedOracleConnection(conn);
    }

注意上面 WrappedOracleConnection 的使用。你需要这个,因为你需要捕获关闭电话

公共类 WrappedOracleConnection 扩展 OracleConnection{
    公共无效关闭(){
        CallableStatement call=this.preparedCall("开始 dbms_application_info.setModule(module_name => ?, action_name => ?); end;");
        尝试{
            call.setNull(1,Types.VARCHAR);
            call.setNull(2,Types.VARCHAR);
            调用.execute();
        最后{
            调用.close();
        }
    }

    // 你需要实现所有其他方法
    //例如
    公共 CallableStatement prepareCall(字符串命令){
        返回 super.prepareCall(command);
    }
    ...
}

希望这会有所帮助,我在开发服务器上做了类似的事情来捕获未关闭的连接(未返回到池中)。

于 2008-09-10T05:06:59.677 回答
0

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

有关示例,请参见此处。

于 2012-03-12T22:02:18.460 回答