与Jboss一起使用DBMS_APPLICATION_INFO

问题描述:

有没有人有如何在JBOSS中使用DBMS_APPLICATION_INFO包的例子?与Jboss一起使用DBMS_APPLICATION_INFO

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

我对JBOSS中的会话生命周期不太熟悉,但在一天结束时,需要发生的事情是在事务的开始和结束时,需要调用此程序包。

有没有人做过这个?

是的,你可以写在你的连接池的一个包装类,和周围的连接 一个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); 
    } 
    ... 
} 

希望这有助于我做一个开发服务器上类似的东西赶未关闭的连接(未返回到池)。

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

希望它有帮助!

伯努瓦

在你-ds.xml,您可以设置所谓的V $ session.program和财产的价值有联系的财产将填充在每届会议程序V $ SESSION为源自连接池的连接创建的视图。我通常将其设置为jboss.server.name属性。

查看here举例。