线程安全数据访问对象C#

Ram*_*mie 2 c# sql multithreading sqlclient

我正在尝试使线程安全的数据访问层(类似于SQL Data Client包装器)。在使性能最大化的同时,我应该采取哪些步骤使此线程安全。

例如,如果我在关闭连接之前在sqlConn上添加了一个锁(因为它实现了IDisposable);如果连接在事务或查询中间怎么办?

总而言之,我正在尝试完成一个线程安全的解决方案。但同时,我不想冒任何重大例外或任何延误的风险。有什么办法可以使结束线程优先

public class SQLWrapper : IDisposable
    {
        private SqlConnection _sqlConn;

        public SQLWrapper(string serverName_, string dbName_)
        {
            SqlConnectionStringBuilder sqlConnSB = new SqlConnectionStringBuilder()
            {
                DataSource = serverName_,
                InitialCatalog = dbName_,
                ConnectTimeout = 30,
                IntegratedSecurity = true,
            };

            sqlConnSB["trusted_connection"] = "yes";

            this.start(sqlConnSB.ConnectionString);
        }

        public SQLWrapper(string connString_)
        {
            this.start(connString_);
        }

        private void start(string connString_)
        {
            if (string.IsNullOrEmpty(connString_) == true)
                throw new ArgumentException("Invalid connection string");

            **lock (this._sqlConn)**
            {
                this._sqlConn = new SqlConnection(connString_);
                this._sqlConn.Open();
            }
        }

        private void CloseConnection()
        {
            **lock (this._sqlConn)**
            {
            this._sqlConn.Close();
            this._sqlConn.Dispose();
            this._sqlConn = null;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

小智 6

您应该执行的步骤是:

没有使其线程安全。

简单。

每个线程都应该有自己的副本,并且数据库上会发生锁定/同步。

然后它还将在计算机之间扩展。

这是最近20年左右的标准方法。

因此,每个线程都会创建一个新的SqlWrapper,一切都很好。