2017-06-07 17 views
1

設定方法クライアント識別子をJavaアプリケーションからのOracle接続に設定します。私のスタックは休止状態4.3.6と春4.1.0です。トランザクションは、注釈@TransactionalsetClientIdentifier on oracle接続Javaアプリケーション

でスプリングによって管理されている私の最初の

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

does't作業をしてみてください、私のデータソースは、のdevの環境には、JNDIレジスタやC3POを経由して、WebLogic Serverで提供され、私はのOracleドライバーv 11.2を使用します。 0.1.0

ありがとうございました。

答えて

3

OraclConnectionインターフェイスには、これを行う専用のメソッドがあります。 以前はsetClientIdentifierでしたが、廃止予定です。今はsetEndToEndMetricsです。これらの列をv$sessionに設定することができます。 WebLogic Server上で解決 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); 
+0

は、それが働いている、あなたに感謝しますが、接続は自分のアプリケーションでのoracle.jdbc.OracleConnectionにキャストすることはできません。私はプロキシ接続があり、その接続には内部OracleConnectionがありますが、内部Oracle接続を取得するpublicメソッドはありません。私はこれを試していますhttps://stackoverflow.com/questions/15483356/connection-cannot-be-cast-to-oracle-jdbc-oracleconnection – user2160842

+0

基本的な接続を取得する方法があります。休止状態の場合、これらの2つは機能するはずです。 'の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(); ' –

0

@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); 
} 
関連する問題