【问题标题】:using DBMS_APPLICATION_INFO with Jboss将 DBMS_APPLICATION_INFO 与 Jboss 一起使用
【发布时间】:2008-09-10 03:37:33
【问题描述】:

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

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

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

以前有人做过吗?

【问题讨论】:

    标签: java oracle jboss


    【解决方案1】:

    如果您使用的是 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;
    }
    

    希望对你有帮助!

    贝努瓦

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        有关示例,请参阅 here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-29
          • 1970-01-01
          • 2011-01-17
          • 2018-04-14
          • 2013-05-09
          • 2014-10-07
          • 1970-01-01
          相关资源
          最近更新 更多