我的托管公司阻止了我的网站使用超过15个并发数据库连接。但在我的代码中,我关闭了我打开的每一个连接。但他们仍然说并发连接太多了。并建议我解决方案,我应该更改我的网站的源代码。那么请告诉我解决方案吗?而且我的网站是动态的,那么将它变成静态简单的HTML旧日类型会有所作为吗?
另请注意,在没有我能想到的解决方案时,我尝试了这一点,在每个con.open()
之前,我添加了con.Close()
,因此打开的任何其他连接都将被关闭。
答案 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则更好的解决方案是更改托管服务提供商。