雑貨屋さん.com 一覧取得SQLについて

ホーム フォーラム Q&A「わかりやすいJavaEE」 雑貨屋さん.com 一覧取得SQLについて

このトピックには1件の返信が含まれ、1人の参加者がいます。2 年前 川場隆 さんが最後の更新を行いました。

2件の投稿を表示中 - 1 - 2件目 (全2件中)
  • 投稿者
    投稿
  • #2201 返信

    ja

    雑貨屋さん.comの「content-1.xhtml」を参考に、画像を含む一覧を表示するアプリを開発しています。

    一覧ページ遷移時に、一覧取得を行うSQL発行が性能のボトルネックになっているため、
    一覧取得を行うSQL発行を1回にのみにしたいです。

    雑貨屋さん.comでもSQLログを表示させるようにしたところ、
    一覧取得SQLが5回発行されていました。

    SQLログ
    SELECT ID AS a1, KIND AS a2, NAME AS a3, PRICE AS a4, TEXT AS a5 FROM ZAKKA_PRODUCT ORDER BY ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY
    bind => [20, 5]

    (上記が5回発行される)

    一覧を取得するSQLを一回のみにする方法はありませんでしょうか。

    #2202 返信

    川場隆

    いわゆるN+1問題だと思うのですが、雑貨屋さんは、入門用の例題ですからその対策はしてありません。
    昨年Java Day Tokyo での私の講演をOracleがまとめた記事があります。
    JPA全般についての記事ですが、最後の方でこの問題の解決方法を述べています。

    「初めてのJPA–シンプルで使いやすい、Java EEのデータ永続化機能の基本を学ぶ」
    http://builder.japan.zdnet.com/sp_oracle/weblogic/35067018/3/

     ただし、EclipseLink(JavaEEのデフォルトのJPA実装)では、N+1が入れ子になったケースまではうまくいきません。完全な解決を目指すなら、エンティティグラフを使うのがいいです。ただし、JPAはHibernateを使う必要があります。EclipseLinkは、エンティティグラフでSQLをひとつにまとめることができません。
     
     エンティティグラフについては、JavaIndexに解説記事を書きましたので見てください。(現在、日本語で読める記事では一番詳しいと思います)

    わかりやすい JPA(10)
    エンティティグラフの効果的な使い方

    わかりやすい JPA(10)
    エンティティグラフの効果的な使い方

    Hibernataの組み込み方や具体的な使い方も、例題を含めて配布していますので参考にしてください。

    なお、JavaIndexの「わかりやすいJPA(1)~(16)」は、JPAについて網羅的に解説した記事ですからぜひご一読をお勧めします。本書の第2版(来年末ころ?)では、加筆修正の上、本に盛り込む予定にしています。

2件の投稿を表示中 - 1 - 2件目 (全2件中)
返信先: 雑貨屋さん.com 一覧取得SQLについて
あなたの情報: