setClientIdentifier в соединении с оракулом из java-приложения

как установить идентификатор клиента для соединения с оракулом из java-приложения. Мой стек - это спящий режим 4.3.6 и весна 4.1.0. Транзакцией управляет spring с аннотацией @Transactional

Моя первая попытка не работает

    @Autowired
private QueryDslUtil queryDslUtil;

@Autowired
private SessionFactory sessionFactory;

@Override
@Transactional(readOnly = true)
public void test(String kod) {


    Session tmpSession = sessionFactory.getCurrentSession();
    tmpSession.doWork(connection -> {
        Properties prop = new Properties();
        prop.put("userId", "mito");
        connection.setClientInfo(prop);
    });


    Objects.requireNonNull(kod);
    QOrganizacia source = QOrganizacia.organizacia;
    queryDslUtil.from(source).where(source.kod.eq(kod)).uniqueResult(source);
}

мой источник данных предоставляется сервером weblogic через регистр jndi или c3po в среде разработки, и я использую драйвер oracle v 11.2.0.1.0

Спасибо за помощь.


person user2160842    schedule 07.06.2017    source источник


Ответы (2)


Интерфейс OraclConnection имеет для этого специальный метод. Некоторое время назад это было setClientIdentifier, но оно устарело. Сейчас setEndToEndMetrics. Это позволяет настроить эти столбцы в v$session. select MODULE, ACTION , CLIENT_IDENTIFIER from v$session;

      String metric[] = new String[OracleConnection.END_TO_END_STATE_INDEX_MAX];
      metric[OracleConnection.END_TO_END_ACTION_INDEX]   = "I'm ACTION ";
      metric[OracleConnection.END_TO_END_MODULE_INDEX]   = "i'm MODULE";
      metric[OracleConnection.END_TO_END_CLIENTID_INDEX] = "I'm CLIENT_IDENTIFIER";
      ((OracleConnection) connection).setEndToEndMetrics(metric, (short) 0);
person Arkadiusz Łukasiewicz    schedule 07.06.2017
comment
спасибо, это работает, но Connection не может быть передан в oracle.jdbc.OracleConnection в моем приложении. У меня есть прокси-соединение, и это соединение имеет внутреннее соединение OracleConnection, но нет общедоступного метода для получения внутреннего соединения Oracle. Я пробую этот stackoverflow.com/questions/15483356/ - person user2160842; 07.06.2017
comment
Есть способ получить основное соединение. Для спящего режима эти два должны работать. OracleConnection oracleConnection = connection.unwrap(OracleConnection.class ); другой вариант OracleConnection oracleConnection oc = (oracle.jdbc.driver.OracleConnection) connection.getMetaData().getConnection(); для jboos Connection c = dataSource.getConnection(); org.jboss.resource.adapter.jdbc.WrappedConnection wc = (WrappedConnection) c; OracleConnection ajc = (OracleConnection ) wc.getUnderlyingConnection(); - person Arkadiusz Łukasiewicz; 07.06.2017

решено на сервере weblogic:

@Override
@Transactional(readOnly = true)
public void log(String kod) {


    Session tmpSession = sessionFactory.getCurrentSession();
    tmpSession.doWork(connection -> {
        WebLogicNativeJdbcExtractor wlne = new WebLogicNativeJdbcExtractor();
        Connection oracleConnection = wlne.getNativeConnection(connection);
        LOGGER.debug("in work...");
        LOGGER.debug("is oracleConnection {}", oracleConnection instanceof OracleConnection);
        LOGGER.debug("oracleConnection casted {}", oracleConnection);
        String metric[] = new String[OracleConnection.END_TO_END_STATE_INDEX_MAX];
        metric[OracleConnection.END_TO_END_ACTION_INDEX] = "I'm ACTION ";
        metric[OracleConnection.END_TO_END_MODULE_INDEX] = "i'm MODULE";
        metric[OracleConnection.END_TO_END_CLIENTID_INDEX] = "user";
        ((OracleConnection )oracleConnection).setEndToEndMetrics(metric, (short) 0);
    });


    Objects.requireNonNull(kod);
    QOrganizacia source = QOrganizacia.organizacia;
    queryDslUtil.from(source).where(source.nazov.eq(kod)).uniqueResult(source);
}
person user2160842    schedule 08.06.2017