【发布时间】: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