【问题标题】:Connection with database lost after implementing multithreading实现多线程后与数据库的连接丢失
【发布时间】:2016-10-30 08:45:53
【问题描述】:

我的应用正在使用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 的信息

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

【问题讨论】:

  • 不要使用来自多个线程的相同连接。这将导致不一致的状态。为每个线程打开一个新连接。
  • 这听起来不应该是刻薄的,但您似乎并不知道线程的第一件事。在不了解规则的情况下仅将代码的一部分标记为多线程是极其危险的。线程很难正确处理。
  • 某处应该有lock

标签: c# multithreading


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 2020-07-03
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多