используя DBMS_APPLICATION_INFO с Jboss - PullRequest
1 голос
/ 10 сентября 2008

У кого-нибудь есть примеры использования пакета DBMS_APPLICATION_INFO с JBOSS?

У нас есть различные приложения, которые работают в JBOSS и совместно используют пулы базы данных. Я хотел бы, чтобы в начале каждого сеанса эти приложения идентифицировали себя в базе данных, используя DBMS_APPLICATION_INFO, чтобы мне было легче отслеживать, какие разделы приложения вызывают проблемы с базой данных.

Я не слишком знаком с жизненными циклами сеансов в JBOSS, но в конце дня должно произойти то, что должно произойти в начале и в конце транзакции.

Кто-нибудь делал это раньше?

Ответы [ 3 ]

1 голос
/ 18 декабря 2008

Если вы используете JBoss, вы можете использовать «valid-connection-checker». Этот класс обычно используется для проверки действительности Соединения. Но так как он будет вызываться каждый раз, когда пул соединений дает пользователю соединение, вы можете использовать его для установки 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;
}

Надеюсь, это поможет!

Benoît

1 голос
/ 10 сентября 2008

да, вы можете написать класс-оболочку для вашего пула соединений и оболочку для соединения так скажем, у вас есть:

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

Надеюсь, это поможет, я делаю нечто подобное на сервере разработки, чтобы перехватывать соединения, которые не закрыты (не возвращены в пул).

0 голосов
/ 13 марта 2012

В вашем -ds.xml вы можете установить свойство соединения с именем v $ session.program , и значение этого свойства заполнит PROGRAM столбец каждого сеанса в представлении V $ SESSION , созданном для соединений, происходящих из вашего пула соединений. Я обычно устанавливаю это свойство jboss.server.name .

См. здесь для примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...