iBATIS で オブジェクトの配列を持つクラスにマッピングする場合に気を付けること

2018年7月18日Java, 開発

おはようございます。

Java で iBATIS を利用しているシステムで、
どうにもパフォーマンスが悪いということで調べてみたら
iBATIS を利用した 1対多 のテーブルを
マッピングしている箇所がまずかったのがわかりました。。

1対多のテーブルをマッピングするのに
普通にやると、多側の取得に N回 のクエリ実行が必要となります。

実はこれが遅い・・・

スポンサーリンク

サンプル

例えば、
次のようなテーブルを DTO(Data Transfer Object)クラスにマッピングするとした場合。

テーブル

会社テーブル

COMPANY_CDCOMPANY_NAME
00001会社1
00002会社2

従業員テーブル

COMPANY_CDEMP_CDEMP_NAMEAGE
00001000001社員125
00001000002社員233
00001000003社員326
00002000001社員443
00002000002社員530

DTOクラス

Company.java

Emp.java

 

SqlMap

sample.xml

こうすることで、1対多のテーブルに対してもマッピングを行えるが、
会社データを取得した後に、従業員データを会社毎に取得しにいってしまうため
データ量が増えると途端に遅くなってしまう。

処理フローのイメージは次の通り。

  1. 会社データ取得「selectCompanyList」
  2. 会社コード毎に「selectEmpList」を呼び出し、
    Companyクラスの empList に結果をマッピングする

結果的に、従業員数 × 1 (会社データ取得)のSQLが発行されることとなる。
1回のSQLがたとえ 0.0001 秒しか掛からなかったとしても
件数が増えれば増えるほど遅くなるのは明白ですよね。

改善方法

データを一括で取得してから、
結果を iBATIS の GroupBy で指定した列によって
グルーピングするという方法がある。

SqlMap

sample.xml

まとめ

プログラムやシステムにもよるところだが、
私が経験した感じだと 1/5 から 1/10 くらいの改善がみられました。

最初から遅い遅いとは思いつつ、
一つしか方法がないと思い込んでいたのが敗因です。

もっと早く気づいていればよかった。。

ではでは。

 

スポンサーリンク


関連するコンテンツ

2018年7月18日Java, 開発iBATIS, Java, ResultMap, プログラミング, 配列

Posted by doradora