C# 使用数据库最佳实践?
我有一个C数据库层,它使用静态读取方法,在后台计时器中每秒调用一次 目前我创建了SqlCommand,SqlConnection作为一个类memeber 在每次方法调用中,我都会执行命令以获得结果,这样做是为了避免每秒创建连接和命令,但我担心此方法中会出现异常,导致连接中断或对象处于无效状态 这是我当前的实现计时器处理程序C# 使用数据库最佳实践?,c#,database,ado.net,C#,Database,Ado.net,我有一个C数据库层,它使用静态读取方法,在后台计时器中每秒调用一次 目前我创建了SqlCommand,SqlConnection作为一个类memeber 在每次方法调用中,我都会执行命令以获得结果,这样做是为了避免每秒创建连接和命令,但我担心此方法中会出现异常,导致连接中断或对象处于无效状态 这是我当前的实现计时器处理程序 static void GetBarTime(object state) { lock (_staticConnection)
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语句,而是在一个计时器中执行,并更新客户机使用的全局变量。很难确定一个执行选项是否意味着连接是一个死鸭子。为了安全起见,您可以在遇到异常时关闭并重新打开SqlConnection和SqlCommand,以防万一。当一切正常时,这不会导致任何开销。很难确定一个执行选项是否意味着连接是一个死鸭子。为了安全起见,您可以在遇到异常时关闭并重新打开SqlConnection和SqlCommand,以防万一。当一切正常时,这不会导致任何开销。SqlConnection内置了池;如果使用以下选项,您几乎看不到任何差异:
using(SqlConnection conn = new SqlConnection(connectionString)) {
conn.Open();
// your code
}
每一次。这可以自动对死掉的底层连接做出反应
顺便说一句,你现在有一个bug;如果命令失败,读卡器仍将为空。。。在调用Dispose之前检查null:
或者只使用:
SqlConnection内置了池;如果使用以下选项,您几乎看不到任何差异:
using(SqlConnection conn = new SqlConnection(connectionString)) {
conn.Open();
// your code
}
每一次。这可以自动对死掉的底层连接做出反应
顺便说一句,你现在有一个bug;如果命令失败,读卡器仍将为空。。。在调用Dispose之前检查null:
或者只使用:
你能解释一下这个场景吗?为什么你需要在定时器中写代码来从数据库中读取数据?DB值的变化频率有多高?您能解释一下这个场景吗?为什么需要在定时器中编写代码来读取DB中的内容?DB值更改的频率有多高?因此我可以使用相同的代码,但只是在异常处理中关闭并再次打开连接?我觉得更好:在异常处理程序中,只需关闭它并将其设置为null。在GetBarTime中,在锁块中检查连接是否为空;如果是,请打开它并创建SqlStatement。通过这种方式,当数据库在一段时间内不可用时,可以更容易地避免问题。继续,因为如果出现异常,重新打开连接也可能会失败…因此我可以使用相同的代码,但只是在异常处理中,只需关闭并再次打开连接即可?更好:在异常处理程序中,只需关闭它并将其设置为null。在GetBarTime中,在锁块中检查连接是否为空;如果是,请打开它并创建SqlStatement。通过这种方式,当数据库在一段时间内不可用时,更容易避免问题。继续,因为如果出现异常,重新打开连接也可能失败…很好,但从逻辑上讲,是更好还是为每次调用创建连接和命令?通常是的,每次调用都更好;您在状态管理/线程化等方面没有问题。这在一定程度上还取决于命令的外观—例如,存储过程在保留准备好的命令方面没有任何真正的优势。我不是问一般情况,我的情况是每秒调用一次方法,我知道有连接池,但打开和关闭连接每次调用都会花费一些时间,与此mehodNo的专用连接相比,不是真的-基础连接保持打开状态。你只有时间从托管池中获取数据,这是绝对微小的,你永远无法与进程外的时间和可能基于网络的服务器IO的时间相比来衡量这一点。很好,但从逻辑上讲,是更好还是为每个调用创建连接和命令更好?通常是的,每次调用都更好;您在状态管理/线程化等方面没有问题。这在一定程度上还取决于命令的外观—例如,存储过程在保留准备好的命令方面没有任何真正的优势。我不是问一般情况,我的情况是每秒调用一次方法,我知道有连接池,但打开和关闭连接每次调用都会花费一些时间,与此mehodNo的专用连接相比,不是真的-基础连接保持打开状态。你只有时间从法力恢复 ged池是一个非常小的池,与进程外的时间相比,您永远无法衡量这一点,而且可能无法与服务器的基于网络的IO进行比较。
try
{
using(SqlDataReader dataReader = _getMaxTimeCommand.ExecuteReader())
{
dataReader.Read();
_currentTick = dataReader.GetInt32(0);
}
}
catch (Exception ex)
{
//Log the error
}