2

ユーザーの変更を追跡し、正しいユーザー名でOracle DBに保存したいので、現在ログに記録されているユーザー名をDB接続に渡す必要があります。JBoss 5.1 および Oracle 11g データベースで Hibernate を使用しています。

私はこのようなことをする必要があると思います( SOURCE ):

try {
    String e2eMetrics[] = new String[OracleConnection.END_TO_END_STATE_INDEX_MAX];
    e2eMetrics[OracleConnection.END_TO_END_CLIENTID_INDEX] = System.getProperty("user.name");
    ((OracleConnection) conn).setEndToEndMetrics(e2eMetrics, (short) 0);
} catch (SQLException sqle) {
    // Do something...
}

問題:

問題は、接続に値を渡すためにどのように/どこで呼び出すかがわからないことです。hibernate と EntityManagerFactory を使用しており、接続を手動で作成していないため、接続オブジェクト自体にアクセスできないため、どこに、どの瞬間にこのコードを挿入する必要があるかを意味します。ユーザー接続全体で一度だけ呼び出し、接続の解放後にユーザー名を削除する必要があります。

期待される目標:

v$session私の目標は、休止状態によって行われる接続確立の直後/最中に、Java コードまたは休止状態構成から Oracle DB の「client_info」列の下に文字列 (実際のユーザー名) を渡すことです。

手順で値を渡すことができることはわかっており、DBMS_APPLICATION_INFO.SET_CLIENT_INFO()以下のコードで確認しましたが、主な問題は、休止状態での接続確立時に接続全体で一度だけ呼び出す方法ですか?

v$sessionテーブルに値を「client_info」列に渡すための作業テスト:

@Override
@Transactional
public void setDBClientInfo(String clientInfo) {
    try {
        Query query = em.createNativeQuery("{call SYS.dbms_application_info.set_client_info(:userName)}")
                .setParameter("userName", clientInfo);
        query.executeUpdate();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

私の構成:

春サーブレット.xml:

<!-- DataSource -->
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MynameDS" expected-type="javax.sql.DataSource" />

<!-- EntityManagerFactory -->
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceXmlLocation" value="classpath:persistence.xml"/>
    <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
    </property>
</bean>

<!-- TransactionManager -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emf"/>
</bean>

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="MyUnitName" transaction-type="RESOURCE_LOCAL">
    <non-jta-data-source>jdbc/MyNameDS</non-jta-data-source>
    <class>com.mydomain.model.Assignment</class>
    <class>com.mydomain.model.AuditLog</class>
    <class>com.mydomain.model.Person</class>
    <class>com.mydomain.model.Trial</class>
    <class>com.mydomain.model.Violation</class>

    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>
        <property name="hibernate.validator.apply_to_ddl" value="false"/>
        <property name="hibernate.validator.autoregister_listeners" value="false"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
</persistence-unit>

休止状態の構成またはJavaコードを介して行うことは可能ですか?

この問題を解決するのを手伝ってください..

4

0 に答える 0