работа с базой данных - PullRequest
0 голосов
/ 29 июня 2009

У меня есть слой базы данных C # со статическим методом чтения, который вызывается каждую секунду в фоновом таймере.

В настоящее время я создаю SqlCommand, SqlConnection один раз в качестве члена класса.

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

Это моя текущая реализация (Обработчик таймера)

    static void GetBarTime(object state)
    {
        lock (_staticConnection)
        {
            SqlDataReader dataReader = null;
            try
            {
                dataReader = _getMaxTimeCommand.ExecuteReader();
                dataReader.Read();
                _currentTick = dataReader.GetInt32(0);
            }
            catch (Exception ex)
            {
                //Log the error
            }
            finally
            {
                dataReader.Dispose();
            }
        }
    }

Какая лучшая практика?

БОЛЬШЕ ДЕТАЛЕЙ:

Я делаю это по таймеру, так как происходит повторное обновление таблицы каждую секунду, и есть еще один открытый метод, используемый множеством клиентов и вызываемый каждую секунду, чтобы получить последнее значение.

Таким образом, вместо выполнения оператора select каждую секунду для каждого клиента, я делаю это в таймере и обновляю глобальную переменную, которая используется клиентами.

Ответы [ 2 ]

2 голосов
/ 29 июня 2009

SqlConnection имеет встроенный пул; вы бы не увидели почти никакой разницы, если бы использовали:

using(SqlConnection conn = new SqlConnection(connectionString)) {
    conn.Open();
    // your code
}

каждый раз. И это может автоматически реагировать на мертвые (базовые) соединения.

В настоящее время у вас есть ошибка, кстати; если команда не выполнена, читатель все равно будет нулевым ... либо проверьте null перед вызовом Dispose():

if(dataReader !=null) {dataReader.Dispose();}

или просто используйте using:

 try
 {
     using(SqlDataReader dataReader = _getMaxTimeCommand.ExecuteReader())
     {
         dataReader.Read();
         _currentTick = dataReader.GetInt32(0);
     }
 }
 catch (Exception ex)
 {
    //Log the error
 }
1 голос
/ 29 июня 2009

Может быть довольно сложно выяснить, означает ли выполнение, что соединение является мертвой уткой. Чтобы быть в безопасности, вы можете закрыть и снова открыть SqlConnection и SqlCommand всякий раз, когда вы сталкиваетесь с исключением, на всякий случай. Это не вызывает никаких накладных расходов, когда все работает хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...