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

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

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

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

谢谢


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

您还可以查看.Net framework 4的任务类。如果启用,它应该能够为您的场景优化使用MySql连接。无论哪种方式,通常最好的模式是:

  • 获取并打开连接
  • 工作
  • 关闭/释放连接
类似于(我对MySql连接器的类名有点生疏,所以这可能不完全正确,但您应该了解大致情况!):


当然,这是一个精心设计的、过于简单的示例,但其要点是正确的。

为什么需要每隔4或5秒向数据库写入任何内容。真的有必要吗?@Mr.discoupation,可能是因为他的代码每秒产生(或确实从“外部世界”接收)4或5个需要持久化到数据库的东西?=)@罗布:对此我说:……缓存?@shopping先生,说真的?缓存需要在内存中持久化的数据?我不知道我必须推广的OPs系统,但如果我从外部世界接收数据,而不是立即将其保存到数据库中,如果我崩溃或机器崩溃会发生什么?丢失的数据。上次我检查这是一件坏事=)我仍然必须在这里违背规则,这完全取决于数据的性质,因此我的问题是必要性。嘿,rob,你是说我“确实”遵循打开和关闭连接obj的标准实践,而不是“尝试”要自己管理线程,请使用线程池?这应该很管用……是的,我正是这么建议的。从为您提供的服务(即连接池)开始,并衡量其有效性。然后,也只有到那时,如果需要的话,“推出你自己的”解决方案。编写MySql.net connector的人(尽管它有很多缺点!尽管现在比两年前好多了)比你或我更有可能“把它做好”)
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();   
    }
}