1

JBOSS でDBMS_APPLICATION_INFOパッケージを使用する方法の例はありますか?

JBOSS 内で実行され、db プールを共有するさまざまなアプリケーションがあります。各セッションの開始時に、アプリケーションのどのセクションがデータベースの問題を引き起こしているかをより簡単に追跡できるように、これらのアプリケーションが DBMS_APPLICATION_INFO を使用してデータベースに対して自身を識別できるようにしたいと考えています。

私は JBOSS のセッション ライフ サイクルにあまり詳しくありませんが、結局のところ、トランザクションの開始時と終了時にこのパッケージを呼び出す必要があります。

誰もこれを以前にやったことがありますか?

4

3 に答える 3

2

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 という 1 つのメソッドしかありません。実装をコピーします。

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

yes, you can write a wrapper class around your connection pool, and a wraper around the connection so lets say you have:

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

Change it to:

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

Note the use of WrappedOracleConnection above. You need this because you need to trap the close call

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

Hope this helps, I do something similar on a development server to catch connections that are not closed (not returned to the pool).

于 2008-09-10T05:06:59.677 に答える
0

-ds.xmlで、 v$session.programという接続プロパティを設定できます。そのプロパティの値は、接続プールからの接続用に作成されたV$SESSIONビューの各セッションのPROGRAM列に移入されます。通常はjboss.server.nameプロパティに設定します。

例については、こちらを参照してください。

于 2012-03-12T22:02:18.460 に答える