1

背景: 既存の SQL Server DB に接続する小さなデスクトップ アプリケーションを作成しています。

私は SQL クエリの作成に精通していますが、今回は JPA を試してみたいと思います。私は自分のエンティティをマッピングしており、すべて問題ありませんが、パフォーマンスについてはほとんど心配していません。

プロファイリングを行った結果、JPA コードは手動でマッピングするよりもそれほど遅くはありません。しかし、私を悩ませている問題がまだ 1 つあります。

SQL Server Profiler でクエリを記録しました。Eclipse リンクは、同じクエリで異なるパラメータを使用して exec sp_prepexec と exec sp_unprepare を常に呼び出しています。

クエリでパラメーターを使用するようにコードを書き直しましたが、まだうまくいきません。

クラスコードは次のとおりです。

コンストラクターで EntityManagerFactory と EntityManager を作成します

    emf = Persistence.createEntityManagerFactory("ZapytaniaOKonta_1.0");
    em = emf.createEntityManager();
    query=prepareQuery();

prepareQuery では、基準ビルダーとパラメーターを使用してクエリを準備します

    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Uczestnik> criteria = builder.createQuery(Uczestnik.class);
    Root<Uczestnik> uczestnikRoot = criteria.from(Uczestnik.class);
    criteria.select(uczestnikRoot);
    ParameterExpression<Boolean> peselFilterParameter = builder.parameter(Boolean.class, "peselFilterParameter");
    ParameterExpression<String> peselParameter = builder.parameter(String.class, "peselParameter");
    Predicate peselPredicate = orBuilder(builder, uczestnikRoot, peselParameter, peselFilterParameter, Uczestnik_.pesel);

    ParameterExpression<Boolean> nipFilterParameter = builder.parameter(Boolean.class, "nipFilterParameter");
    ParameterExpression<String> nipParameter = builder.parameter(String.class, "nipParameter");
    Predicate nipPredicate = orBuilderNip(builder, uczestnikRoot, nipParameter, nipFilterParameter, Uczestnik_.nip);

    ParameterExpression<Boolean> regonFilterParameter = builder.parameter(Boolean.class, "regonFilterParameter");
    ParameterExpression<String> regonParameter = builder.parameter(String.class, "regonParameter");
    Predicate regonPredicate = orBuilder(builder, uczestnikRoot, regonParameter, regonFilterParameter, Uczestnik_.regon);

    criteria.where(builder.and(peselPredicate, nipPredicate, regonPredicate));
    uczestnikPeselRegonNipQuery = em.createQuery(criteria);
    return uczestnikPeselRegonNipQuery;

クエリを使用するときは、すべてのパラメーターを設定して呼び出します

    query.getResultList();

私の質問は、EclipseLinkまたは他のJPA2プロバイダーに準備済みステートメントを使用させるにはどうすればよいですか?

4

1 に答える 1

2

TopLinkは、デフォルトでは文キャッシュを使用しません。1回の使用を可能にするために、

"eclipselink.jdbc.cache-statements"="true"

これは、EclipseLink の接続プーリングでのみ使用できます。JavaEE DataSource を使用する場合、JavaEE サーバーの DataSource 構成でステートメントのキャッシュを有効にする必要があります。

于 2012-12-03T15:28:15.673 に答える