使用多线程服务的数据库连接池

And*_*son 9 c# service multithreading connection-pooling

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

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

但是,现在我正在使用连接池,我们遇到了一个新问题.达到最大连接数(默认为100)后,如果请求进一步连接,则会超时(请参阅池信息).发生这种情况时,会抛出一个异常,说"连接请求超时".

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

处理此方案以确保处理所有工作的好方法是什么?

Chr*_*ain 11

另一种方法是在代码周围使用信号量来检索池中的连接(并且希望返回它们).sempahore就像一个锁定语句,除了它允许一次配置数量的请求者,而不仅仅是一个.

这样的事情应该做:

//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();
}
Run Code Online (Sandbox Code Playgroud)