先日の Spring Bootで選択できるアプリケーションサーバの比較 と、 Spring Bootのコネクションプーリングの比較 に続いて、O/Rマッパーの比較をやってみました。

 

Springで使うO/RマッパーはSpring Data JPAが一般的だと思いますが、今回はこの2つを比較しました。

  1. Spring JDBC
  2. 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さんからご指摘いただきました。すみません・・・><

 

2-way SQLの構文木については、こちらのスライドがわかりやすいです。

Doma SQLテンプレートのしくみ from Toshihiro Nakamura

 

修正してベンチを再実行した結果がこちらです。
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オブジェクト)にマッピングできる