【问题标题】:SQL Server 2008 R2: Refuses connections after some timeSQL Server 2008 R2:一段时间后拒绝连接
【发布时间】:2012-11-03 15:51:32
【问题描述】:

首先我想告诉你,我正在使用的程序已经编译,我无法查看源代码。

所以,这是我的问题:

应用程序成功打开了大约 31 个与特定数据库的连接。 当它尝试打开第 32 个连接时,所有连接都开始关闭,包括之前的 31 个连接。

说实话,我不知道为什么这个应用程序需要对同一个 2-3 个表打开这么多连接,但是在所有连接都关闭后,应用程序也会关闭。

17:41:38 004db680 驱动程序={SQL 服务器};SERVER=192.168.1.8:1433;UID=user;PWD=password;DATABASE=数据库

17:41:38 004db680 08001 0000000e [Microsoft][ODBC SQL Server 驱动程序][DBNETLIB]连接无效。 0x00000000 17:41:38 004db680 01000 0000000e [微软] [ODBC SQL Server 驱动程序][DBNETLIB]ConnectionOpen (ParseConnectParams())。 0x00000000

这是该应用程序的日志输出。

一些附加信息:

  • SYN 攻击保护禁用时出现同样的问题
  • 数据库最大连接数为 30k+

【问题讨论】:

  • 如果应用程序是用托管代码编写的,您可以尝试反编译它。我发现 Telerik 的 JustDecompile 效果很好。
  • 能否提供您正在使用的连接字符串?
  • 我认为当第 32 个连接失败时,您的应用程序会抛出一个未处理的错误,它会关闭并首先关闭所有其他连接,所以您的问题是第 32 个连接失败可能来自最大连接达到 ;)。

标签: sql-server


【解决方案1】:

在您的数据库上运行此语句以查看您是否超过了最大连接数:

SELECT @@MAX_CONNECTIONS

【讨论】:

    【解决方案2】:

    想到了一些事情

    1. 在应用程序执行之前和期间运行 SQL Profiler。你看到什么输出?也许发生了死锁?

    2. 以前是否有效并且最近停止工作?如果是,您是否对 SQL 应用了服务包或其他修复?

    3. 如果您的应用程序是多线程的,并且每个线程执行 X 个连接,则可以尝试将应用程序限制为在单核而不是多核上运行。这是一个肮脏的黑客,但它可能会有所帮助。

    4. 如果您打开 32 个命令提示符窗口,然后使用 osql 或 sqlcmd 实用程序打开 32 个 SQL 连接会怎样?听起来很傻,但如果以上没有取得成果,至少你可以看看它是否仅仅是连接的数量,或者是否还有其他事情正在进行中。其他的也可能是

      • 数据相关(见#1);或
      • 驱动程序相关(在应用程序内)。鉴于它正在使用 ODBC,而且它可能很旧(您没有说明正在运行什么 Windows 版本、SQL 版本等),您可以尝试更新 MDAC(MIcrosoft 数据访问组件)?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-28
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多