The driver was unable to create a connection due to an inability to establish the client portion of解决过程记录

苏友朋

发布于 2020.05.13 19:53 阅读 4134 评论 0

由于记录时间比较靠后,因此问题详情未能记录下来

该错误主要解决方法是:https://blog.csdn.net/zl386119974/article/details/29205633

简单来说就是系统对于短连接数有一个上限,当上限数量不足时可以通过该方法进行增加上限的方式解决。

 

但是我遇到的问题不是这个,首先我通过查询数据库连接数量:

参数释义:

cached:缓存的连接数

connected:正在使用中的连接数

created:自数据库服务开启以来数据库创建的连接数量

上图是经过处理之后的显示,未处理前的样子因为没能记录,所以只能答题说一下:

cached数量为个位数9,connected数量为两位数10到19,created为20多万,且仍然在急速增加中。

这个问题是因为cached设置过低的原因,首先查看当前设置数量

show global status like ‘Thread%’;

查看数据显示的是9,而connected数量大于该值,因此必然会不停创建新的连接,导致created数值一路飙升。

解决办法:

my.cnf 配置文件,[mysqld] 下 增加

thread_cache_size = 64 

重启数据库服务,注意这里配置的数量需要根据connected和实际的物理内存大小进行设置

设置依据:

内存      数值

1G  —> 8;

2G  —> 16; 

3G  —> 32; 

>3G  —> 64 

目前created数值的增长已经极大的降低下来,但是是否彻底解决了问题,目前还没有结论

 

 

 

 

2020-08-26 上午8:00-9:30 系统再次出现上述问题:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The driver was unable to create a connection due to an inability to establish the client portion of a socket.

This is usually caused by a limit on the number of sockets imposed by the operating system. This limit is usually configurable. 

For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel or system reconfiguration may also be required.

For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q196271).
	at sun.reflect.GeneratedConstructorAccessor16.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
	at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:343)
	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2334)
	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2371)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2163)

 

此时查看数据库连接数

数据正常,显然不是上述问题。

解决办法:首先将系统回退到上一个版本,但是重启之后,问题仍然存在。

然后通过https://blog.csdn.net/shiyong1949/article/details/73776978文章

我们可以通过修改注册表配置来解决问题:
1,启动注册表编辑器(Regedt32.exe )。

2,在注册表中确定下述键值的位置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在“编辑”菜单上点击“添加值”,然后增加下述注册值:
Value Name: MaxUserPort
Data Type: REG_DWORD
Value: 65534
它用于设置为任何用户提供的临时端口数。有效范围介于5000 和65534 之间(十进制)。默认值为0x1388 (5000 ,十进制)。

3,在“编辑”菜单上点击“添加值”,然后增加下述注册值:
Value Name: TcpTimedWaitDelay
Data Type: REG_DWORD
Value: 30
它用于设置关闭之前将TCP 端口连接保持在TIME_WAIT 状态的秒数。 有效范围介于0 秒和300 秒之间。默认值为0x78 (120 秒)。

4,退出注册表编辑器。

5,重启服务器。

 

我查看当时的配置,已经存在MaxUserPort值(因为这个问题之前遇到过,所以这个值应该是那时候创建的)

因此,这一次,我增加TcpTimedWaitDelay值之后重启。

问题解决,但是因为是新系统出的问题,而重启服务器之后使用的是老系统(虽然老系统在重启之前也存在相同的问题),因此还不能确定问题解决,要到中午,车间休息的时候,重新换上新系统,查看是否不再出现问题。