怎么高效率批量插入1000条数据到数据库

LL891230 2011-04-01 08:57:44
每隔5毫秒就有30多条数据发送过来,然后需要及时插入到数据库,怎样才能更高效插入到数据库?要求:插入到数据库所耗的时间必须要比发送的时间快。目前我的做法是把批量数据先放在DataTable 中,1s后一次性提交DataTable中的数据,用的方法是adapter.Update(DataTable),这种方法效率上还是比较慢,内部实现应该还是一条一条插入的,只不过少连了几次数据库。求各位大虾帮帮忙。
...全文
823 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
JimsdogV1 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ll891230 的回复:]
引用 12 楼 ll891230 的回复:
引用 10 楼 qqiuzaihui 的回复:
提供一个思路供参考:
使用数据缓冲区+多线程完成这个功能, 先用队列作为数据缓冲区, 一个线程专门负责读取数据, 将读取到的数据保存到队列; 另一个线程专门负责保存数据, DbConnection不能用sqlbulkcopy, 在Insert语句中使用 Union 拼接总是可以的吧, 一次性地拼接30……
[/Quote]

缓冲只是为了解决偶然的密集数据,要是数据一直都很密集,加不加缓冲又有什么区别呢。
JimsdogV1 2011-04-01
  • 打赏
  • 举报
回复
5毫秒??还多线程?。。。
线程多效率就更低了。

还是考虑内存数据库吧 fastdb之类的
LL891230 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ll891230 的回复:]
引用 10 楼 qqiuzaihui 的回复:
提供一个思路供参考:
使用数据缓冲区+多线程完成这个功能, 先用队列作为数据缓冲区, 一个线程专门负责读取数据, 将读取到的数据保存到队列; 另一个线程专门负责保存数据, DbConnection不能用sqlbulkcopy, 在Insert语句中使用 Union 拼接总是可以的吧, 一次性地拼接30条数据保存到数据库中. 我有试过用此种方法接收……
[/Quote]目前我的做法也是用一个列队存储数据,一个线程存,一个线程取,取的过程中需要分析+发送+插入,所耗时间远远不能达到那边传数据速度,所以就会产生数据堆积,然后越堆越多...
LL891230 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qqiuzaihui 的回复:]
提供一个思路供参考:
使用数据缓冲区+多线程完成这个功能, 先用队列作为数据缓冲区, 一个线程专门负责读取数据, 将读取到的数据保存到队列; 另一个线程专门负责保存数据, DbConnection不能用sqlbulkcopy, 在Insert语句中使用 Union 拼接总是可以的吧, 一次性地拼接30条数据保存到数据库中. 我有试过用此种方法接收处理1万条记录, 基本上可以确保即时地将数据保存到……
[/Quote]我试试,谢谢!
wqzone 2011-04-01
  • 打赏
  • 举报
回复
不要忘记了约束“插入到数据库所耗的时间必须要比发送的时间快”。
qqiuzaihui 2011-04-01
  • 打赏
  • 举报
回复
提供一个思路供参考:
使用数据缓冲区+多线程完成这个功能, 先用队列作为数据缓冲区, 一个线程专门负责读取数据, 将读取到的数据保存到队列; 另一个线程专门负责保存数据, DbConnection不能用sqlbulkcopy, 在Insert语句中使用 Union 拼接总是可以的吧, 一次性地拼接30条数据保存到数据库中. 我有试过用此种方法接收处理1万条记录, 基本上可以确保即时地将数据保存到数据库中.
当然, 如果接收到的数据量足够大足够快, 那可能还得考虑一下 sp1234 提到的 内存数据库 的问题。
wqzone 2011-04-01
  • 打赏
  • 举报
回复
我看还是换思路吧,

神仙也不敢保证“插入到数据库所耗的时间必须要比发送的时间快”。只要是与系统边界联系的总有意外发生。

所以建议另开途径
zhuoyue9935 2011-04-01
  • 打赏
  • 举报
回复
数据量太大。多几个数据库。每隔几秒插入到不同的数据里。空余的时间汇总。
trilcc 2011-04-01
  • 打赏
  • 举报
回复
或者写个存储过程
  • 打赏
  • 举报
回复
先不用担心你使用什么方式来保存数据,先担心程序的质量吧。你能否保证准确性?如果不能,最好请别人来完成这个任务。
  • 打赏
  • 举报
回复
[Quote=引用楼主 ll891230 的回复:]
每隔5毫秒就有30多条数据发送过来,然后需要及时插入到数据库,怎样才能更高效插入到数据库?
[/Quote]
这不太可能。

如果一定要使用数据库,那么应该花十几万去买一个世界上最好的内存数据库(并且可以确保自动保存到磁盘的)。

要想用技术方式解决,首先应该忘掉常见的关系数据库。商用关系数据库花上百倍的代价去做其它工作,而你的任务则没有时间做通常的数据库系统所必须做的事情(比如ACID的事务处理),所以你的任务根本不应该从现在常见的商用关系数据库角度来考虑。
ccsldya 2011-04-01
  • 打赏
  • 举报
回复
其实这样就好了啊 ,你可以把1s延迟到5秒?
语句一条条执行的时间很少,浪费时间的地方在不断的链接和断开数据库
想提高效率就像这样放在一起就行了啊。。
坐等高手
天罡gg 2011-04-01
  • 打赏
  • 举报
回复
楼上正确
使用sqlbulkcopy
LL891230 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shiyuyao1987 的回复:]
使用sqlbulkcopy
[/Quote]我现在使用的是DbConnection,不是用的SqlConnection,我该怎么做?
shiyuyao1987 2011-04-01
  • 打赏
  • 举报
回复
使用sqlbulkcopy

110,539

社区成员

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

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

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