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

C# 如何最小化并发数据库连接?,c#,asp.net,sql-server-2008,connection,database-connection,C#,Asp.net,Sql Server 2008,Connection,Database Connection,我的托管公司阻止我的网站使用超过15个并发数据库连接。但在我的代码中,我关闭了我打开的每个连接。但是他们仍然说有太多的并发连接。并建议我改变我网站的源代码。那么请告诉我这个问题的解决方案?而且我的网站是动态的,所以让它成为静态的简单HTML旧版会有什么不同吗 还要注意的是,我在想不出解决方案的情况下尝试了这个方法,在每次con.open()之前,我添加了con.Close(),以便关闭任何其他打开的连接。更改托管公司 真的 除非你经营一个可怜的家庭博客 您可以轻松地同时处理超过15个页面/请求。

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


还要注意的是,我在想不出解决方案的情况下尝试了这个方法,在每次
con.open()
之前,我添加了
con.Close()
,以便关闭任何其他打开的连接。

更改托管公司

真的

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

您可以轻松地同时处理超过15个页面/请求。我总是警惕“逃跑联系”,但我不会考虑15个连接,甚至是值得一提的东西。这就像一家汽车租赁公司抱怨你开车超过15公里——这简直是一个很低的限制


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

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


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

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

如果您有一个单服务器,那么这里的技术解决方案是一个信号量,例如:

someSemaphore.TakeOne();
try {
    using(var conn = GetConnection()) {
        ...
    }
} finally {
    someSemaphore.Release();
}
这将(假设某个信号量是共享的,例如
static
)确保您一次只能进入该块“n”次。在本例中,您将创建带有15个空格的信号灯:

static readonly Semaphore someSemaphore = new Semaphore(15,15);
然而!建议注意:在某些情况下,可能会出现死锁:假设两个写得不好的线程每个需要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中,以使使用更加方便。

如果只从数据库中获取数据,那么创建某种缓存并不十分困难。但是如果存在完整的CRUD,那么更好的解决方案是更改主机提供程序。

我认为SQL连接是池连接。当您关闭一个时,实际上只需将其返回到连接池

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

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


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

但由于我们的预算较低,所以我们选择了这家公司。你能推荐另一家低预算适合我的公司吗?不知道。看,我不主持与供应商的网站。我把我的东西放在我的服务器公园里。我每月的升级预算是非常重要的。我们刚刚为新服务器安装了一台15kw的USV;)但是很抱歉,如果你的预算不允许你需要的主机,要么调整预算,要么关闭网站回家。你可能会说一个主机的价格是最低的——猜猜看,你得到了你所付出的。通常一个连接是在打开之后关闭的,而不是在打开之前关闭的。你的方法有些地方不太正确。事实上,我这样做是为了解决这个问题。我知道,连接只能在打开后关闭,但作为一个试验,我这样做了。在打开之前关闭连接怎么能有帮助是我无法理解的。。。除非您有一大堆静态连接(或存储在会话变量中)来增加连接池…不,我正在使用web.config访问连接字符串和单个连接字符串+1。很好的建议。。。另外,我猜OP只需要使用
将所有连接的用法包装起来,并在连接池上中继以共享连接。。。15个并发请求并不是那么小的限制。。。