プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやる

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の使い方が悪い可能性も大いにあるので、指摘していただけると助かります。