【问题标题】:Slow JDBC & Hibernate query performance (compared to PhpMyAdmin)较慢的 JDBC 和 Hibernate 查询性能(与 PhpMyAdmin 相比)
【发布时间】:2017-08-24 10:51:55
【问题描述】:

我正在开发一个 Spring MVC/Hibernate Web 应用程序,并且数据库查询非常慢。我已经搜索过了,但人们在这里询问的性能问题似乎都与我的问题不符(建议包括模型映射或连接池的问题)。

无论我使用普通的 JDBC 还是 Hibernate 来查询数据库,它都需要同样长的时间。为了确保它与 Spring 框架无关,我编写了这个简单的应用程序:

public class JDBCTest {

  static final String JDBC_DRIVER = ...;  
  static final String DB_URL = ...;
  static final String USER = ...;
  static final String PASS = ...;

  public static void main(String[] args) {
    Connection conn = null;
    Statement stmt = null;
    double time;
    try {
      Class.forName("com.mysql.jdbc.Driver");
      start = System.currentTimeMillis();
      conn = DriverManager.getConnection(DB_URL,USER,PASS);
      System.out.println("Conn. duration: " + (System.currentTimeMillis() - start));
      stmt = conn.createStatement();
      String sql = "SELECT * FROM temperature WHERE SensorId = 1 AND metered >= '2016-09-15 14:00:00' AND metered <= '2016-09-16 20:00:00'";
      start = System.currentTimeMillis();          
      ResultSet rs = stmt.executeQuery(sql);
      System.out.println("Query duration: " + (System.currentTimeMillis() - start));
...

虽然打开连接需要 200-300 毫秒(似乎合理),但查询需要 1500-2000 毫秒。

在 PHPMyAdmin 中执行相同的查询时,它说查询花费了 0.0312 秒(与 JDBC 相比 >1 秒)。

可能是什么问题?无论是如上所示的简约 JDBC 应用程序,使用 JDBC 或使用 Hibernate 的 Spring 应用程序 - 查询总是花费大致相同的时间。

它似乎也与时间戳无关,因为即使是简单的“SELECT * FROM temperature”查询也比 PHPMyAdmin 需要的要慢很多倍。

【问题讨论】:

  • 你使用哪个数据库(这很相关)?有关一些提示,请参阅here,您应该提供哪些信息来解决 Oracle 的查询性能问题。还尝试缩小问题范围,您是否使用普通 JDBC(即没有 Spring)有这种行为?
  • 这是 MySQL 5.7.17。是的,即使使用普通 JDBC(没有 Spring、没有 Hibernate、没有 DataSource)也会出现这些问题,请参见上面的代码示例。
  • 如何使用 WHERE 条件返回行?整个表有多少行。如果返回的行数很少,您是否在SensorId, metered 上有索引。而且 - 很抱歉问这个问题,但它确实发生了 - 你确定用你的 PhPAdmin 连接到同一个数据库吗?
  • “打开连接需要 200-300 毫秒”是不合理的。它通常比这快得多。这让我怀疑在运行 Java 代码的机器和数据库服务器之间存在网络问题,例如非常慢的 ping、低带宽、慢 VPN、偏执的防火墙,它坚持对一切进行反向 DNS 处理等。如果 phpmyadmin 与 DB 在同一台服务器上运行,或者在千兆 LAN 上运行,则相比之下,它的网络访问速度将快如闪电。
  • 不,SensorId 上没有索引并且已计量。然而,它肯定是同一个数据库。该数据库在我们局域网中的计算机上运行,​​因此网络应该不是问题,但我尝试连接在本地主机上运行的数据库(应用程序、数据库、PhpMyAdmin - 它们都在本地主机上运行):相同的行为。 PHPMyAdmin 比 JDBC 快得多。它返回大约 60k 行(总共 700k)。

标签: mysql spring performance hibernate jdbc


【解决方案1】:

对于that查询,this复合索引是最优的:

INDEX(SensorId, metered)

为什么第二次查询会运行得更快?通常是因为缓存。或者可能是一个驱动程序以增量方式获取行;另一个一次性得到它们。

如果您想进一步讨论,请提供SHOW CREATE TABLE和EXPLAIN SELECT ...;

【讨论】:

    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2013-01-11
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    相关资源
    最近更新 更多