Вопрос

У кого-нибудь есть примеры того, как использовать СУБД_ПРИЛОЖЕНИЕ_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>

Этот интерфейс имеет только один метод:isValidСоединение.Я копирую свою реализацию:

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

В вашем -ds.xml, вы можете установить свойство соединения , называемое v$сессия.программа и значение этого свойства будет заполнять ПРОГРАММА столбец каждой сессии в СЕССИЯ V$ просмотр, созданный для подключений, исходящих из вашего пула подключений.Обычно я устанавливаю его на jboss.server.name собственность.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top