2

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

另请注意,我在没有想到任何解决方案的情况下尝试了此操作,在每次之前con.open(),我添加了con.Close(),因此打开的任何其他连接都将被关闭。

4

5 回答 5

3

首先要做的是检查何时打开连接 - 看看是否可以将其最小化。例如,你在不同的连接上做“n+1”?

如果你有一个服务器,这里的技术解决方案是一个信号量——例如,类似:

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

这将(例如,假设 someSemaphore 是共享的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以使使用更方便。

于 2012-12-01T07:55:01.907 回答
2

更改托管公司。

严重地。

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

您可以轻松地同时处理超过 15 个页面/请求。我总是对“失控的连接”保持警惕,但我认为 15 连接甚至不值得一提。这就像一家汽车租赁公司抱怨你开车超过 15 公里——这简直是一个非常低的限制。

在一个繁忙的网站上,您可以有 50、100 甚至 200 个打开的连接,因为您同时有那么多请求。

于 2012-12-01T07:45:50.783 回答
1

这不是很明显,但即使您关心正确打开和关闭连接,您也必须查看特定的内容。

如果您对用于构建连接字符串的文本进行最小的更改,.net 将创建一个全新的连接,而不是使用已打开的连接(即使连接使用 MARS),因此以防万一,如果出现以下情况,请查找您的代码您正在即时创建连接字符串,而不是使用 Web 配置中的单个连接字符串。

于 2012-12-01T07:54:18.777 回答
1

我相信 SQL 连接是池化的。当您关闭一个时,您实际上只是将其返回到连接池。

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

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

这一切都可能有效,但我也建议您更换供应商....

于 2012-12-01T08:08:22.713 回答
0

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

于 2012-12-01T07:58:19.277 回答