多対多の関係を通じて別のクラスのコレクションに関連するクラスのリストがあります。学生には多くの役割があります。
すべての学生でgetRoles()が呼び出されるたびにDBにヒットするというN + 1の問題を防ぐために、Studentクラス内のロールのセットでBatchSize(size = 15)を使用しました。
データベーステーブルには15個のロールしかありません(したがって、BatchSizeは15です)。ただし、アプリの実行後に気付いたのは、Hibernateが15個のロールを事前にロードしようとし、繰り返し処理するときに必要に応じてロードすることです。学生のコレクション。
これらすべての役割が同じであることを理解していませんか?そして、単にすべての学生の間で共有されますか?15のロールがSessionContextに何度も持ち込まれます。個別のHQLクエリを使用して15個のロールすべてを事前にロードした場合でも、最初の学生でgetRoles()を呼び出すと、データベースがヒットします。
そこで、BatchSizeを1500に設定して、Hiberanteがロールを事前にAAAALLLLにロードできるようにしました。それもうまくいきませんでした。最初のクエリで186をロードし、2番目のクエリでさらに100と126をロードしました。3 dbヒットは363(リスト内の学生の数)よりも優れていますが、それでもより良い方法があるはずです。
レベル2のキャッシュがオフになっていますが、これはこれとは何の関係もないと思います。
お時間をいただきありがとうございます。