2009-06-29 137 views
0

我有一个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(); 
      } 
     } 
    } 

什么是最好的做法是什么?

更多细节:

我在一个计时器这样做的还有另外一个prorcess更新我的表中的每一秒,有一个由一组客户端使用,并呼吁每一秒,以获得最新值的另一暴露方法。

因此,不是每秒钟为每个客户端执行select语句,而是在一个定时器中执行并更新客户端使用的全局变量。

+0

你能解释的情况下,至于为什么你需要在定时器中编写代码以从DB读取事物? DB值变化的频率如何? – shahkalpesh 2009-06-29 06:47:28

+0

我添加了详细信息 – 2009-06-29 07:05:23

+0

(回复评论) – 2009-06-29 08:48:51

回答

2

SqlConnection有内置的内置池;你会看到几乎没有区别,如果你使用:

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

每次。这可以自动对死亡(底层)连接作出反应。

目前你有一个错误,顺便说一句;如果命令失败,读者仍然将是空的......要么调用Dispose()之前检查null

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

要找出执行是否意味着该连接是死鸭,可能相当困难。为了安全起见,只要遇到异常,您可以关闭并重新打开SqlConnection和SqlCommand,以防万一。当一切正常时,这不会造成任何开销。