存储恒定数据流的最佳实践

时间:2013-08-30 13:41:43

标签: c# .net sql database

我当前项目的主要要求是每天接收,解析和存储数百万条无线电信息。这意味着每秒处理许多消息。目前,存储解析消息的方法对每个单独的消息使用简单的SqlCommandExecuteNonQuery

看到每个项目都包含多个TcpClient s读入不同的线程,将会执行以下块的许多并发实例:

query.Append(string.Format("INSERT INTO {0} ({1}) VALUES ({2})", this._TABLE_, col, val));
sqlCmd = new SqlCommand(query.ToString(), sql);
sqlCmd.ExecuteNonQuery();

我理解另一种方法可能是缓存已解析的邮件,并在预定时间执行批量插入。

使用实体框架是一种选择,但对于简单的要求可能过度。

该程序每天24小时都需要持久连接,因此永远不会关闭数据库连接。

所以我的问题是,我目前的做法有多合理?我应该关闭并打开每条消息的连接吗?或者继续使用共享的全局数据库连接并通过引用传递?

1 个答案:

答案 0 :(得分:5)

为什么使用Sql Server作为数据存储?我并不是说这种说法。我的意思是,在插入数据后查询数据的要求是什么?是否会对现有数据进行更新?缺失?在不久的将来,这些数据是否存在规范化表格?

这些答案将告知您当前方法的合理性。

  

该计划需要每天24小时持续连接   因此永远不会关闭数据库连接。

无论如何,您都应该在代码中打开和关闭数据库连接。 ADO.NET对连接进行池化,因此您无需手动打开连接:

using (SqlConnection sql = new SqlConnection("...")) {
    query.Append(string.Format("INSERT INTO {0} ({1}) VALUES ({2})", this._TABLE_, col, val));
    using (SqlCommand sqlCmd = new SqlCommand(query.ToString(), sql) {
        sql.Open();
        sqlCmd.ExecuteNonQuery();
    }
}