在Jboss中使用DBMS_APPLICATION_INFO
时间:2020-03-05 18:50:30 来源:igfitidea点击:
有没有人有如何将DBMS_APPLICATION_INFO包与JBOSS一起使用的示例?
我们有在JBOSS内运行并共享数据库池的各种应用程序。我希望在每个会话开始时,这些应用程序使用DBMS_APPLICATION_INFO向数据库标识自己,以便我可以更轻松地跟踪应用程序的哪些部分引起数据库问题。
我不太熟悉JBOSS中的会话生命周期,但是到最后,需要发生的是在事务的开始和结束时,需要调用此程序包。
有人做过吗?
解决方案
回答
是的,我们可以在连接池周围编写包装器类,并在连接周围编写包装器
因此,假设我们有:
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); }
注意上面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,则可以使用"有效连接检查器"。
此类通常用于检查连接的有效性。
但是,由于每次连接池为用户提供连接时都会调用它,因此我们可以使用它来设置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; }
希望能帮助到你 !
贝诺