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

Lee*_*Lee 6 .net c# sql database

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

看到每个项目包含多个TcpClients读取单独的线程,将会执行以下块的许多并发实例:

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

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

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

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

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

Kei*_*yne 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();
    }
}
Run Code Online (Sandbox Code Playgroud)