Hibernate vs JDBC
っていうキーワードでぐぐると、結構出てきますね。ざっと探したところ、具体的な数字が出てるところはなさそうでしたが。なんかタブーなのかしら?商用のだと、ベンチマーク公開しちゃいけないとかありますけどね。とりあえずざっと計ってみたので、結果だけ載せてみます。ソースは(http://taka-2.com/jclass/archive/OR.zip)です。
前提
CPU: Intel(R) Pentium(R) M processor 1.20GHz
Memory: 504MB
OS: WindowsXP Pro SP2
Java: JSE5 (1.5.0_04)
DataBase: Mysql4.0.26
物理テーブル構造
・顧客
mysql> desc customer; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | ID | int(11) | | PRI | 0 | | | NAME | varchar(16) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql>
・商品
mysql> desc item;
+-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | ID | int(11) | | PRI | 0 | | | NAME | varchar(16) | YES | | NULL | | | PRICE | double | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql>
・注文
mysql> desc orders; +-------------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+---------+------+-----+---------+-------+ | ID | int(11) | | PRI | 0 | | | CUSTOMER_ID | int(11) | YES | | NULL | | | ITEM_ID | int(11) | YES | | NULL | | | QUANTITY | int(11) | YES | | NULL | | +-------------+---------+------+-----+---------+-------+ 4 rows in set (0.00 sec) mysql>
処理概要
1.注文・顧客・商品テーブルに、IDが1〜1000までのデータをINSERT
2.注文・顧客・商品テーブルより、ランダムな注文を1つ取り出す操作を1000回繰り返す
表示形式は以下のとおり。
[CUSTOMER.NAME]さんが[ITEM.NAME]を[ITEM.PRICE]ペソで[ORDERS.QUANTITY]個買いました
3.注文・顧客・商品テーブルより、全てのデータを削除する
以上1,2,3それぞれについて、処理時間を計測する。
計測結果
JDBC/Hibernate | INSERT/UPDATE/SELECT | 1回目(millisec) | 2回目 | 3回目 |
---|---|---|---|---|
JDBC | INSERT | 1062 | 1094 | 1063 |
JDBC | SELECT | 547 | 500 | 515 |
JDBC | DELETE | 16 | 15 | 16 |
Hibernate | INSERT | 5656 | 5687 | 5734 |
Hibernate | SELECT | 1578 | 1531 | 1532 |
Hibernate | DELETE | 3406 | 3422 | 3406 |
というわけで
SELECTに関しては善戦しているといえますが、大量データの登録および削除は苦手なようです。まあ、Hibernateの使い方が悪い可能性も大いにあるので、指摘していただけると助かります。