[Spring]JPA、永続コンテキスト、メインキャッシュ、書き込み遅延📙


持続性コンテキスト


  • アプリケーションとデータベースの間にオブジェクトを格納する論理概念

  • Entity Managerによる永続性コンテキストへのアクセス
  • エンティティーマネージャを作成すると、
  • という論理概念「持続コンテキスト」(PersistenceContext)が作成されます.

    持続性コンテキストの利点


    1.メインキャッシュ/エンティティの一貫性の確保


  • 持続性コンテキストは内部にキャッシュを有し、エンティティは(id,instance)のマッピング形式で格納される.
  • 非常に短いメモリ領域(トランザクション単位)
  • 参考画像.

    メンバーが
  • em.persist(メンバー)に永続化されると、プライマリ・キャッシュにはそのメンバーが含まれます.
  • 以降、クエリー時には、まずDBに直接アクセスするのではなくメインキャッシュにアクセスし、メンバー1を見つけ、キャッシュにない場合はDBで検索した後、そのオブジェクトをメインキャッシュに保存して戻ります.
  • で最初にキャッシュされたクエリーにより、エンティティの一貫性が保証されます.
  • 2.書き込み遅延サポート取引

    transaction.begin();
    
    em.persist(memberA);
    
    em.persist(memberB);
    
    // ---- 1 ----
    
    em.flush();
    
    // ---- 2 ----
    
    transaction.commit();
    1の領域ではINSERT QUERYがDBに直接送信されるはずです.
    ただし、sqlクエリを直接送信したり、後で遅延したりすることができます.
    クエリは
  • 書き込み遅延SQLバッファに含まれているため、永続性コンテキストのコマンドに従ってDBに送信されます.

  • memberaがコンテキストに永続化されると、まずプライマリ・キャッシュに格納され、SQLバッファにクエリーが格納されます.
    memberbも同様にプライマリキャッシュとして格納され、クエリはSQLバッファに格納される.

    その後、コマンドcommitトランザクションまたはバッファをコンテキスト(flush)に空にすると、バッファのクエリーはDBに移動します.