gpt4 book ai didi

c# - 实现多线程后与数据库的连接丢失

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:34 25 4
gpt4 key购买 nike

我的应用程序使用 HTMLAgilityPack 解析 HTMLSystem.Data.SqlClient 连接本地数据库并获取/插入数据。

关键是代码示例没有任何错误:

Database databaseObject = new Database();
List<Account> accounts = new List<Account>();
...
//Add some data to accounts and databaseObject
...
databaseObject.Open()
foreach (Account account in accounts)
{
accounts.doMagic(this, databaseObject);
}

我没有添加 databaseObject.Close() 来确保与数据库的连接存在。好吧,现在这里是不能正常工作的代码:

Database databaseObject = new Database();
List<Account> accounts = new List<Account>();
...
//Add some data to accounts and databaseObject
...
databaseObject.Open()
foreach (Account account in accounts)
{
Thread thread = new Thread(() => account.doMagic(this, databaseObject ));
thread.Start();
}

这也行不通:

Database databaseObject = new Database();
List<Account> accounts = new List<Account>();
...
//Add some data to accounts and databaseObject
...
databaseObject.Open()
Parallel.ForEach(accounts, account =>
{
account.doMagic(this, databaseObject );
});

它开始工作,但几秒钟后我收到 System.InvalidOperationException 的信息是 ExecuteNonQuery 需要打开和可用的连接。

什么?!连接应该一直打开!

此外,我还收到了 System.Data.SqlClient.SqlException,其中包含有关 Timeout Expired 的信息

这到底是怎么回事?我没有关闭任何连接,那么如何关闭它呢?我不明白为什么它在实现一点多线程时不能正常工作..

最佳答案

SQLConnection 不是一个纯托管类,而只是一个包装器。真正的连接是一个 COM 对象,具有 COM 线程模型的所有限制。尝试回答这个简单的问题:如果您使用来自不同线程的单一连接,您可以在哪个线程中捕获它的异常?

好消息是:您可以在相同或不同的线程中打开和关闭连接,而不会因为连接池而损失性能(实际上连接池可以保持连接打开)。此外,连接池试图解决许可证限制(当代打开连接的限制)和一些其他问题。

坏消息是:使用多个连接时,如果出现某些服务器问题,您将面临大量错误。对于这样的架构,服务器连接管理不是一件小事。对于许多场景,最可靠的方法是实现一个数据适配器单例来封装所有与客户端数据库相关的逻辑。

关于c# - 实现多线程后与数据库的连接丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40323928/

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