いろいろベンチ(5)
いろいろベンチでHibernateの検索が異様に早いのはキャッシュのせいでは?との意見があったので,ちょっと条件を変えて再測定してみることにしました.
んで,その前に前回と同じ条件で測定してみようと思ったら,全然数字が違うでやんの.
冷静に考えたら,あれはMySQLを対象にした値であって,今はOracleを相手にしてたからだと気づく.
#実測者自身が数字に振り回されるいい例だな.
気を取り直してOracleで測定することに...
MySQLんときは1000回トライしたんですが,Oracleでは1000回だと時間がかかるので,100回に減らして測定.
その結果がこれ(単位は[msec]).
jdbc | JDBC | Hibernate | Torque | DbUtils | |
---|---|---|---|---|---|
INSERT | 286 | 549 | 360 | 832 | 451 |
SELECT | 3,356 | 3,680 | 3,897 | 4,198 | 3,443 |
UPDATE | 286 | 535 | 797 | 1,264 | 547 |
DELETE | 276 | 561 | 805 | 1,250 | 562 |
そんでもって,いろいろベンチ(2)ん時の測定値はこう.
jdbc | JDBC | Hibernate | Torque | DbUtils | |
---|---|---|---|---|---|
INSERT | 297 | 564 | 294 | 964 | 487 |
SELECT | 3,172 | 3,566 | 3,641 | 3,999 | 3,468 |
UPDATE | 285 | 535 | 742 | 1,144 | 536 |
DELETE | 294 | 495 | 757 | 1,127 | 475 |
...すんません.HibernateのSELECTが圧勝だったのはMySQLんときだけで,Oracleだと素のJDBCとそう変わらない結果でした(それはそれでスゴイんですけどね).
テキトウ言ってました.申し訳ないです.
#ついでに言うとMySQLはローカルに,Oracleはリモートにあります.
ちなみに,jdbcってのは,PreparedStatementを効率よく使いまわした場合の結果です.
ここからが新規分.
今までの測定はトランザクションの範囲が広かったんで,今度はトランザクションの範囲を狭めて測定してみることにしました.
つまり,
- 100回INSERTしてからコミット
ではなく,
- 「1回INSERTするごとにコミット」を100回
に変えてみました.INSERT以外もすべて同じふうにSQL一回実行する単位でコミットするようにしました.
JDBC, DbUtils, Torqueは,都度コネクションを取ってきてコミット.Hibernateの場合は,Sessionを都度オープンしてコミットってな具合.
#今までの例は,コネクションやSessionを使いまわしてたんで.
コードでいうとこんな感じやね.
===JDBC, DbUtils === for (int i = 0; i < count; i++) { Connection con = DriverManager.getConnection(...); con.setAutoCommit(false); // 1件INSERTする. con.commit(); con.close(); } ===Hibernate=== for (int i = 0; i < count; i++) { Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); // 1件INSERTする. transaction.commit(); session.close(); } ===Torque=== for (int i = 0; i < count; i++) { Connection con = Torque.getConnection(); con.setAutoCommit(false); // 1件INSERTする. con.commit(); Torque.closeConnection(con); }
んで,その結果はこう(単位[msec]).
jdbc | JDBC | Hibernate | Torque | DbUtils | |
---|---|---|---|---|---|
insert | - | 6,163 | 816 | 1,122 | 5,894 |
select | - | 10,179 | 65,735 | 4,689 | 11,389 |
update | - | 5,946 | 747 | 1,708 | 5,919 |
delete | - | 6,095 | 675 | 1,708 | 6,285 |
JDBC,DbUtilsよりHibernate,Torqueが早いのはコネクションプールの設定だろうか?
#設定した覚えは無いんだけど,ログ見るとプールしてるふうなんでデフォルトで持ってのかな.
Torqueは前回(バッチ処理風)とそう変わることがなかったんだけど,HibernateのSELECTはかなり変化してますなぁ.
うーむ,ここらへんの特性を理解するには,もっと深入りしないといかんか.
#そろそろ知恵熱が出てきた.
ps.
言うの忘れた.計上した測定値はそれぞれ10回測定した値の平均値だす.