为什么要将我们的.NET / SQL Server网站移动到新主机导致超出连接池大小?

时间:2010-06-21 12:55:35

标签: c# .net sql-server iis connection-pooling

我们最近将公司网站迁移到了新主机。 它是一个支持C#代码的ASP.NET站点,连接到MS SQL服务器。

自从将站点移动到新服务器后,该站点超出了连接池限制(未明确设置,因此我认为默认大小为100)。 通过SQL Server管理检查打开的进程Studiorevealed每个数据库调用似乎都保持打开状态,实际上,在代码中我根本找不到明确关闭的连接。

数据库连接按以下方式进行:

DSLibrary.DataProviders.SqlProvider db = new DSLibrary.DataProviders.SqlProvider(Defaults.ConnStr);

关于这个DSLibrary的文档很少,我认为它是由该网站的原始开发者编写的库。 DSLibrary的任何类成员似乎都没有明确地关闭连接 - 也没有在using块中定义它们以自动关闭连接。

我的问题是2折。

  1. 我们怎么没有遇到过 网站上的这个问题 不同主持人近3年? 有没有自动关闭 未使用的未使用的连接 在SQL服务器上实现?
  2. 我最好每次改写 连接和程序 明确地打开和关闭 连接数据库?
  3. 更新 maximum number of concurrent connections属性(服务器属性 - >连接选项卡)设置为0。

    如果我在开发机器上以调试模式运行网站,远程连接到生产数据库,则连接似乎正常关闭。这似乎表明它与IIS的配置方式有关?

    更新2 将应用程序池设置为在30个工作进程停止站点超过最大连接后再循环,但现在限制某些(会话持久性)功能 - 最近访问的项目列表重置非常快并且尝试通过cms编辑任何内容是不可能的,因为您是一旦进程回收就退出......

3 个答案:

答案 0 :(得分:3)

您的代码很可能是在整个地方泄漏连接。

我敢打赌你的旧主机将应用程序池设置为经常回收,无论是从内存使用还是#requests处理点。新主机很可能有默认循环。

我的建议是首先将应用池设置为更频繁地回收。然后修复代码。要么通过重构DSLibrary(猜测它已经成长),要么只需将它改为使用子句,无论你有数据库连接。

<强>更新
还有一件事,更改会话属性以使用sql server作为后备存储,这样您就不会在应用程序回收时丢失所有会话信息。这会给你带来更多时间。

答案 1 :(得分:0)

您是否检查了maximum number of concurrent connections属性(服务器属性 - &gt;连接标签)?

答案 2 :(得分:0)

根据您的说法,您似乎并未将数据库包装在using语句中,因此每次都会泄漏连接。除非你明确处理它,否则系统在转移它时会转储它们 - 这就是使用它的目的。您必须始终在代表程序外部资源的任何内容上使用(或以其他方式确保调用dispose)。文件,数据库连接等。