代码之家  ›  专栏  ›  技术社区  ›  Matthew Watson

在jboss中使用dbms应用程序信息

  •  1
  • Matthew Watson  · 技术社区  · 16 年前

    有人有如何使用的例子吗 DBMS_APPLICATION_INFO 用jboss打包?

    我们有一个在JBoss中运行并共享DB池的各种应用程序。我希望在每个会话开始时,这些应用程序使用DBMS应用程序信息将自己标识到数据库,以便更容易地跟踪应用程序的哪些部分导致了数据库问题。

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

    以前有人做过吗?

    3 回复  |  直到 11 年前
        1
  •  1
  •   Tony BenBrahim    16 年前

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

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

    请注意上面使用的WrappedorracleConnection。你需要这个,因为你需要捕捉结束通话

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

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

        2
  •  1
  •   Benoît de CHATEAUVI    16 年前

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

    类必须实现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;
    }
    

    希望它有帮助!

    贝诺特

        3
  •  0
  •   Nicholas    13 年前

    在你 DS-XML ,可以设置名为 v$session.program课程 该属性的值将填充 程序 中每个会话的列 V$会话 为来自连接池的连接创建的视图。我通常把它设置为 jboss.server.name名称 财产。

    here 举个例子。