代码之家  ›  专栏  ›  技术社区  ›  plinehan

Hibernate/c3p0/MySQL下的网络延迟

  •  0
  • plinehan  · 技术社区  · 15 年前

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

    我注意到,根据查询的发出方式,查询时间会发生巨大变化。在下面的示例中,我将按主键对一小行执行查询。查询时间为:

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

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

    这些大致是“稳态”结果,因此二级缓存是热的,而休眠启动时间被忽略。我假设在二级缓存启用时,“get”通常为0ms,因为实际上没有发出get。

    我的问题是:

    • 为什么所有的查询都是网络延迟的如此大的倍数?甚至 mysql 对于一个简单的查询,命令行客户端似乎需要两次往返。
    • 为什么所有JDBC/Hibernate查询都比命令行客户机慢得多?甚至原始JDBC客户端似乎也需要3次往返。
    • 为什么c3p0似乎让一切变得更糟?据我所知,我已经禁用了连接测试,这本来可以解释问题。
    2 回复  |  直到 15 年前
        1
  •  1
  •   Joshua Martell    15 年前

    我没有针对您的问题的具体建议,但有一些调试技术可以帮助您了解发生了什么。如果可以将连接参数添加到连接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查询摘要可以读取转储输出,并帮助您准确了解发生了什么:

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

    希望这有帮助。

        2
  •  0
  •   joetheeoj    15 年前
    • 如果使用spring,请使用lazydatasource,以便只在实际使用它时打开连接
    • 尝试使用BoneCP而不是c3p0以获得更好的性能。
    推荐文章