1

Glassfish で Java EE 6 を使用する単純な Web アプリケーションで、Oracle Express データベースへのプロキシ認証を使用したいと考えています。ここのEclipselink 2.3.0ドキュメントには次のように書かれています:

JEE および JTA 管理の EntityManager が使用されている場合、EntityManager および JDBC 接続はアプリケーションの制御下にないため、プロキシ ユーザー/パスワードの指定がより困難になる可能性があります。持続性ユニットのプロパティは、EntityManager で引き続き指定できます。EntityManager がデータベース接続を確立する前にこれが行われている限り、これは引き続き機能します。

私のコードは次のとおりですが@Postconstruct init()、最後のプロパティがデフォルトのtrueからfalseに変更されていないため、メソッドが呼び出されたときにデータベース接続がすでに確立されていると思います。また、save() メソッドから ORA-00942: テーブルまたはビューが存在しません。glassfish-resources.xml で定義された jdbc 接続プールのユーザープールuser_aは、プロキシ ユーザーと同様に、テーブルにアクセスできません。

@Stateless
public class Boundary {

    @PersistenceContext EntityManager em;

    @PostConstruct
    private void init()  {
        em.setProperty("eclipselink.oracle.proxy-type", OracleConnection.PROXYTYPE_USER_NAME);
        em.setProperty(OracleConnection.PROXY_USER_NAME, "pool[user_a]");
        em.setProperty(OracleConnection.PROXY_USER_PASSWORD, "pool");
        em.setProperty(OracleConnection.PROXY_ROLES, "pool_user");
        em.setProperty("eclipselink.jdbc.exclusive-connection.mode", "Always");
        em.setProperty("eclipselink.jdbc.exclusive-connection.is-lazy", "false");
    }

    public void save() {
        em.merge(new AnEntity());
    }
}

私はあまり経験がありませんが、プロキシ認証が簡単にできると非常に便利なので、時間をかけて試してみました。JavaEE 管理コンテキストでは、EntityManager接続前にプロパティを設定できますか?

私の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="ProxyUserPU" transaction-type="JTA">
    <jta-data-source>SecondTry</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
      <property name="eclipselink.target-database" value="Oracle"/>
      <property name="eclipselink.jdbc.exclusive-connection.is-lazy" value="true"/>
    </properties>
  </persistence-unit>
</persistence>
4

1 に答える 1

1

PostConstruct がこれに適した場所だとは思いません。

新しい EntityManager はすべてのトランザクション境界で永続化コンテキストにバインドされるため、すべてのトランザクション SessionBean メソッドの開始時にこれらのプロパティを設定する必要があります。おそらく、EclipseLink で SessionEvents を使用してプロパティを構成することもできます。

プロパティが固定されている場合は、persistence.xml に入れることもできます。

http://wiki.eclipse.org/EclipseLink/Examples/JPA/Auditing#Use_Oracle_proxy_authentication_to_allow_a_shared_connection_pool_and_a_user_contextを参照して ください。

于 2012-05-30T14:47:09.257 に答える