c# MySQL连接器:连接池不工作

本文关键字:工作 连接 MySQL 连接器 | 更新日期: 2023-09-27 18:07:11

我想利用连接池,这样我就可以使用数据库,而不需要将MysqlConnection对象传递给每个类。我有一个这样的代码:

c:

namespace batman
{
    class Program
    {
        static void Main(string[] args) 
        {
            using (MysqlConnection conn = new  MysqlConnection("Server=localhost;User=root;Database=test;Password=root;Min Pool Size=3;Max Pool Size=5;Pooling=True"))
            {
                  MonitorClass monitor = new MonitorClass();
                  monitor.Run();
            }
           //...
        }
    }
}

MonitorClass.cs:

namespace batman
{
    public class MonitorClass
    {
        public void Run()
        {
            using (MySqlConnection conn = new MySqlConnection())
            using (MySqlCommand cmd = conn.CreateCommand())
            {

                try
                {
                    conn.Open();
                    cmd.CommandText = "SELECT id, package_type FROM package_registry WHERE finish_time <= @ftime";
                    cmd.Parameters.AddWithValue("@ftime", 0);
                    cmd.Prepare();
                    MySqlDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        int packageId = reader.GetInt32(0);
                        string packageType = reader.GetString(1);
                        Unirest.post("http://localhost/gears/ops/packagefinish")
                        .field("package", packageId)
                        .asStringAsync();
                        Console.WriteLine("[PackageMonitor] Package {0} ({1}) expired", packageId, packageType);
                    }
                }
                catch (MySqlException ex)
                {
                }
        }
        }
    }
}

MonitorClass应该从连接池中获取连接。但是,一旦我运行我的程序,它抛出系统。InvalidOperationException

附加信息:无法连接到任何指定的MySQL主机。

在:

cmd.Prepare ();

现在,我想我做错了什么,但我不知道到底是什么。

Oracle文档说这个

Connector/Net支持连接池,以便在数据库密集型应用程序中获得更好的性能和可伸缩性。这是默认启用的。您可以关闭它或使用连接字符串选项池,连接重置,连接寿命,缓存服务器属性,最大池大小和最小池大小调整其性能特征。有关详细信息,请参见第5.2节,"创建连接器/网络连接字符串"。

连接池的工作原理是,当客户端处理MySqlConnection时,保持与服务器的本地连接处于活动状态。随后,如果打开一个新的MySqlConnection对象,它将从连接池中创建,而不是创建一个新的本机连接。这可以提高性能。

c# MySQL连接器:连接池不工作

嗯,似乎有两个不同的问题:

  1. 连接打开两次-第一次在Main方法中,第二次(独立地)在Monitor类中。这可以通过只在monitor类中打开连接并在其中传递连接字符串来修复。

  2. 您没有通过调用.Open()方法打开连接。

让我们在记住这一点的情况下重构你的代码:

Main:

    static void Main(string[] args) 
    {
       var connStr = "Server=localhost;User=root;Database=test;Password=root;Min Pool Size=3;Max Pool Size=5;Pooling=True";
       MonitorClass monitor = new MonitorClass(connStr);
       monitor.Run();
       //...
    }

Monitor:

public class MonitorClass
{
   private readonly string _connStr;
   public MonitorClass(string connectionString) 
   {
      this._connStr = connectionString;
   }
   public void Run()
   {
       using (MySqlConnection conn = new MySqlConnection(_connStr))
       using (MySqlCommand cmd = conn.CreateCommand())
       {
           conn.Open();
           ...
       }
   }
}