0

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

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

  • 命令行客户端 ( mysql): ~160ms
  • 原始 JDBC:~240 毫秒
  • 休眠:~400ms(~0ms 开始,~160ms 获取,~240ms 提交)
  • 休眠,L2:~240ms(~0ms 开始,~0ms 获取,~240ms 提交)
  • 休眠,c3p0:~880ms(~160ms 开始,~240ms 获取,~480ms 提交)
  • 休眠,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 似乎让一切变得更糟?据我所知,我已经禁用了连接测试,否则它可以解释事情。
4

2 回答 2

1

我没有针对您的问题的具体建议,但是有一些调试技术可以帮助您弄清楚发生了什么。如果您可以将连接参数添加到连接 url,则 JDBC 驱动程序将基本上记录所有通过网络传输的时间:

jdbc:mysql://server/database?profileSQL=true

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/

希望这可以帮助。

于 2010-09-02T02:54:11.480 回答
0
  • 如果您使用spring,请使用lazydatasource,以便仅在实际使用时打开连接
  • 尝试使用 BoneCP 而不是 c3p0 以获得更好的性能。
于 2010-09-27T12:40:43.247 回答