c# 计时器保持 sql-server 与 db "Alive" 的连接

c# Timer to keep the sql-server connection to db "Alive"

我遇到了以下问题。当软件长时间不进行查询时,与数据库的连接似乎进入了休眠模式,所以当我执行查询时需要一段时间才能唤醒。 我的解决方案是在静态 class 中定义一个计时器,每 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;
            }
        }

  }

鉴于唯一使用的共享状态是连接字符串,是的,它是线程安全的。 如果连接字符串随时间发生变化(根据您的代码,这似乎不太可能),那么它可能会尝试连接到连接字符串的 'old version',但这是您可能会看到的最糟糕的行为。如果连接字符串从不更改,这将不是问题。

要考虑的一件事是将其更改为:

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

删除显式 Close 调用的需要。

注意,我不是在评论你的代码是否是个好主意。像这样不断地连接和断开与数据库的连接似乎不是一个特别好的主意,但这超出了您的问题范围。我建议每三分钟左右重新连接一次,因为通常连接会从池中删除 after four minutes.