6

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

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

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

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

使用 Entity Framework 是一种选择,但对于简单的要求可能有点过分了。

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

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

4

1 回答 1

4

为什么要使用 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();
    }
}
于 2013-08-30T14:01:18.957 回答