高分悬赏一个棘手的mysql连接问题

傲世狂少 2012-07-23 10:56:02
近期后台日志频繁报这个异常错误,让人很恼火,不知什么原因,请高手朋友帮忙看看!
jdbc连接的数据。

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).
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.GeneratedConstructorAccessor17.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:406)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2103)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:718)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
at sun.reflect.GeneratedConstructorAccessor10.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:406)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
...全文
473 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
傲世狂少 2012-07-24
  • 打赏
  • 举报
回复
非常感谢各位朋友的积极献言献策,此问题已解决,在此结贴,再次感谢各位朋友。

各位针对这个问题都阐述的非常清楚,遗憾的是,最后发现我的错误是由于一句错误代码引起的:

String v_money=request.getParameter("v_money"); //得到的金额为结果为1.00
if(StringUtils.isNotEmpty()){
try{
int money=Integer.valueOf(v_money);
Connection conn=XX.getConnction();
...........
进行更新操作
String sql="update xx set glod="+money+" where id='XXXCC'";
..........
}catch(SQLException e){
e.printT...
}finally{
.....
}

}

因为反馈回来的金额默认给后边带了两位小数,所以当整形处理,第一句红色代码就异常,而捕获异常只捕获SQL异常,当时测的时候,人为给的数据是1,这没问题,但发布上去,客户反馈的都给加了小数。
将此修改好,以上异常全都没了。
aa7229806 2012-07-24
  • 打赏
  • 举报
回复
原因与解决方法:



1.操作系统对半连接数的限制。



这个可以使用迅雷菜单中的工具进行修改,或者使用tcpz软件来修改,其他的如:XP优化工具也有这个功能。



2.经过以上的修改还是发生异常



这个从MySQL的官方帮助文档中,有如下:



当你在具有很多TCP/IP连接的Windows上运行MySQL服务器,并经常在客户端上遇到“无法连接到MySQL服务器”错误时,可能是因为Windows不允许足够的临时(短命)端口用于这类连接。

默认情况下,Windows允许用于使用5000个临时(短命)TCP端口。任何端口关闭后,它将在TIME_WAIT状态保持120秒。与重新初始化全新的连接相比,该状态允许以更低的开销重新使用连接。但是,在该时间逝去前,无法再次使用该端口。

对于小的可用TCP端口堆栈(5000),以及具有TIME_WAIT状态的大量在短时间内打开和关闭的 TCP端口,你很可能遇到端口耗尽问题。处理该问题的方法有两种:

· 通过调查连接池以及可能的持久连接,减少快速消耗的TCP端口数。

· 调整Windows注册表中的某些设置(请参见下面)。

要点:下述步骤涉及更改Windows注册表。更改注册表之前,请备份注册表,并确认你已掌握在出现问题时恢复注册表的方法。关于备份年、恢复和编辑注册表的更多信息,请请参见Microsoft知识库中的下述文献:http://support.microsoft.com/kb/256986/EN-US/。

· 启动注册表编辑器(Regedt32.exe)。

· 在注册表中确定下述键值的位置:

·

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
· 在“编辑”菜单上点击“添加值”,然后增加下述注册值:

·

Value Name: MaxUserPort
·

Data Type: REG_DWORD
·

Value: 65534
它用于设置为任何用户提供的临时端口数。有效范围介于5000和65534之间(十进制)。默认值为0x1388(5000,十进制)。

· 在“编辑”菜单上点击“添加值”,然后增加下述注册值:

·

Value Name: TcpTimedWaitDelay
·

Data Type: REG_DWORD
·

Value: 30
它用于设置关闭之前将TCP端口连接保持在TIME_WAIT状态的秒数。有效范围介于0秒和300秒之间。默认值为0x78(120秒)。

· 退出注册表编辑器。

· 重新引导机器。

注释:撤销上述设置十分简单,就像删除你创建的注册表一样。





经过以上的修改,OK!

AlvinCross 2012-07-24
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_5349193d0100wmrq.html
傲世狂少 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

日志连解决办法都告诉你了,需要去按他说的试试
[/Quote]
租用的空间,人家说以前都没问题的,我如何查啊
傲世狂少 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

日志已经提示的很清楚了,你按照错误日志上的做就可以了
[/Quote]
不明白你的意思,我是租用的空间,程序我上传上去,就经常性频繁报此错误。在我本地机器和数据库测试,一直不能出现此情况,实在纳闷。。。。。
傲世狂少 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 1 楼 的回复:
是不是用了连接池,限制了连接数?
但是连接用完没有销毁呢?
其实我不知道,猜的

应该是说没有释放
[/Quote]
开始是使用的连接池,后来去掉了,直接用jdbc连接,关于关闭连接释放资源,我代码都检查了,用完就close掉了。
其次数据量也不大
shenhua 2012-07-23
  • 打赏
  • 举报
回复
看上去使用了连接池。应该是插入或查询的数量过多造成的。
9441 2012-07-23
  • 打赏
  • 举报
回复
日志已经提示的很清楚了,你按照错误日志上的做就可以了
DAO 2012-07-23
  • 打赏
  • 举报
回复
是不是用了连接池,限制了连接数?
但是连接用完没有销毁呢?
其实我不知道,猜的
DAO 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
是不是用了连接池,限制了连接数?
但是连接用完没有销毁呢?
其实我不知道,猜的
[/Quote]
应该是说没有释放
yktd26 2012-07-23
  • 打赏
  • 举报
回复
日志连解决办法都告诉你了,需要去按他说的试试
gcaling2006 2012-07-23
  • 打赏
  • 举报
回复
可能是连接池出现问题,

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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