有沒有人有如何在JBOSS中使用DBMS_APPLICATION_INFO包的例子?與Jboss一起使用DBMS_APPLICATION_INFO
我們有在JBOSS和共享數據庫池中運行的各種應用程序。我希望在每次會話開始時使用DBMS_APPLICATION_INFO將這些應用程序標識爲數據庫,以便我可以更輕鬆地跟蹤應用程序的哪些部分導致數據庫問題。
我對JBOSS中的會話生命週期不太熟悉,但在一天結束時,需要發生的事情是在事務的開始和結束時,需要調用此程序包。
有沒有人做過這個?
有沒有人有如何在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舉例。