1

how to set client identifier to oracle connection from java application. My stack is hibernate 4.3.6 and spring 4.1.0. Transaction are managed by spring with annotation @Transactional

My first try does't work

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

my datasource is provided by weblogic server via jndi register or c3po in dev enviroment and I use oracle driver v 11.2.0.1.0

Thanks for help.

2 Answers2

4

OraclConnection interface has dedicated method to do this. Some time ago it was setClientIdentifier but it is deprecated. Now it is setEndToEndMetrics. It allows to set up these columns in 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);
Arkadiusz Łukasiewicz
  • 6,241
  • 1
  • 11
  • 17
  • thank you, it is working, but Connection cannot be cast to oracle.jdbc.OracleConnection in my application. I have proxy connection and that connection have inner OracleConnection, but no public method to get inner Oracle connection. I'm trying this one https://stackoverflow.com/questions/15483356/connection-cannot-be-cast-to-oracle-jdbc-oracleconnection – user2160842 Jun 07 '17 at 11:32
  • There is the way to get the underlying connection. For hibernate these two should work. `OracleConnection oracleConnection = connection.unwrap(OracleConnection.class );` other option is `OracleConnection oracleConnection oc = (oracle.jdbc.driver.OracleConnection) connection.getMetaData().getConnection();` For jboos `Connection c = dataSource.getConnection(); org.jboss.resource.adapter.jdbc.WrappedConnection wc = (WrappedConnection) c; OracleConnection ajc = (OracleConnection ) wc.getUnderlyingConnection();` – Arkadiusz Łukasiewicz Jun 07 '17 at 12:46
0

solved on weblogic server:

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