0

共有キャッシュが無効になっている場合、これらのメソッドは同等であるかどうか疑問に思います。

@Stateless
public class EntityService
{
    @PersistenceContext
    private EntityManager em;

    public <T> T findEntity1(Class<T> clazz, long id)
    {
        return em.find(clazz, id);
    }

    public <T> T findEntity2(Class<T> clazz, long id)
    {
        T entity = em.find(clazz, id);
        em.refresh(entity);
        return entity;
    }
}

これらのメソッドは、既存のトランザクション内で呼び出されることはありません。データベースは、JPA のみを使用してこのアプリケーションによって排他的にアクセスされ、トリガー/ストアド プロシージャ/その他は定義されていません。

私の推測では、次の理由から、それらは同等です。

  • em.find() は共有キャッシュ (L2) を検索しますが、空です (無効)
  • em.find() は独自のキャッシュ (L1) を検索しますが、空です (前のトランザクションがない = em は新しい)
  • em.find() はデータベースにアクセスします
  • em.refresh() は db にもう一度アクセスしますが、このシナリオではエンティティは常に同じです

私は何か見落としてますか?

4

0 に答える 0