我通過一個具有相當高延遲(〜80ms)但帶寬相對較高的連接來連接到MySQL(InnoDB)數據庫。Hibernate/c3p0/MySQL下的網絡延遲
我注意到,查詢時間根據查詢的發佈方式而有很大不同。在以下示例中,我正在通過主鍵對單個小行進行查詢。查詢時間爲:
- 命令行客戶端(
mysql
):〜160毫秒 - 原始JDBC:〜240毫秒
- 休眠:〜400毫秒(〜0毫秒開始,〜160毫秒獲得,〜240毫秒提交)
- 休眠,L2:〜240毫秒(〜0毫秒開始,〜0毫秒得到,〜240毫秒提交)
- 休眠,C3P0:〜880ms(〜160毫秒開始,〜240ms處得到,〜480ms提交)
- 休眠,L2 + C3P0 :〜640ms(〜160ms開始,〜0ms得到,〜480ms提交)
(「L2」表示啓用了Hibernate二級緩存,「c3p0」表示c3p0已啓用,「開始」,「獲取」和「提交」是查詢過程中調用的各種子方法的計時)
這些大致是「穩態」結果,所以L2緩存很熱,並且Hibernate啓動時間被忽略。我假設啓用L2緩存時「get」通常是0ms,因爲實際上沒有get。
我的問題是:
- 爲什麼是網絡延遲的所有查詢的如此大的倍數?即使是
mysql
命令行客戶端似乎也需要2次往返才能進行簡單的查詢。 - 爲什麼所有的JDBC/Hibernate查詢都比命令行客戶端慢得多?即使原始的JDBC客戶端似乎也需要3次往返。
- 爲什麼c3p0似乎會讓一切變得更糟?據我所知,我已經禁用了連接測試,否則可能會解釋這些事情。
謝謝!這些JDBC分析選項看起來非常有用。希望我不必下降到tcpdump,但很高興知道Maatkit工具:) – plinehan 2010-09-07 20:00:08