2008-09-10 10 views
1

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

私たちはJBOSS内で動作し、dbプールを共有する様々なアプリケーションを持っています。私は、各セッションの開始時に、これらのアプリケーションがDBMS_APPLICATION_INFOを使用してデータベースに自分自身を識別するようにしたいので、アプリケーションのどのセクションがデータベースの問題を引き起こしているかを簡単に追跡できます。

私はJBOSSのセッションライフサイクルに慣れていませんが、終わりにはトランザクションの開始時と終了時に何が起こる必要があるのでしょうか。このパッケージを呼び出す必要があります。

誰もこれまでに行ったことはありますか?

答えて

1

はい、あなたは、接続プールの周りにラッパークラスを書くことができ、かつ接続 周りwraperはそうあなたが持って言うことができます:

 
OracleConnection conn=connectionPool.getConnection("java:[email protected]"); 

変更し、それはへ:

 
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

JBossを使用している場合は、「valid-connection-checker」を使用できます。 このクラスは、通常、Connectionの有効性をチェックするために使用されます。 ただし、ConnectionプールがユーザーにConnectionを提供するたびに呼び出されるため、これを使用してDBMS_ APPLICATION _INFOを設定できます。

あなたはこのような神託-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インタフェースを実装する必要があります。 isValidConnection:

<dependency> 
    <groupId>jboss</groupId> 
    <artifactId>jboss-common-jdbc-wrapper</artifactId> 
    <version>3.2.3</version> 
    <scope>provided</scope> 
</dependency> 

このインタフェースは、一つだけの方法があります:あなたはMavenを使用している場合 は、次の依存関係を持つ、このインターフェイスを含めることができます。 私は私の実装をコピーします。

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

はそれが役に立てば幸い!

あなた-ds.xmlでブノワ

0

、あなたは五$ session.programと呼ばれる接続プロパティを設定することができますし、そのプロパティの値は、各セッションのPROGRAM列を移入しますV $ SESSIONビューは接続プールからの接続用に作成されました。私は通常のjboss.server.nameプロパティに設定します。

例としてhereを参照してください。

関連する問題