我有一个C#数据库层,它使用静态读取方法,在后台计时器中每秒调用一次。
目前我创建了SqlCommand,SqlConnection曾作为类memeber。
在每个方法调用中我执行命令来获取结果,我这样做是为了避免每秒创建连接和命令,但我担心这个方法会发生异常,会破坏连接或将对象放入无效的状态。
这是我目前的实现(Timer Handler)
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 :(得分:2)
SqlConnection
内置了游泳池;如果使用的话,你会发现几乎没有区别:
using(SqlConnection conn = new SqlConnection(connectionString)) {
conn.Open();
// your code
}
每一次。这可以自动对死(基础)连接作出反应。
目前你有一个bug,顺便说一下;如果命令失败,读者仍然为空...在调用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 :(得分:1)
很难确定一个execption是否意味着连接是一个死鸭。为了安全起见,您可以在遇到异常时关闭并重新打开SqlConnection和SqlCommand,以防万一。当一切正常时,这不会导致任何开销。