lock (_connectionLock) {
if (conn == null) {
conn = GetOpenConnection(connectionString);
}
try {
PerformDbAction(conn);
} finally {
conn.Dispose();
}
}
我遇到了一个问题,即多线程可能会导致空连接出现问题,因为它们可以由同时运行的多个线程打开和关闭。我试图通过锁定过程来解决该问题(上面为简化起见简化了代码),但是发现这样做会严重降低性能。
我试图通过使用两个单独的锁来创建/处置数据库连接并在锁之外执行数据库操作来解决此问题:
lock (_connectionLock) {
if (conn == null) {
conn = GetOpenConnection(connectionString);
}
}
try {
PerformDbAction(conn);
} finally {
lock(_connectionLock)
conn.Dispose();
}
}
只有我意识到上面的方法不起作用,因为另一个线程可能会尝试使用已经被另一个线程处理的连接来执行数据库操作。
谁能提出一个替代方案或解决方案,使我可以安全地锁定对数据库连接字符串的访问,而又不会减慢所有操作的速度?
编辑:抱歉,以前未包括此功能,但是我不只是创建新的连接并立即处理它们的原因是,我试图避免不必要的MSDTC升级。在使用GetOpenConnection时,我将重用现有连接,因为这是触发MSDTC升级的原因之一。
我已经设法避免使用顶级代码示例进行升级,但是这样做的速度太慢了。
请您参考如下方法:
根本就没有一个共享的连接变量。相反,每次需要执行某项操作时,请打开连接,使用它并尽快关闭它。您无需在代码中使用任何锁,并且连接池将管理与数据库的实际网络连接。
目前,您实际上已经建立了一个仅包含一个连接的原始连接池,这意味着您在数据库中根本没有并发性(嗯,不是按进程)。
