接收别人推送的数据,存入数据库 sqlserver

一个线程接收数据,存入list里,另一个线程从list里去数据入库,接收的快,入库慢,list里的数据一直在增加,内存最后被耗尽了,如何解决? 数据是行情数据,入库的先后顺序不能变

5个回答

1、设置一个自增变量,接收一条推送数据自增1用于list自定义列,可以在数据库对应列增加对应唯一ID值并设置索引。
2、随后开设几条线程,如3条线程,线程tag初值分别1、2、3,根据初值从小到大启动,每存一条数据自增线程数的值,3条增3,4条增4以此类推。
3、sql在插入语句增加一个ID连续性的判断(if exists(select 0 from [tb] where ID=@id-1)...),插入前须存在ID减1的条目存在,否则delay若干毫秒后再插入,重复N次。
你不在数据库设置ID也行,那就要判断每线程插入的ID是否是当前list最小值。
4、每线程插入完成最后,删除对应ID的list条目。

以上以供参考

保存数据新开线程去保存,最好用线程池,核心线程数为1,最大线程数也为1,然后缓存队列设置大一点。

Myc_CSDN
和Java狼狈为奸 回复barry_di: https://www.cnblogs.com/chentingk/p/6497107.html
11 个月之前 回复
Myc_CSDN
和Java狼狈为奸 回复barry_di: 一个线程接收数据,放到一个集合中,假设集合大小为100,如果集合满了,就让获取数据的线程睡眠;然后另一个线程从上面集合中取数据,如果没有数据,就睡眠,然后唤醒获取数据的线程;就是生产者、消费者模型。
11 个月之前 回复
barry_di
barry_di list大小是没有限制的,接收到多少数据就往里面放多少数据,因为接收数据的速度比入库的速度快,list里面数据就把内存给撑爆了
11 个月之前 回复
barry_di
barry_di 接收数据到的数据我PostMessage到主程序里,主程序再保存到一个全局的list里面,入库是单独的线程,取list里面的数据入库的
11 个月之前 回复

可以试试用两个list存数据, 接收数据的时候可以随机存储到任意一个list里, 然后用两个线程分别对这两个list进行入库操作,
不过有个问题就是list并发修改可能会有问题,同步又会影响性能.

接收的数据可以不存储在List里,接过来按照时间顺序存储到另一个数据表里(比如叫data),另一个线程从这个数据表里读取数据进行入库。入库后就删掉原数据,
如果data表的数据条数大于一定数量,可以继续往别的表里存储。

这个场景看起来像是一个数据库 IO 瓶颈的问题。所以我首先想到的是使用 SqlBulkCopy 来提高写入性能。这个效率比起一条一条写入实在是高太多太多。

另外我还想到通过使用独立的 Redis 服务器来缓解主服务器的压力。不过这个只是起到缓解,主要还是使用批量写入来提高效率。以前我们对接币安接收行情数据时也是这样做的。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

11
多公司使用统一个平台,数据库如何设计?
5
怎么将邮件内容提取存入到数据库中,vb.net
5
C#项目中做一个类似日志的功能,就是将用户的增删改操作记录下来存入数据库!详细如下:
13
如何将电脑中图片保存至sqlserver中
5
SQLite数据库优化方案
4
获得公众号返回的XML之后如何将OPENID通过ASP存入数据库呢?
13
sql语句查询数据库信息,如何将查询到的信息进行冒泡排序存入list表内
8
关于 安卓数据库查询问题 怎样将查询到的信息存入数组 再用bundler传递
11
字串的切割存入数据库问题(使用vb.net)
6
LONG类型长值存储oracle数据库number字段中取值发现不正确
13
为什么通过POST得到的数据无法存入数据库
2
socketserver.server_forever()+多线程处理数据并存入数据库
2
labview中波形存入TDMS文件得到的数据代表什么含义
2
如何将一张表格以一个id存入mangoDB中?
5
用户密码为字符串,连接数据库进行登陆时与数据库密码的不符
1
ESP8266-SDK 串口中断 接收数据的FIFO有一个接收超时时间,请问接收超时时间在哪里设置?
3
android studio读写excel数据
2
怎么解析前台传后台的json中的某个属性值为array并存入数据库的一个字段内?
6
前端传来多维数组如何存入数据库并取出拼接后返给前端?
3
爬取豆瓣电影存入数据库,报错TypeError: %d format: a number is required, not str