如何使用多个线程管理连接和命令对象

时间:2011-02-08 09:18:08

标签: c# mysql

我是新手C#dev,我正在编写一个数据库应用程序,它在两个不同的表上执行更新,并在另外两个表上插入,每个进程都在它自己的独立线程上运行。所以我有两个线程处理两个不同表上的插入,两个线程处理两个不同表上的更新。每个进程每秒更新和插入大约4或5次,因此在完成会话结束之前我不会关闭连接然后关闭整个应用程序。我想知道我是否应该在每次插入和更新后关闭连接,即使我经常执行这些操作。 2,我应该让每个线程都运行在它自己的连接和命令对象上。

顺便说一下,我在C#中编写应用程序,数据库是MySQL。此外,截至目前,我正在为所有四个线程使用一个连接和命令对象。我一直收到一条错误消息,说“已经有一个与此连接关联的开放DataReader必须先关闭”,这就是为什么我要问我是否应该使用多个连接和命令对象。

由于

-Donld

2 个答案:

答案 0 :(得分:2)

如果启用connection pooling,则应为您的方案启用MySql连接的最佳使用。无论哪种方式,通常最好的模式是:

  • 获取并打开连接
  • 做好工作
  • 关闭/释放连接

类似的东西(我对MySql连接器的类名有点生疏,所以这可能不是完全正确,但你应该得到一般的想法!):

private void DoMyPieceOfWork(int value1, int value2)
{
    using(MySqlConnection connection = new MySqlConnection(
      CONNECTION_STRING_GOES_HERE))
    {   
        connection.Open();
        using(MySqlCommand command = new MySqlCommand(
          "INSERT INTO TABLE `blah` (Column1, Column2) VALUES @column1, @column2"))
        {
            command.Parameters.Add("@column1", MySqlType.Int).Value = value1; 
            command.Parameters.Add("@column2", MySqlType.Int).Value = value2; 
            command.ExecuteNonQuery();
        }
        connection.Close();   
    }
}

当然,这是一个人为的,简单化的例子,但它的要点就是。

答案 1 :(得分:0)

您要么为每个线程创建一个新连接,要么(这是一个想法)创建一个同步的命令队列。然后在一个工作线程中处理队列。

您也可以看一下.Net framework 4的Task类