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升级的事情之一。
我已设法避免使用顶级代码示例升级,但执行速度太慢。
答案 0 :(得分:10)
根本没有一个共享连接变量。相反,每次你需要做某事时,打开一个连接,使用它,并尽快关闭它。您不需要在代码中使用任何锁,连接池将管理与数据库的真实网络连接。
目前,您基本上构建了一个只包含一个连接的原始连接池,这意味着您在数据库中根本没有并发(嗯,不是每个进程)。