2008-09-10 22 views
1

JBOSS ile DBMS_APPLICATION_INFO paketinin kullanımına ilişkin örnekler var mı?DBBS_APPLICATION_INFO ile Jboss kullanarak

JBOSS içinde çalışan ve db havuzlarını paylaşan çeşitli uygulamalarımız var. Her uygulamanın başında DBMS_APPLICATION_INFO kullanarak kendilerini veritabanına tanıtmak istiyorum, böylece uygulamanın hangi bölümlerinin veritabanı sorunlarına yol açtığını daha kolay takip edebiliyorum.

JBOSS'ta oturum ömrü döngülerini çok aşina değilim, ancak günün sonunda, bir işlemin başında ve sonunda olması gereken şey, bu paketin çağrılması gerekiyor.

Daha önce bunu yapan oldu mu?

cevap

1

evet, bu kadar sen söylüyorlar sağlar bağlantı havuz etrafında bir sarmalayıcı sınıf ve bağlantı etrafında bir wraper yazabilirsiniz: için

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

Değişim it:

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

Not Yukarıdaki WrappedOracleConnection kullanımı. Eğer tuzak yakın çağrı

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

Umut bu ben kapalı değil bağlantılarını yakalamak için bir geliştirme sunucusunda benzer bir şey (havuz dönmediği) yapmak, yardımcı gerekli olmadığından bu gerekir.

1

JBoss kullanıyorsanız, "geçerli bağlantı denetleyicisi" kullanabilirsiniz. Bu sınıf, Bağlantının geçerliliğini kontrol etmek için normal olarak kullanılır. Ancak, Bağlantı havuzu kullanıcıya Bağlantı verildiğinde her zaman çağrılacağından, DBMS_ APPLICATION _INFO değerini ayarlamak için kullanabilirsiniz.

Böyle kahin-ds.xml böyle bir sınıf bildirmek:

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

Sınıfınız org.jboss.resource.adapter.jdbc.ValidConnectionChecker arabirimini uygulamalıdır. isValidConnection:

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

Bu arayüz tek yöntemi vardır: Maven kullanıyorsanız , aşağıdaki bağımlılık ile bu arayüzü içerebilir. benim uygulanmasını kopyalayın:

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

yardımcı olur Umut!

Benoît

-ds.xml, içeri her oturumun PROGRAMI sütunu dolduracaktır v $ session.program ve bu özelliğin değeri denilen bir bağlantı özelliği ayarlayabilirsiniz sizin de
0

Bağlantı havuzunuzdan gelen bağlantılar için V $ SESSION görünümü oluşturuldu. Genellikle jboss.server.name özelliğine ayarlıyorum.

Örnek için here adresine bakın.