锁定会导致数据库操作太慢

Dev*_*ave 1 c# msdtc multithreading locking

lock (_connectionLock) {
    if (conn == null) {
        conn = GetOpenConnection(connectionString);
    } 

    try {
        PerformDbAction(conn);
    } finally {
        conn.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到了一个问题,多线程可能导致空连接问题,因为它们可以被一次运行的多个线程打开和关闭.我试图通过锁定进程解决问题(上面,为了清晰起见简化了代码),但发现这严重降低了性能.

我尝试通过使用两个单独的锁来创建/处理数据库连接并在锁定之外执行数据库操作来解决此问题:

lock (_connectionLock) {
    if (conn == null) {
        conn = GetOpenConnection(connectionString);
    } 
}

try {
    PerformDbAction(conn);
} finally {
    lock(_connectionLock) 
    conn.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)

只有我意识到上述不起作用,因为另一个线程可能尝试使用已由另一个线程处置的连接执行数据库操作.

任何人都可以建议一个替代方案或解决方案,我可以安全地锁定对数据库连接字符串的访问,而不会减慢一切这么多?

编辑:很抱歉之前不包括这个,但我不仅仅是创建新连接并立即处理它们的原因是我试图避免不必要的MSDTC升级.在使用GetOpenConnection时,我正在重用现有连接,因为这是触发MSDTC升级的事情之一.

我已设法避免使用顶级代码示例进行升级,但执行速度太慢.

Jon*_*eet 10

只是没有一个共享连接变量.相反,每次你需要做某事时,打开一个连接,使用它,并尽快关闭它.您不需要在代码中使用任何锁,连接池将管理与数据库的真实网络连接.

目前,您基本上构建了一个包含一个连接的原始连接池,这意味着您在数据库中根本没有并发(嗯,不是每个进程).