我们最近将公司网站迁移到了新主机。 它是一个支持C#代码的ASP.NET站点,连接到MS SQL服务器。
自从将站点移动到新服务器后,该站点超出了连接池限制(未明确设置,因此我认为默认大小为100)。 通过SQL Server管理检查打开的进程Studiorevealed每个数据库调用似乎都保持打开状态,实际上,在代码中我根本找不到明确关闭的连接。
数据库连接按以下方式进行:
DSLibrary.DataProviders.SqlProvider db = new DSLibrary.DataProviders.SqlProvider(Defaults.ConnStr);
关于这个DSLibrary的文档很少,我认为它是由该网站的原始开发者编写的库。 DSLibrary的任何类成员似乎都没有明确地关闭连接 - 也没有在using
块中定义它们以自动关闭连接。
我的问题是2折。
更新
maximum number of concurrent connections
属性(服务器属性 - >连接选项卡)设置为0。
如果我在开发机器上以调试模式运行网站,远程连接到生产数据库,则连接似乎正常关闭。这似乎表明它与IIS的配置方式有关?
更新2 将应用程序池设置为在30个工作进程停止站点超过最大连接后再循环,但现在限制某些(会话持久性)功能 - 最近访问的项目列表重置非常快并且尝试通过cms编辑任何内容是不可能的,因为您是一旦进程回收就退出......
答案 0 :(得分:3)
您的代码很可能是在整个地方泄漏连接。
我敢打赌你的旧主机将应用程序池设置为经常回收,无论是从内存使用还是#requests处理点。新主机很可能有默认循环。
我的建议是首先将应用池设置为更频繁地回收。然后修复代码。要么通过重构DSLibrary(猜测它已经成长),要么只需将它改为使用子句,无论你有数据库连接。
<强>更新强>
还有一件事,更改会话属性以使用sql server作为后备存储,这样您就不会在应用程序回收时丢失所有会话信息。这会给你带来更多时间。
答案 1 :(得分:0)
您是否检查了maximum number of concurrent connections
属性(服务器属性 - &gt;连接标签)?
答案 2 :(得分:0)
根据您的说法,您似乎并未将数据库包装在using语句中,因此每次都会泄漏连接。除非你明确处理它,否则系统在转移它时会转储它们 - 这就是使用它的目的。您必须始终在代表程序外部资源的任何内容上使用(或以其他方式确保调用dispose)。文件,数据库连接等。