C# 如何在多个线程之间共享一个mysql连接?

C# 如何在多个线程之间共享一个mysql连接?,c#,mysql,multithreading,C#,Mysql,Multithreading,在我的应用程序中,我使用dev.Mysql.com中的Mysql.Data连接器写入我的Mysql数据库,我希望最大限度地提高性能,所以我不想打开很多Mysql连接。但最终当我尝试使用一个全局静态连接时,就像这样: MySqlConnection connect = new MySqlConnection(connectionString); connect.Open(); StaticData.mysqlConnect = connect; ... // in my threads l

在我的应用程序中,我使用dev.Mysql.com中的Mysql.Data连接器写入我的Mysql数据库,我希望最大限度地提高性能,所以我不想打开很多Mysql连接。但最终当我尝试使用一个全局静态连接时,就像这样:

MySqlConnection connect = new MySqlConnection(connectionString);

connect.Open();
StaticData.mysqlConnect = connect;

...


// in my threads
lock (StaticData.mysqlConnect)
{
  foreach (Object param in records)
  {
      using (MySqlCommand command = conn.CreateCommand())
      {
        command.CommandText = "some request";
        //...                   
        command.ExecuteNonQuery();  
      }
  }
}
我得到System.Threading.SynchronizationLockException。所以我的问题是:使用dev-mysql连接器在不同线程之间共享一个连接的正确方法是什么

使用dev-mysql连接器在不同线程之间共享一个连接的正确方法是什么

不要。在每个线程上具有不同的连接

连接应该是池连接,所以当你打开一个新连接时,它实际上不会打开一个新连接,它只是从池中获取一个打开的连接

因此,没有理由在线程之间共享如此长寿命的连接。只需为每个逻辑事务的作用域创建一个新连接,并让连接池处理其余的事务

使用dev-mysql连接器在不同线程之间共享一个连接的正确方法是什么

不要。在每个线程上具有不同的连接

连接应该是池连接,所以当你打开一个新连接时,它实际上不会打开一个新连接,它只是从池中获取一个打开的连接


因此,没有理由在线程之间共享如此长寿命的连接。只需为每个逻辑事务的作用域创建一个新连接,并让连接池处理其余部分。

最大大小为1的连接池不正是OP想要的吗?池的概念是不为每个事务创建新的连接,所以我有点搞不清楚您是什么recommending@MiserableVariable
MySqlConnection
类型本身已经维护了一个连接池。他没有必要在现有机制的基础上重新实现连接池机制。哦!我不知道关于
MySqlConnection
。在这种情况下,正如您所写的,为每个事务创建一个新连接是最好的approach@MiserableVariable基本上,所有数据库连接都已经做到了这一点,或者如果它们没有做到,那么它们有一个配置选项来启用它。几乎没有理由不这样做,这就是为什么大多数提供商都默认这么做。我不知道C#但我怀疑所有JDBC驱动程序都会进行连接池,否则为什么会有独立的连接池库呢?最大大小为1的连接池不正是OP想要的吗?池的概念是不为每个事务创建新的连接,所以我有点搞不清楚您是什么recommending@MiserableVariable
MySqlConnection
类型本身已经维护了一个连接池。他没有必要在现有机制的基础上重新实现连接池机制。哦!我不知道关于
MySqlConnection
。在这种情况下,正如您所写的,为每个事务创建一个新连接是最好的approach@MiserableVariable基本上,所有数据库连接都已经做到了这一点,或者如果它们没有做到,那么它们有一个配置选项来启用它。几乎没有理由不这样做,这就是为什么大多数提供商都默认这么做。我不知道C#但我怀疑所有JDBC驱动程序都会进行连接池,否则为什么会有独立的连接池库