2016-09-16 2 views
1

Я хочу использовать пул соединений, чтобы я мог использовать базу данных, не передавая объект MysqlConnection для каждого класса. У меня есть такой код:C# MySQL Connector: пулы подключений не работают

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 Docs говорит, что это

Соединитель/Net поддерживает подключение Объединив для повышения производительности и масштабируемости приложений баз данных интенсивно. Это включено по умолчанию. Вы можете отключить его или настроить его характеристики производительности, используя параметры строки подключения: «Объединение», «Сброс соединения», «Время жизни соединения», «Свойства сервера кэша», «Максимальный размер пула» и «Минимальный размер пула». Для получения дополнительной информации см. Раздел 5.2 «Создание соединительной линии/сетевого соединения».

Пул соединений пула, поддерживая родное подключение к серверу, когда клиент располагает MySqlConnection. Впоследствии, если открыт новый объект MySqlConnection, он будет создан из пула соединений, вместо создания нового родного соединения. Это повышает производительность.

+0

Вы никогда не открыть соединение, так что это не удивительно. – stuartd

+0

Где находится 'conn.Open();'? – Fabjan

ответ

1

Ну, кажется, есть две разные проблемы:

  1. соединение открывается дважды - первый раз, когда в главном методе и второй раз (независимо) в классе 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(); 
     //... 
    } 

Монитор:

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

Смежные вопросы