共有キャッシュが無効になっている場合、これらのメソッドは同等であるかどうか疑問に思います。
@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 にもう一度アクセスしますが、このシナリオではエンティティは常に同じです
私は何か見落としてますか?