2016-09-16 78 views
1

我想利用連接池,所以我可以使用數據庫而不將MysqlConnection對象傳遞給每個類。我有這樣的代碼:C#MySQL連接器:連接池不工作

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

現在,我想我做錯了什麼,但我搞不清楚究竟是什麼。

甲骨文的文檔說,這

連接器/網絡支持連接池獲得更好的性能和可擴展性的數據庫密集型應用程序。這是默認啓用的。您可以使用連接字符串選項「Pooling」,「Connection Reset」,「Connection Lifetime」,「Cache Server Properties」,「Max Pool Size」和「Min Pool Size」來調整其性能特徵。有關更多信息,請參見第5.2節「創建連接器/網絡連接字符串」。

當客戶端處理MySqlConnection時,連接池通過保持與服務器的本地連接正常工作。 隨後,如果打開一個新的MySqlConnection對象,它將從連接池創建,而不是創建新的本機連接。這提高了性能。

+0

你從來沒有真正打開連接,所以這並不奇怪。 – stuartd

+0

'conn.Open();'? – Fabjan

回答

1

好了,似乎有兩個不同的問題:

  1. 連接被打開兩次 - 在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(); 
      ... 
     } 
    } 
} 
+0

它仍然不起作用。現在它拋出「無法連接到任何指定的MySQL主機。」。我不想創建新的連接,只能從連接池中獲取一個連接。 – user3343366

+0

更新了我的答案 – Fabjan

+0

一旦我添加了connStr,它就可以工作!謝謝。 – user3343366