【问题标题】:setClientIdentifier on oracle Connection from java application来自java应用程序的oracle连接上的setClientIdentifier
【发布时间】:2017-11-08 14:27:01
【问题描述】:

如何将 客户端标识符 设置为来自 java 应用程序的 oracle 连接。我的堆栈是休眠 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 register 或 c3po 在开发环境中提供,我使用 oracle driver v 11.2.0.1.0

感谢您的帮助。

【问题讨论】:

    标签: java spring oracle hibernate clientid


    【解决方案1】:

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

    【讨论】:

      【解决方案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);
      

      【讨论】:

      • 谢谢,它正在工作,但无法在我的应用程序中将 Connection 强制转换为 oracle.jdbc.OracleConnection。我有代理连接,并且该连接具有内部 OracleConnection,但没有获取内部 Oracle 连接的公共方法。我正在尝试这个stackoverflow.com/questions/15483356/…
      • 有办法获取底层连接。对于休眠,这两个应该可以工作。 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();
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      相关资源
      最近更新 更多