您的位置:首页 > 数据库

[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.

2009-05-25 15:39 423 查看
[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.

其中发生这种问题的一些初始情况是:
环境:winxp+sqlserver(sp4)+jdk5.0+tomcat6.0
服务器启动后连接数据库是没有问题的,但运行一段时间后会出现
[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.
重启web服务器后可以连接数据库
web程序中的数据库操作已经作了关闭处理

查过很多解决的方法:
1.连接没有关闭
2.sql2000需要打补丁,至少是sp3
3.就说是程序的问题
4.程序中建立的对象太多(数组、String字符串的累加(eg:String a="";a+="sfdfd";......))

我针对上面的4个我都做过相应的更改:
首先把网站连接数据库的类和jsp文件都检查了一遍,确认连接都手动关闭了,
然后我的数据库用的是2005的不是2000的,
第三个我确实是无能为力,或许程序确实有问题,但是我的能力有限,
针对第四个我把String 改成了StringBuffer,但是结果依然不行,我开始怀疑是程序的问题了......

于是我想到了测试一下这个程序的性能,我弄了个压力测试的工具,但是无果。然后我们经理给了我一个性能测试工具jakarta-jmeter-2.3,经过这个工具测试,后台马上出现错误[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.通过这个错误我在网上看到了下面这篇文章http://www.cjsdn.net/post/print?bid=10&id=159042,里面的错误跟我的如出一辙,看到最后我按照上面说的试了一下,把问题解决了。^_^

出现如上错误的原因:
"Error establishing socket"-->错误的建立socket,当很多用户同时连接数据库;当运行一个包括大规模的开关数据库的windows应用程序时,这样的问题就会在很短的时间内发生。
原因是:这个问题的发生时因为在客户端机器缺乏一个可重复使用的socket,当连接关闭的时候TCP/IP连接停留在TIME_WAIT状态,在这种状态下, 这个socket是不能被重复使用的。

解决这个问题,可以通过下面方法之一:
1.增加端口变化的范围替换旧的匿名端口约20000端口(大约的)通过修改注册表中MaxUserPort(这个参数控制着当申请的请求最大用户可用的端口的系统),windows默认的BSD的范围是1024到5000的匿名(短暂)端口范围。可以设定只有上限的暂时端口范围,更改注册表中的参数MaxUserPort,步骤如下:
在dos命令中输入regedit,在更改注册表之前应该备份一下电脑上重要的文件。HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters,在parameters这个menu上右键单击添加 DWORD数值,然后输入值:
Value Name: MaxUserPort
Data Type: REG_DWORD
Value: 65534 (for example)
Valid Range: 5000-65534 (decimal)
Default: 0x1388 (5000 decimal)
然后退出注册表,重启电脑

2.改变连接超时的时间,默认是240秒,改成30到300秒这个范围。使用TcpTimedWaitDelay注册表参数更改此值。在dos命令中输入regedit,在更改注册表之前应该备份一下电脑上重要的文件。HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters,在parameters这个menu上右键单击添加 DWORD数值,然后输入值:
Value Name:TcpTimedWaitDelay
Value Type: REG_DWORD-time in seconds
Valid Range: 30-300 (decimal)
Default: 0xF0 (240 decimal)

这篇文章认真读一下http://support.microsoft.com/kb/328476/zh-cn
注:使用连接池的就不需要配置改这两个参数了

我发现除了上面的解决办法外,还可以用连接池做就不会出现这种问题了

原文的链接地址:http://www.cjsdn.net/post/print?bid=10&id=159042(这篇文章的原文http://support.microsoft.com/kb/328476/zh-cn)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐