【问题标题】:C# MySQL Connector: Connection pools are not workingC# MySQL 连接器:连接池不起作用
【发布时间】:2017-01-24 12:51:17
【问题描述】:

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

Main.cs:

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 应该从连接池中获取连接。 但是一旦我运行我的程序,它就会抛出 System.InvalidOperationException 与

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

在:

cmd.Prepare();

现在,我认为我做错了什么,但我无法弄清楚到底是什么。

Oracle 文档这样说

Connector/Net 支持连接池,以提高数据库密集型应用程序的性能和可扩展性。这是默认启用的。您可以使用连接字符串选项 Pooling、Connection Reset、Connection Lifetime、Cache Server Properties、Max Pool Size 和 Min Pool Size 将其关闭或调整其性能特征。有关详细信息,请参阅第 5.2 节“创建连接器/网络连接字符串”。

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

【问题讨论】:

  • 你从来没有真正打开过连接,所以这并不奇怪。
  • conn.Open(); 在哪里?

标签: c# mysql-connector


【解决方案1】:

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

  1. 连接打开两次 - 第一次在 Main 方法中,第二次(独立)在 Monitor 类中。这可以通过仅在监视器类中打开连接并在其中传递连接字符串来解决。

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

让我们牢记这一点来重构您的代码:

主要:

    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();
       //...
    }

监视器:

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();
           ...
       }
   }
}

【讨论】:

  • 还是不行。现在它抛出“无法连接到任何指定的 MySQL 主机。”。我不想创建新连接,只从连接池中获取一个。
  • 更新了我的答案
猜你喜欢
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多