0

我正在尝试收集数据流(每秒 100-150 个数据包),然后使用存储过程将处理后的数据包发送到 MySQL 数据库:

comm = new MySqlCommand("cantm_insert", conn);
comm.CommandType = CommandType.StoredProcedure;

comm.Parameters.AddWithValue("?_tmsid", tmsid);
comm.Parameters.AddWithValue("?_time", DateTime.Now.ToOADate());
comm.Parameters.AddWithValue("?_dest", c.Identifier >> 3);
comm.Parameters.AddWithValue("?_source", c[0]);
comm.Parameters.AddWithValue("?_length", c.DataLength);
comm.Parameters.AddWithValue("?_type", c[1]);
comm.Parameters.AddWithValue("?_data", buffer);

comm.executeNonQuery();

这种方法每秒只给我 15-20 个数据包存储在数据库中。我需要尽快将数据存储到数据库中。

在 MSSQL 中,我可以发送大量文本命令(例如“从 tbl 中选择 *;插入 tbl;从 tbl 中删除;”),但我不知道如何使用存储过程来提高性能。

4

1 回答 1

1

您可以通过重用命令和参数对象来提高代码的性能。当您获取新数据点时,只需为参数对象设置值。所有的资源分配都会损害代码的性能。不知道你的存储过程在做什么,所以无能为力。

在数据库方面,删除索引。您可以实现一个数据收集表,该表在开始测试之前被截断。测试后将数据移动到其“真实”表中。

您提到数据流的 150-200 个数据包/秒。这是平均数据还是连续数据?因为如果数据包突然出现,您可以使用一个线程进行数据收集,使用第二个线程进行数据库存储,并在它们之间使用缓冲区/队列。验证缓冲区是否在下一个数据突发之前得到处理。这样你就不会丢弃数据。

于 2013-02-27T08:17:02.100 回答