c # Таймер для сохранения соединения sql-сервера с БД "Живой" - PullRequest
0 голосов
/ 27 октября 2018

Я столкнулся со следующей проблемой.Когда программное обеспечение не выполняет запросы в течение длительного времени, соединение с базой данных, похоже, переходит в спящий режим, поэтому, когда я выполняю запрос, ему требуется некоторое время для пробуждения.Мое решение для этого - таймер, определенный в статическом классе, который каждые 20 секунд делает именно это: открывает и закрывает соединение.Мой вопрос, так как таймер является асинхронным, безопасен ли мой подход потока?Это мой код.

 public static class Db
 {
    private static string connStr = "";
    private static System.Timers.Timer TimerConn = null;

     public static void Init(string theconnStr)
        {
            connStr = theconnStr;
            if (TimerConn!=null)
            {
                TimerConn.Enabled = false;
            }
            TimerConn = new System.Timers.Timer();
            TimerConn.Interval = 20000;
            TimerConn.Elapsed += HandleTimerConTick;

            TimerConn.Enabled = true;
        }


        private static void HandleTimerConTick(object source, ElapsedEventArgs e)
        {
            TestConnection();
        }
}


public static bool TestConnection()
        {
            try
            {
                SqlConnection con = new SqlConnection(connStr);
                con.Open();
                con.Close();
                return true;
            }
            catch
            {
                return false;
            }
        }

  }

1 Ответ

0 голосов
/ 27 октября 2018

Учитывая, что используется только общее состояние - это строка подключения, да, она является поточно-ориентированной. Если строка подключения изменяется со временем (что кажется маловероятным в зависимости от вашего кода), тогда она может попытаться подключиться к «старой версии» строки подключения, но это худшее поведение, которое вы можете увидеть.Это не будет проблемой, если строка подключения никогда не изменится.

Чтобы сделать его немного чище, нужно поменять на:

try
{
    using (SqlConnection con = new SqlConnection(connStr))
    {
        con.Open();
    }
    return true;
}
catch
{
    return false;
}

для удалениянеобходимость явного Close вызова.

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

...