String driverName = "com.mysql.cj.jdbc.Driver";
String username = "root";
String password = "password";
String jdbcURL = "jdbc:mysql://10.1.1.1:3306/person?useSSL=false&requireSSL=false";
Class.forName(driverName);
Connection connection = DriverManager.getConnection(jdbcURL, username, password);
if (null == connection) {
System.out.println("get connection failed");
return;
}
String sql = "SELECT name,password,id FROM worker";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while(resultSet.next()) {
String name = resultSet.getString(1);
String password_str = resultSet.getString(2);
int id = resultSet.getInt(3);
}
System.out.println("select over");
resultSet.close();
preparedStatement.close();
connection.close();
Exception in thread "main" java.sql.SQLException: Can not read response from server. Expected to read 62 bytes, read 26 bytes before connection was unexpectedly lost.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:972)
at com.demo.SelectOriginMysql.main(SelectOriginMysql.java:22)
Caused by: java.io.EOFException: Can not read response from server. Expected to read 62 bytes, read 26 bytes before connection was unexpectedly lost.
at com.mysql.cj.protocol.FullReadInputStream.readFully(FullReadInputStream.java:67)
at com.mysql.cj.protocol.a.SimplePacketReader.readMessageLocal(SimplePacketReader.java:137)
at com.mysql.cj.protocol.a.SimplePacketReader.readMessage(SimplePacketReader.java:102)
at com.mysql.cj.protocol.a.SimplePacketReader.readMessage(SimplePacketReader.java:45)
at com.mysql.cj.protocol.a.TimeTrackingPacketReader.readMessage(TimeTrackingPacketReader.java:62)
at com.mysql.cj.protocol.a.TimeTrackingPacketReader.readMessage(TimeTrackingPacketReader.java:41)
at com.mysql.cj.protocol.a.MultiPacketReader.readMessage(MultiPacketReader.java:66)
at com.mysql.cj.protocol.a.MultiPacketReader.readMessage(MultiPacketReader.java:44)
at com.mysql.cj.protocol.a.ResultsetRowReader.read(ResultsetRowReader.java:75)
at com.mysql.cj.protocol.a.ResultsetRowReader.read(ResultsetRowReader.java:42)
at com.mysql.cj.protocol.a.NativeProtocol.read(NativeProtocol.java:1651)
at com.mysql.cj.protocol.a.TextResultsetReader.read(TextResultsetReader.java:87)
at com.mysql.cj.protocol.a.TextResultsetReader.read(TextResultsetReader.java:48)
at com.mysql.cj.protocol.a.NativeProtocol.read(NativeProtocol.java:1664)
at com.mysql.cj.protocol.a.NativeProtocol.readAllResults(NativeProtocol.java:1718)
at com.mysql.cj.protocol.a.NativeProtocol.sendQueryPacket(NativeProtocol.java:1064)
at com.mysql.cj.NativeSession.execSQL(NativeSession.java:665)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:893)
... 2 more
数据量太大,你应该分页,分批去查询。
引用 皆我百晓生 小程序回复内容作答:
这个错误可能是由于网络问题或数据库服务器上的问题导致的连接断开。以下是一些可能的解决方法:
检查网络连接:确保网络连接稳定,并且没有任何防火墙或路由器配置问题导致连接断开。
调整连接超时时间:使用DriverManager.setLoginTimeout()
方法设置连接超时时间,以确保连接在超时之前不会断开。
增加连接池大小:将连接池的最大连接数增加为更大的值,以提高连接的稳定性和并发处理能力。
调整数据库服务器配置:如果可能的话,调整数据库服务器的配置,增加服务器的资源(如内存和CPU),以提供更好的处理大数据量查询的性能。
分批查询:将查询结果分批获取,而不是一次性获取所有结果。可以使用ResultSet.setFetchSize()
方法设置每批获取的记录数,以减少对服务器资源的占用。
考虑使用分布式数据库:如果数据量过大,可以考虑使用分布式数据库来处理查询。分布式数据库可以将数据分散存储在多个服务器上,并并行处理查询,以提高查询效率和稳定性。
希望这些解决方法能帮助你解决问题。
什么场景要全表查询的,你可以代码分批查询,比如1000个一批,然后在整合在一起
不要一次性查出来,容易内存溢出。
需要查询,把条件加在where中不行吗?
一次性查询出来是不合理的,数据量太大了,连接一直占用,而且很耗内存。
GPT参考:希望对你有所帮助!
根据你提供的信息,在查询8000万条数据时出现了连接异常。这可能是因为查询结果的数据量太大,导致网络连接超时或服务器资源不足。这种情况下,可以尝试以下几种解决方法:
1】增加连接超时时间:在jdbcURL中添加连接参数&connectTimeout=300000,将连接超时时间设置为较大的值,单位是毫秒。
String jdbcURL = "jdbc:mysql://10.1.1.1:3306/person?useSSL=false&requireSSL=false&connectTimeout=300000";
2】增加服务器资源:如果可能的话,可以尝试增加MySQL服务器的处理能力,例如增加内存、CPU等。
3】分批查询:将查询分成多个小批次进行,每次查询部分数据,然后合并结果。这样可以减少单次查询的数据量,降低连接超时的概率。
String sql = "SELECT name,password,id FROM worker LIMIT ?, ?";
int batchSize = 1000000; // 每次查询的数据量
int offset = 0;
while (true) {
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, offset);
preparedStatement.setInt(2, batchSize);
ResultSet resultSet = preparedStatement.executeQuery();
while(resultSet.next()) {
String name = resultSet.getString(1);
String password_str = resultSet.getString(2);
int id = resultSet.getInt(3);
// 处理查询结果
}
resultSet.close();
preparedStatement.close();
if (offset + batchSize >= 80000000) {
break;
}
offset += batchSize;
}
通过这些方法,你应该能够成功查询到8000万条数据。如果问题仍然存在,请检查网络连接和服务器配置,或者联系数据库管理员进行进一步的排查。
【以下回答由 GPT 生成】
这个问题的原因是数据库连接在查询大数据量时超时并被断开了。可以尝试以下解决方法:
jdbcURL
修改为jdbc:mysql://10.1.1.1:3306/person?useSSL=false&requireSSL=false&connectTimeout=5000
,表示设置连接超时时间为5秒钟。根据你的需求可以适当调整超时时间。示例代码:
String jdbcURL = "jdbc:mysql://10.1.1.1:3306/person?useSSL=false&requireSSL=false&connectTimeout=5000";
LIMIT
关键字和分页参数,例如LIMIT 0, 1000
表示获取从第1行到第1000行的数据。循环执行查询语句,并逐步增加分页参数,直到获取完所有数据。示例代码:
String sql = "SELECT name, password, id FROM worker LIMIT ?, ?";
int pageSize = 1000; // 每次查询的数据量
int offset = 0; // 起始位置
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, offset);
preparedStatement.setInt(2, pageSize);
ResultSet resultSet;
while (true) {
resultSet = preparedStatement.executeQuery();
boolean hasNextData = false;
while (resultSet.next()) {
String name = resultSet.getString(1);
String password_str = resultSet.getString(2);
int id = resultSet.getInt(3);
// 处理数据
}
resultSet.close();
offset += pageSize;
preparedStatement.setInt(1, offset);
preparedStatement.setInt(2, pageSize);
if (!hasNextData) {
break;
}
}
preparedStatement.close();
这样可以有效减少单次查询获取的数据量,减轻数据库连接的压力。
如果以上方法都尝试过之后仍然存在问题,可能需要对网络环境和服务器配置进行检查,确保网络稳定和数据库服务器的运行正常。
希望以上解决方案能够帮助你解决问题,如果还有其他问题请随时提问。
看看数据库这个参数设置了多少,调大试试:max_allowed_packet
啥场景?需要全表查询?一次性查询8000w数据,就算数据库不超时,你的内存也会oom内存溢出。
一般都是基于分页去做,比如你想整个页面展示全部数据,可以设置好展示数量,用户下滑就分页继续拿数据。
这样前面数据还在,后面数据跟着用户下滑去查询。
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
这个错误可能是由于数据库连接超时或网络问题导致的。在处理大量数据时,特别是在网络连接不稳定的情况下,这种问题可能会更加突出。
有几个解决方案可以尝试解决这个问题:
1、 增加连接超时时间:可以尝试增加连接超时时间,以便在查询大量数据时给予足够的时间完成操作。在你的代码中,可以在获取连接时添加如下代码:
DriverManager.setLoginTimeout(10); // 设置连接超时时间为10秒
这将将连接超时时间设置为10秒钟。你可以根据需要调整超时时间。
2、 增加查询超时时间:在你的代码中,可以为查询操作设置查询超时时间,以便在查询大量数据时给予足够的时间。在执行查询之前,添加如下代码:
preparedStatement.setQueryTimeout(60); // 设置查询超时时间为60秒
这将将查询超时时间设置为60秒钟。你可以根据需要调整超时时间。
3、 调整数据库配置:如果你有权限访问数据库服务器,可以尝试调整数据库的配置参数,如网络超时设置、最大连接数等。具体的调整方式取决于你使用的数据库系统。
4、 分批次查询:考虑将查询结果分批处理,而不是一次性获取所有结果。你可以使用 LIMIT 和 OFFSET 语句来分批查询数据,以减少一次性查询的数据量。
请注意,以上解决方案中的每一项都可能会对你的具体情况产生不同的影响。建议你根据你的环境和需求选择适合的解决方案,并进行适当的调整和测试。
如果问题仍然存在,请提供更多关于你的环境和配置的详细信息,以便我们能够更好地帮助你解决问题。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
按照你的想法,可以使用redis缓存你的数据,项目启动的时候分批写入缓存里面
该回答引用于chatGPT仅供参考,如有帮助希望采纳谢谢。
根据您提供的代码和错误信息,可能导致数据库连接断开的原因有以下几点:
1. **查询超时**:由于表中有8000万条数据,查询需要花费很长时间。默认情况下,MySQL JDBC驱动程序的查询超时时间较短,可能导致在查询完成之前连接被关闭。您可以尝试通过 `preparedStatement.setQueryTimeout(seconds)` 方法设置更长的查询超时时间,以确保查询能够成功执行完毕。
2. **连接超时**:连接到服务器的网络连接可能会超时,特别是在处理大量数据时。您可以尝试增加连接超时时间,如 `DriverManager.getConnection(jdbcURL, username, password, timeout)` 中的 `timeout` 参数,以适应查询时间较长的情况。
3. **数据库服务器配置限制**:数据库服务器可能配置有最大连接数或最大查询结果集大小等限制。由于您的查询结果集非常大,可能超过了服务器的配置限制。您可以检查数据库服务器的配置文件,并相应地进行调整。
4. **内存限制**:您的Java程序可能需要使用较大的内存来保存查询结果集。如果您的程序没有足够的内存可用,可能会导致程序崩溃或连接中断。请确保为您的Java程序分配足够的内存,并根据需要进行调整。
如果您尝试了以上方法仍然出现问题,建议您进一步检查数据库服务器的日志文件,以获取关于连接中断的更多详细信息。此外,还可以尝试分批次查询数据,避免一次性查询大量数据,以减少连接超时的可能性。
建议考虑分库分表的方式,8000万的数据量放在一个单表里面,扛不住的
默认情况下,JDBC连接具有一些超时设置。如果查询操作花费的时间太长,连接可能会超时并关闭。您可以尝试增加连接超时的设置
DriverManager.setLoginTimeout(60); // 设置连接超时为60秒
MySQL服务器也可能设置了查询执行的最大时间或连接空闲时间,当查询时间超出这些限制时,服务器会关闭连接。您可以在MySQL服务器配置中调整这些限制,如wait_timeout和max_execution_time。
使用连接池➕多线程分页查询
建议进行查询语句的优化,尝试限制查询结果的大小,或者分批查询数据。
数据量太大,你可以内部分开查询,然后再集合再一起之后得到结果,没必要寻找查询这么大数据量的方法。
检查一下编码设置长一点超时时间。
1.查询的时候只查需要的字段,这样可以减少数据大小
2.多线程分批次查询后在合并,最终也是能返回所有的数据
3.这么大数据量可以考虑用gp、es来存
结合GPT给出回答如下请题主参考
当使用JDBC连接MySQL数据库查询大量数据时,可能会遇到“Can not read response from server”错误。这是因为查询返回的数据量太大,无法在一次查询中完全获取所有数据。
为了解决这个问题,我们可以使用分页查询来限制每次查询返回的数据量。以下是使用Java代码和MySQL数据库进行分页查询的示例:
import java.sql.*;
public class PaginationExample {
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";
String query = "SELECT * FROM mytable";
int pageSize = 1000; // 每页返回的数据量
int currentPage = 1; // 当前页数
try (Connection con = DriverManager.getConnection(url, user, password);
Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
stmt.setFetchSize(Integer.MIN_VALUE); // 禁用JDBC缓存
ResultSet rs = stmt.executeQuery(query);
int row = 0;
while (rs.next()) {
row++;
if (row > (currentPage - 1) * pageSize && row <= currentPage * pageSize) {
// 获取当前页的数据
int id = rs.getInt("id");
String name = rs.getString("name");
// 处理数据
System.out.println(id + ", " + name);
}
}
rs.close();
}
}
}
在上面的示例中,我们使用了Java中的ResultSet对象来获取查询结果,并使用了ResultSet的setFetchSize方法来禁用JDBC缓存。然后,我们使用while循环遍历ResultSet中的每一行数据,并使用当前页数和每页返回的数据量来筛选出需要的数据。
同时,我们还需要注意,在MySQL数据库中,使用ORDER BY子句和LIMIT关键字执行分页查询效率更高。因此,我们可以将查询语句修改为以下形式:
SELECT * FROM mytable ORDER BY id ASC LIMIT offset, pageSize
其中,offset为查询结果的偏移量,计算方式为(offset = (currentPage - 1) * pageSize)。这样,我们就可以在查询数据时一次性获取想要的数据,而不会出现“Can not read response from server”错误。
报Can not read response from server错误得解决方法
1、mysql服务可能down了
ps -ef|grep mysqld ,会有僵尸进程mysqld,启动kill -9 进程号
先重启一下mysql,再连接一下试试。如果不行再看下一步
(亲身体会,我的mac mysql使用navicat可以连接,但是启动java项目就连不上,报上面错误,kill掉再启动就好了。)
补充,后来发现是每次导入数据库后(使用source命令),java项目就连不上,重启一下mysql后就好了。
2、检查数据库连接池的参数(尽量开发环境连接数不要设置太大)
spring.datasource.max-active=100
spring.datasource.max-idle=20
spring.datasource.min-idle=8
spring.datasource.initial-size=10