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 生成】
问题原因:你遇到的报错是由于与数据库的通信链接失败引起的。可能是由于网络连接问题、数据库服务器故障或者查询语句执行时间过长导致的。
解决方案一:检查网络连接和数据库服务器状态
解决方案二:优化查询语句及数据库配置
解决方案三:分批查询
代码示例:
// 解决方案一
// 检查网络连接
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语句和报错信息,并没有提供具体的编程语言和技术栈,因此我无法给出更为具体的解决方案。