如何最小化并发数据库连接?

时间:2012-12-01 07:42:09

标签: c# asp.net sql-server-2008 connection database-connection

我的托管公司阻止了我的网站使用超过15个并发数据库连接。但在我的代码中,我关闭了我打开的每一个连接。但他们仍然说并发连接太多了。并建议我解决方案,我应该更改我的网站的源代码。那么请告诉我解决方案吗?而且我的网站是动态的,那么将它变成静态简单的HTML旧日类型会有所作为吗?

另请注意,在没有我能想到的解决方案时,我尝试了这一点,在每个con.open()之前,我添加了con.Close(),因此打开的任何其他连接都将被关闭。

5 个答案:

答案 0 :(得分:3)

要做的第一件事是检查何时打开连接 - 看看是否可以最小化连接。例如,你在不同的连接上做“n + 1”吗?

如果您有单一服务器,此处的技术解决方案是信号量 - 例如:

someSemaphore.TakeOne();
try {
    using(var conn = GetConnection()) {
        ...
    }
} finally {
    someSemaphore.Release();
}

将(假设某些信号量被共享,例如static)确保您只能一次“n”次进入该块。在您的情况下,您将创建15个空格的信号量:

static readonly Semaphore someSemaphore = new Semaphore(15,15);

然而!建议小心:在某些情况下,你可能会遇到死锁:想象2个线程写得不好,每个需要9个连接 - 线程A需要7个,线程B需要8个。它们都需要更多 - 而且都不会得到它们。因此,使用WaitOne超时非常重要:

static void TakeConnection() {
     if(!someSemaphore.TakeOne(3000)) {
         throw new TimeoutException("Unable to reserve connection");
     }
}
static void ReleaseConnection() {
     someSemaphore.Release();
}
...
TakeConnection();
try {
    using(var conn = GetConnection()) {
        ...
    }
} finally {
    ReleaseConnection();
}

还可以将其包装在IDisposable中以使用更方便。

答案 1 :(得分:2)

更改托管公司。

严重。

除非你经营一个可怜的小家庭博客。

您可以轻松同时处理超过15个页面/请求。我总是对“逃避连接”持谨慎态度,但我不认为15连接甚至值得一提。这就像汽车租赁公司抱怨你开车超过15公里 - 这只是一个真正的低限。

在繁忙的网站上,您可以拥有50个,100个甚至200个开放式连接,因为您同时拥有多个请求。

答案 2 :(得分:1)

这不是那么明显,但即使你关心正确地打开和关闭你的连接,你也要看一些特别的东西。

如果对用于构建连接字符串的文本进行最小的更改,.net将创建一个全新的连接,而不是使用已打开的连接(即使连接使用MARS),所以为了以防万一,请查找如果要动态创建连接字符串而不是使用Web配置中的单个字符串,则使用代码。

答案 3 :(得分:1)

我相信SQL连接是合并的。当你关闭一个时,实际上只是将它返回到连接池。

您可以使用SqlConnection.ClearPool(连接)或SqlConnection.ClearAllPools来实际关闭连接,但这会影响您网站的性能。

此外,您可以使用连接字符串参数Pooling = false来禁用池。 还有最大池大小(默认为100),您可能希望将其设置为较低的数字。

这一切都可行,但我也建议您切换提供商......

答案 4 :(得分:0)

如果只从数据库中获取数据,那么创建某种缓存并不是很困难。但如果有完整的CRUD则更好的解决方案是更改托管服务提供商。