数据采集和保存时容易丢失的问题

guangzi8531 2016-04-11 12:03:53
大家好!
目前在做一个项目,用到TCP通信和将通信获取的数据解析并保存到数据库(SQLite)。现在发现在正常工作时,查看数据库会有丢数据的情况发生。丢好几条数据,长度几秒。我保存和采集数据用了两个线程。但是共用一个Dictionary数据集合,并且这个Dictionary在采集和保存时都加了Locked锁住,防止出现数据在采集时,保存数据线程会调用Dictionary里面的内容。
但是我现在也在担心会不会出现互锁的情况发生,到时数据保存时丢失。
可以确定的是:
1.在数据采集阶段没有丢失,是保存时丢了。

请大家看这种情况下我应该如何保存数据,或者建一个队列保存。采集时插入队列Queue,保存时读取队列Queue,这样还需要Locked住这个队列吗?
...全文
643 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
guangzi8531 2016-06-17
  • 打赏
  • 举报
回复
已经解决了。我是在每个数据库存储线程建立一个缓存数组,总长度1000条数据,这样强制开辟一个1000条数据的内存空间,收到数据后先保存到缓存数组,再存到数据库中,当然还是要加lock的。
guangzi8531 2016-06-16
  • 打赏
  • 举报
回复
引用 5楼wanghui0380 的回复:
这样的情况我们不打印调试我们很难知道是什么情况 只能按照你的推测,建议使用线程安全字典ConcurrentDictionary替换掉你现在的dictionary
好的,试试。
wanghui0380 2016-06-12
  • 打赏
  • 举报
回复
这样的情况我们不打印调试我们很难知道是什么情况 只能按照你的推测,建议使用线程安全字典ConcurrentDictionary替换掉你现在的dictionary
guangzi8531 2016-06-11
  • 打赏
  • 举报
回复
SQLite数据库一次可以写入500条数据,已经够快了呀
kaflash 2016-04-11
  • 打赏
  • 举报
回复
你应该是保存比较慢造成的 1)在有速度要求时候,用先进先出的循环队列。 2)处理必须必采集快。 3)如果处理偶尔比采集慢,可以用多级队列,先拷贝到处理本地再处理 4)一次处理 可以处理多次采集数据。
xian_wwq 2016-04-11
  • 打赏
  • 举报
回复
引用 楼主 guangzi8531 的回复:
大家好! 目前在做一个项目,用到TCP通信和将通信获取的数据解析并保存到数据库(SQLite)。现在发现在正常工作时,查看数据库会有丢数据的情况发生。丢好几条数据,长度几秒。我保存和采集数据用了两个线程。但是共用一个Dictionary数据集合,并且这个Dictionary在采集和保存时都加了Locked锁住,防止出现数据在采集时,保存数据线程会调用Dictionary里面的内容。 但是我现在也在担心会不会出现互锁的情况发生,到时数据保存时丢失。 可以确定的是: 1.在数据采集阶段没有丢失,是保存时丢了。 请大家看这种情况下我应该如何保存数据,或者建一个队列保存。采集时插入队列Queue,保存时读取队列Queue,这样还需要Locked住这个队列吗?
两个线程并发访问队列,不加锁肯定不行 现在的问题是必须分析确认数据丢失的原因, 有一种可能是, 数据更新太快,写库效率不够高,还没有写完本轮数据, 下一轮数据已经到达,新数据覆盖了旧数据。 如果是写线程效率不够,那改成queue也不能彻底解决, 只要数据消费慢于生产速度,queue最终总会爆满 所以个人以为关键是优化写流程,提高入库速度
guangzi8531 2016-04-11
  • 打赏
  • 举报
回复
咋还没有人回答啊,自己顶!

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧