具有多线程服务的数据库连接池

2023-11-27

我有一个 .NET 4 C# 服务,它使用 TPL 库进行线程处理。我们最近将其切换为也使用连接池,因为一个连接正在成为处理的瓶颈。

以前,我们使用 lock 子句来控制连接对象上的线程安全。当工作备份时,队列将作为任务存在,并且许多线程(任务)将等待锁定子句。现在,在大多数情况下,线程等待数据库 IO 和工作进程的速度要快得多。

然而,现在我正在使用连接池,我们遇到了一个新问题。一旦达到最大连接数(默认为 100),如果请求更多连接,则会超时(请参阅汇集信息)。发生这种情况时,会抛出异常,提示“连接请求超时”。

我的所有 IDisposables 都在 using 语句中,并且我正在正确管理我的连接。发生这种情况的原因是请求的工作量超出了池可以处理的数量(这是预期的)。我理解为什么抛出这个异常,并且知道处理它的方法。简单的重试感觉就像黑客攻击。我还意识到我可以通过连接字符串增加超时时间,但这感觉不是一个可靠的解决方案。在以前的设计(没有池化)中,工作项将由于应用程序内的锁定而进行处理。

处理这种情况以确保所有工作得到处理的好方法是什么?


另一种方法是使用信号围绕从池中检索连接的代码(并希望返回它们)。信号量类似于锁语句,只不过它一次允许可配置数量的请求者,而不仅仅是一个。

像这样的事情应该做:

//Assuming mySemaphore is a semaphore instance, e.g. 
// public static Semaphore mySemaphore = new Semaphore(100,100);
try {
  mySemaphore.WaitOne(); // This will block until a slot is available.
  DosomeDatabaseLogic();
} finally {
  mySemaphore.Release();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有多线程服务的数据库连接池 的相关文章

随机推荐