Hibernate / c3p0 / MySQL下的网络延迟

时间:2010-09-02 01:14:15

标签: mysql hibernate jdbc c3p0

我通过具有相当高延迟(~80ms)但带宽相对较高的连接连接到MySQL(InnoDB)数据库。

我注意到查询时间会根据查询的发布方式而有很大差异。在以下示例中,我正在按主键执行单个小行的查询。查询时间为:

  • 命令行客户端(mysql):〜160ms
  • 原始JDBC:~240ms
  • 休眠:~400ms(~0ms开始,~160ms获取,~240ms提交)
  • Hibernate,L2:~240ms(~0ms开始,~0ms得到,~240ms提交)
  • Hibernate,c3p0:~880ms(~160ms开始,~240ms获取,~480ms提交)
  • Hibernate,L2 + c3p0:~640ms(~160ms开始,~0ms获取,~480ms提交)

(“L2”表示启用了Hibernate二级缓存,“c3p0”表示c3p0已启用,“begin”,“get”和“commit”是查询期间调用的各种子方法的时间)

这些大致是“稳态”结果,因此L2缓存很热,并且忽略了Hibernate启动时间。我假设启用L2缓存时“get”通常为0ms,因为实际上没有得到get。

我的问题是:

  • 为什么所有查询都有如此大的网络延迟倍数?即使mysql命令行客户端似乎也需要2次往返才能进行简单查询。
  • 为什么所有JDBC / Hibernate查询都比命令行客户端慢得多?即使是原始JDBC客户端似乎也需要3次往返。
  • 为什么c3p0似乎会让一切变得更糟?据我所知,我已禁用连接测试,否则可以解释事情。

2 个答案:

答案 0 :(得分:1)

我没有针对您的问题的建议,但有一些调试技术可以帮助您弄清楚发生了什么。如果您可以将连接参数添加到连接URL,那么JDBC驱动程序将基本上记录通过线路的所有内容:

JDBC:MySQL的://服务器/数据库profileSQL =真

http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html

您可以看到的另一种方法是通过tcpdump观察您的网络流量。来自Maatkit工具的mk-query-digest可以读取转储输出并帮助您确切了解发生了什么:

http://www.mysqlperformanceblog.com/2009/07/01/gathering-queries-from-a-server-with-maatkit-and-tcpdump/

希望这有帮助。

答案 1 :(得分:0)

  • 如果您使用spring,请使用lazydatasource以便仅在实际使用时打开连接
  • 尝试使用BoneCP而不是c3p0以获得更好的性能。