Spring BootでO/Rマッパーの比較
先日の Spring Bootで選択できるアプリケーションサーバの比較 と、 Spring Bootのコネクションプーリングの比較 に続いて、O/Rマッパーの比較をやってみました。
Springで使うO/RマッパーはSpring Data JPAが一般的だと思いますが、今回はこの2つを比較しました。
- Spring JDBC
- Doma2
比較に使ったアプリ
比較に使ったアプリは、 以前作ったISUCON4予選のSpring Boot実装 です。
ソースはここに置いてます。
※今回のブランチ名はdomaです
サーバはISUCON運営チーム公開の公式AMIを使ってます。
AMI IDはこちらのページを参照してください。
ISUCON4 予選問題の解説と講評 & AMIの公開
公開されたAMIと上記のソースのままでは、DBサーバがボトルネックになっていて、Javaアプリのパフォーマンス比較が出来ないので
@kazeburoさんのこちらのブログエントリーにある設定を行い、ボトルネックを取り除いた状態にして比較しました。
※僕が作ったSpring Boot実装はログイン情報をセッションに保持してないので、memcachedはインストールしてません
ISUCON4 予選でアプリケーションを変更せずに予選通過ラインを突破するの術
スコア
ベンチツールを3回実行した結果です
Spring JDBC > Doma2 の順に高スコアです
Spring JDBC
13:46:43 type:score success:188580 fail:0 score:40738 13:48:00 type:score success:191110 fail:0 score:41283 13:49:16 type:score success:195220 fail:0 score:42170
Doma2
13:36:50 type:score success:106960 fail:0 score:23107 13:38:07 type:score success:116160 fail:0 score:25094 13:39:25 type:score success:115570 fail:0 score:24967
2014/12/08追記 ここから
結構差が開いてしまいました。。。
検証ソースにバグがあり、Doma作者の@nakamura_toさんからご指摘いただきました。すみません・・・><
@matsumana @tokuhirom Domaは構文木(2-way-sqlの構文木)を毎回Visitorで走査して本当のSQLを生成しているのですが、Spring JDBCに比べて遅い原因はそこだと思います。
— toshihiro nakamura (@nakamura_to) December 8, 2014
2-way SQLの構文木については、こちらのスライドがわかりやすいです。
修正してベンチを再実行した結果がこちらです。
EC2を使っているので、同一環境で再比較するためにSpring JDBCも再計測しています。
Spring JDBC
03:42:06 type:score success:185370 fail:0 score:40043 03:43:22 type:score success:187370 fail:0 score:40475 03:44:39 type:score success:189830 fail:0 score:41008
Doma2 (SQLファイルパース結果をキャッシュ)
03:20:09 type:score success:176920 fail:0 score:38219 03:21:28 type:score success:178140 fail:0 score:38481 03:22:44 type:score success:182190 fail:0 score:39357
2014/12/08追記 ここまで
ですが、Doma2が選ばれる理由は以下が多いと思ってます。
僕も最近仕事でDoma2を使っててとても便利なので、SQLをゴリゴリ書きたい派の方にはオススメです。
- 2-way SQL (SQLをリソースファイルに保存)
- コンパイル時のコード検証
- ドメインクラス(データベース上のカラムの値を振る舞いを持ったJavaオブジェクト)にマッピングできる