2015-01-21 4 views
0

Я пишу класс базы данных, используя C#, который взаимодействует с многопоточным sdk. Я должен использовать только одно соединение (не нужно говорить!) Тем не менее, я всегда получаю ошибки о подключении и datareaders. Помогаю помочь.C# mysqlreader multithread fail

Вот структура моего кода

static class Db 
{ 
    static MySqlConnection conn = new MySqlConnection(connectionString); 

    private static void Connect() 
    { 
    if (conn.State == ConnectionState.Closed) 
        conn.Open(); 
    } 

    private static void DisConnect() 
    { 
    if (conn.State == ConnectionState.Open) 
    conn.Close(); 
    } 


    static int Insert() 
    { 
     Connect(); 
     MySqlCommand cmd = new MySqlCommand(sql, conn); 
     cmd.ExecuteNonQuery(); 
     return Convert.ToInt32(cmd.LastInsertedId); 
     DisConnect(); 
    } 

    public static DataTable select(string sql) //Especially fails here 
    { 
     Connect(); 
     MySqlCommand cmd = new MySqlCommand(sql, conn); 
     using (MySqlDataReader read = cmd.ExecuteReader()) 
     { 
      if (read.HasRows){ Some Code... } 
     } 
     DisConnect(); 
    } 
    } 
+2

Каковы ошибки _exactly_? –

+0

1. Вероятное состояние гонки I/O обнаружено при копировании памяти, 2. Существует уже открытое соединение. 3. Соединение должно быть действительным и открытым. – fatih

+0

Почему вы используете все статичное? Укажите экземпляр для потока? –

ответ

0

Следует отметить, что экземпляр MySqlConnection не гарантированно поточно. Вы должны избегать одновременного использования одного и того же MySqlConnection в нескольких потоках. Рекомендуется открыть новое соединение на поток и закрыть его, когда работа будет выполнена. Фактически, соединения не будут создаваться/удаляться каждый раз с пулом = true; параметр строки подключения - соединения будут сохранены в пуле подключений. Это значительно повышает производительность.

Я также предлагаю использовать предложение 'using' при создании соединения, чтобы оно автоматически было расположено/закрыто и возвращено в пул соединений.