我正在尝试收集数据流(每秒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中,我可以发送大包文本命令(例如“select * from tbl; insert into tbl; delete from tbl;”),但我不知道如何使用存储过程提高性能。
答案 0 :(得分:1)
您可以通过重复使用命令来提高代码的性能。参数对象。 获取新数据点时,只需将值设置为参数对象即可。 所有资源分配都会损害代码的性能。 不知道你的sproc正在做什么,所以无法帮助那里。
在数据库端,删除索引。您可以实现在开始测试之前截断的数据收集表。测试后将数据移动到“真实”表格。
您提到150-200个数据包/秒的数据流。这是平均数据还是连续数据? 因为如果数据包是突发的,你可以使用一个线程进行数据收集。数据库存储的第二个线程,它们之间有缓冲区/队列。验证在下一个数据突发之前缓冲区是否得到处理。这样您就不会丢弃数据。