SQLServer使用一段时间卡死;只有重启服务才可以

现在一个项目,客户那边程序用着用着,所有客户端都连接不进服务器了。目前程序是C/S架构的。
想通过SQLServer的企业管理器连接到服务器上,提示如下:
“已成功与服务器建立连接,但是在登录前的握手期间发生错误。(provider:TCP Provider,error:0-指定的网络名不再可用。)(Microsoft SQLServer,错误:64)”
画面见下图:

img

然后查看了服务器SQL里面的日志,提示如下:
SQLServer无法生成线程来处理新的登录或连接,错误代码0xc0000000。请查看SQL Server错误日志和操作系统日志,获取有关可能发生的相关问题的信息。
画面见下图:

img

由于这个项目体谅有点大,PDA端的程序是前端、后端分离的;电脑端应用程序是通过数据库直连(每个客户端都开启数据库连接),
部分业务处理会开启事务。

目前出现这种问题,只有把SQLServer的服务重启一下才可以。
我们自己初步怀疑是不是哪里事务互锁了,但就是不知道是哪里的事务造成的

有可能连接没关闭


因环境而异,大多人的情况不同,成功解决的原因也不一样。为了方便你debug,这里将有可能的,概率大的解决思路列举给你,供你参考
思路1、在命令行里执行netsh winsock reset重置命令然后重启电脑
思路2:更改端口号
(1) 使用“network.tcpport”的“set”命令以根用户身份运行 mssql-conf 脚本:
   sudo /opt/mssql/bin/mssql-conf set network.tcpport 99002)重启 SQL Server 服务:
   sudo systemctl restart mssql-server3) 连接到 SQL Server 后,必须在主机名或 IP 地址后用逗号 (,) 指定自定义端口。 例如,要使用 SQLCMD 进行连接,则需使用以下命令:
    sqlcmd -S localhost,9900 -U test -P test
思路3:用360的LSP修复功能来修复

可以试试如下解决方案:
修改本地注册表:regedit
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters
创建一个十进制值为 360 的“Sesstimeout”键。

img

如果遇到这种情况的话先查看任务管理器,确认sqlserver内存占用情况,如果内存占用满了,那么有可能是你的代码逻辑里面存储数据库链接没有关闭,需要修改你的后台代码逻辑

借鉴下,看看和这个是一个问题吗
http://wjhsh.net/houzhiheng-p-13181102.html

使用连接池了吗?

参考一下

可能是你直接搞jdbc连接,每次操作数据库都没关闭吧,你可以换连接池试试

解决这个问题的方法有以下几种:

检查数据库的连接数,如果过多可能会导致卡死。可以通过限制连接数或者调整连接池大小来解决。

检查数据库的系统表是否损坏或者被锁住,可以使用DBCC CHECKDB命令进行检查并修复。

检查是否有长时间运行的查询,可以使用SQL Server管理工具的“当前活动的查询”功能来找出长时间运行的查询并进行优化。

检查是否有阻塞问题,可以使用SQL Server管理工具的“阻塞进程”功能来找出阻塞进程并进行解决。

检查是否有资源瓶颈,如CPU、内存、硬盘等。可以使用Windows系统的性能监控工具来查看资源使用情况,并进行相应的优化。

改端口号:
方法如下
(1) 使用“network.tcpport”的“set”命令以根用户身份运行 mssql-conf 脚本:sudo /opt/mssql/bin/mssql-conf set network.tcpport 99002)重启 SQL Server 服务: sudo systemctl restart mssql-server3) 连接到 SQL Server 后,必须在主机名或 IP 地址后用逗号 (,) 指定自定义端口。 例如,要使用 SQLCMD 进行连接,则需使用以下命令:
    sqlcmd -S localhost,9900 -U test -P test
  格式如:   127.0.0.1,9900          [IP],[Port] 中间用逗号