gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:34:46 25 4
gpt4 key购买 nike

我正在尝试制作一个线程安全的数据访问层(有点像 SQL 数据客户端包装器)。我应该采取哪些步骤来确保此线程安全,同时最大限度地提高性能。

例如,如果我在关闭连接之前在 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;
}
}
}

最佳答案

你应该做的步骤是:

没有让它成为线程安全的。

简单。

每个线程都应该有自己的副本,并在数据库上进行锁定/同步。

然后它也将跨计算机扩展。

这是过去 20 年左右的标准方法。

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

关于c# - 线程安全数据访问对象 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23761014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com