求助!用Java对MySQL压力测试中并发连接>500,数据量>30000时报Communications link failure

mcc198775 2012-04-09 04:40:16
MySQL版本:5.5.22 for Linux (x86_64)
设置了max connections=1000

写了一个Java程序,会同时启动500个线程操作数据库,每个线程保持一个Connection
500个线程要总共向数据库insert 30000条数据时,抛了下面的异常。

500线程*10000数据和200线程*100000数据的测试都通过了。

用最简单的
conn = DriverManager.getConnection(path, username,password);
获取的连接。

试过用2台电脑,每台跑300个并发,也会出现同样的错误

感觉是MySQL哪的配置有问题,但就是百思不得其解!
百度相似的错误有人说是连接time out的问题,但是我程序启动就连接数据库并执行测试了,然后就出现异常,并不是在等待较长时间之后执行的测试。

求高人指点迷津!!先谢过了!

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 19,176 milliseconds ago. The last packet sent successfully to the server was 19,176 milliseconds ago.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3591)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3480)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4021)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2671)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2621)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:842)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:681)
at com.aikaka.performance.mysql.MySqlInsertThread.run(MySqlInsertThread.java:54)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3038)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3491)
... 10 more
...全文
353 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mcc198775 2012-04-15
  • 打赏
  • 举报
回复
网络环境不稳定时也会抛出这类错误
mcc198775 2012-04-13
  • 打赏
  • 举报
回复

自己解决了,修改参数innodb open files,大于并发连接数

增加的其他配置如下
max_connections=1020
thread_cache_size=128
query_cache_size=1073741824
back_log=500
connect_timeout=600
innodb_open_files=1000


结贴

[Quote=引用楼主 的回复:]
MySQL版本:5.5.22 for Linux (x86_64)
设置了max connections=1000

写了一个Java程序,会同时启动500个线程操作数据库,每个线程保持一个Connection
500个线程要总共向数据库insert 30000条数据时,抛了下面的异常。

500线程*10000数据和200线程*100000数据的测试都通过了。

用最简单的
……
[/Quote]
十彡 2012-04-10
  • 打赏
  • 举报
回复
怎么没人啊 我也遇到了类似的额问题!
haldis 2012-04-10
  • 打赏
  • 举报
回复
 如果在wait_timeout秒期间内,数据库连接(java.sql.Connection)一直处于等待状态,mysql5就将该连接关闭。这时,你的Java应用的连接池仍然合法地持有该连接的引用。当用该连接来进行数据库操作时,就碰到错误的,你可以修改wait_timeout值:
wait_timeout的最大值分别是24天/365天(windows/linux)。以windows为 例,假设我们要将其设为21天,我们只要修改mysql5的配置文件“my.ini”(mysql5 installation dir),修改为:wait_timeout=1814400

  需要重新启动mysql服务。

  linux系统配置文件:/etc/my.cnf
db服务器连接mysql+redis高可用高性能框架干货1、使用c++语言,vs2019开发垮平台[windows和linux]连接MySql和redis框架。2、使用MySql持久化玩家数据,redis做玩家数据缓存层,redis不做数据持久化。mysql搭配redis工作效率非常高效,就好比男女搭配干活不累,没有redis,mysql也能独立很好的完成用户读写请求。有了redis,用户访问数据的效率更高,时间更短,快速的完成请求。3、讲解如何保持mysql和redis数据强一致性策略,并在代码里实现。每次启动redis,使用管道技术,从mysql批量导入活跃用户数据到redis,并设置过期时间.4、教程使用线程池技术,每个线程拥有自己独立的数据,线程绑定类。每一个实例就包含一个线程每个线程数据里包含:mysql连接器、redis连接器、内存回收池、安全的串行队列、条件变量、互斥量保证线程内的数据安全。5、工作原理:没有请求时,各个工作线程处于休眠状态。有读写请求时,从线程池获取一个线程,添加读写请求,把数据推送到线程工作队列。然后工作线程获取队列的数据,进行串行工作任务安排,进行mysql数据库读写操作,以及redis读写数据操作,当完成工作任务时,执行下一个工作任务,同时把处理结果推送到逻辑线程,把数据给用户。6、用户读数据策略:用户获取数据首先是先从redis查找数据,redis命,返回数据给玩家,redis命失败,mysql查找数据,然后写入数据到redis,返回数据给用户。7、用户写数据策略:用户先从redis删除数据,然后写数据到mysql,最后再把数据写入到redis,保持数据一致性。8、教程是一个干货教程,不是新手教程,mysql基础语法讲解的少,redis有讲解基础系列。教程讲解的是如何搭建一个支持高并发,高性能的读写数据库框架,使用mysql+redis搭配的高可用、高性能框架。该套框架在多个项目使用过,也在棋牌类项目里面使用过。

50,538

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧