Mysql数据库分页查询共15万条数据前每页10条前60000条正常查询,7万-15万报错

SQL: SELECT * FROM win_bidding ORDER BY publication_date DESC LIMIT ?,? 参数 10万条,每页10条数据库查询20s
共15万条数据 60000条之后后端报错 异常信息
org.springframework.dao.RecoverableDataAccessException: ### Error querying database. Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet successfully received from the server was 10,002 milliseconds ago. The last packet sent successfully to the server was 10,019 milliseconds ago. ### The error may exist in URL [jar:file:/D:/javaPrograme/prod/renren-admin.jar!/BOOT-INF/classes!/mapper/bidding/WinBiddingDao.xml] ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### ### Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet successfully received from the server was 10,002 milliseconds ago.

超时了, sql语句可以做点简单的优化

【以下回答由 GPT 生成】

问题原因:你遇到的报错是由于与数据库的通信链接失败引起的。可能是由于网络连接问题、数据库服务器故障或者查询语句执行时间过长导致的。

解决方案一:检查网络连接和数据库服务器状态

  1. 确保你的网络连接是正常的。尝试使用ping命令检查网络的连通性,确保能够正常访问数据库服务器。
  2. 检查数据库服务器的状态。确保数据库服务器正在运行,并且没有出现任何故障。

解决方案二:优化查询语句及数据库配置

  1. 对查询语句进行优化。对于大数据量的分页查询,使用LIMIT语句可能会导致性能问题。可以考虑使用延迟加载或者索引来提高查询效率。比如可以将查询条件更改为WHERE publication_date < ? ORDER BY publication_date DESC LIMIT ?,?。
  2. 检查数据库配置。确保数据库连接池的配置参数合理,例如最大连接数、最小空闲连接数等。可以适当地增加最大连接数或者增加连接超时时间来应对高并发查询。

解决方案三:分批查询

  1. 将大数据量的查询拆分为多个小查询。例如,可以将10万条数据分成10次查询,每次查询1万条数据,然后再将结果合并。
  2. 在每次查询之间增加适当的休眠时间,以减轻数据库服务器的负载。

代码示例:

// 解决方案一
// 检查网络连接
String host = "数据库服务器地址";
boolean isReachable = InetAddress.getByName(host).isReachable(3000); // 超时时间设置为3秒
if (isReachable) {
    System.out.println("网络连接正常");
} else {
    System.out.println("网络连接异常");
}

// 检查数据库服务器状态
// 可以通过与数据库服务器管理员联系,或者使用数据库管理工具来检查服务器状态

// 解决方案二
// 优化查询语句
// 修改SQL语句为 WHERE publication_date < ? ORDER BY publication_date DESC LIMIT ?,?
String sql = "SELECT * FROM win_bidding WHERE publication_date < ? ORDER BY publication_date DESC LIMIT ?,?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setTimestamp(1, yourTimestamp);
statement.setInt(2, yourOffset);
statement.setInt(3, yourPageSize);

// 检查数据库连接池配置
// 可以通过查阅数据库连接池的文档,来了解如何调整连接池的配置参数

// 解决方案三
int pageSize = 10000;
int offset = 0;
int totalPages = (totalRecords + pageSize - 1) / pageSize; // 计算总页数
List<Record> records = new ArrayList<>();

for (int i = 0; i < totalPages; i++) {
    // 分批查询数据
    String sql = "SELECT * FROM win_bidding WHERE publication_date < ? ORDER BY publication_date DESC LIMIT ?,?";
    PreparedStatement statement = connection.prepareStatement(sql);
    statement.setTimestamp(1, yourTimestamp);
    statement.setInt(2, offset);
    statement.setInt(3, pageSize);

    ResultSet resultSet = statement.executeQuery();
    while (resultSet.next()) {
        // 处理查询结果
        Record record = new Record();
        // ...
        records.add(record);
    }

    // 适当休眠
    Thread.sleep(1000); // 休眠1秒
    offset += pageSize;
}

请注意,以上代码示例是基于Java语言和JDBC的,对于其他编程语言和数据库连接方式,请根据实际情况进行相应修改。由于你提供的问题中只提供了SQL语句和报错信息,并没有提供具体的编程语言和技术栈,因此我无法给出更为具体的解决方案。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^