代码之家  ›  专栏  ›  技术社区  ›  Ahmed

使用数据库最佳实践?

  •  0
  • Ahmed  · 技术社区  · 16 年前

    目前我创建了SqlCommand,SqlConnection作为一个类memeber。

    在每次方法调用中,我都会执行命令以获得结果,这样做是为了避免每秒创建连接和命令,但我担心此方法中会出现异常,导致连接中断或对象处于无效状态。

    这是我当前的实现(计时器处理程序)

        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 回复  |  直到 16 年前
        1
  •  2
  •   Marc Gravell    16 年前

    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
     }
    
        2
  •  1
  •   Erich Kitzmueller    16 年前

    很难确定一个execption是否意味着该连接是一个死鸭子。为了安全起见,您可以在遇到异常时关闭并重新打开SqlConnection和SqlCommand,以防万一。当一切正常时,这不会导致任何开销。