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

本文关键字:操作 数据库 锁定 | 更新日期: 2023-09-27 18:27:27

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升级的事情之一。

我已经设法避免了顶级代码示例的升级,但它的性能太慢了。

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

只是没有一个共享连接变量。相反,每次您需要执行某些操作时,请打开连接,使用它,然后尽快关闭它。无需在代码中使用任何锁,连接池将管理与数据库的实际网络连接。

目前,您基本上已经构建了一个只包含一个连接的原始连接池,这意味着数据库中根本没有并发性(好吧,不是每个进程(。