★★★有什么好的办法解决写入数据库的效率问题。★★★急~~(100分)

  • 主题发起人 主题发起人 SouthLeaf
  • 开始时间 开始时间
S

SouthLeaf

Unregistered / Unconfirmed
GUEST, unregistred user!
[:)]我是通过串口获得数据,比如得到ID,然后到数据库里两个表检索一些字段的数据,然后插入到另一个表里。因为串口接收到一次字符串就有好几个ID,这样的话,我还好分别从数据库里检索然后在执行插入第3个表里,执行效率一定会很慢的吧,而且串口是不断接到包含ID的数据。这样执行一次操作大概要向数据库的表里插几千条甚至几万条数据。请问怎么提高速度?数据库是ACCESS。
 
因为从串口里获得大量的字符串数据,而每条字符串数据包括日期和N个ID等信息,我还要操作把时间和每个ID分离出来,
我现在是这么想,
把接收到的字符串进行分离并且插入一个临时表A中,全部接收完毕后循环A表,
通过里面的ID到别的表里检索出相应数据插入到最后的目标表B中。
现在还有几个问题,如下:
1,我的想法是否合理,是该全部接收完数据插入一个临时表里,还是边接收边处理。哪个快些?请指教
2,采用多线程的话,应该起几个线程为佳,线程我是刚看的,理解的不怎么好,不知道哪部分处理该用一个线程。
3,还有,我实现的话哪些线程该放在Synchronize()函数里来处理,我搞不清楚什么样的才需要Synchronize()处理,请指教
4,怎么样在我的程序里保持同步?即我的线程实现起来应该先处理哪些在处理哪些?请指教
请高手指点解决的思路和要注意哪些事项,谢谢了~~解决问题的和给予帮助的我会在另开贴谢大家。
这个问题捆饶好几天了还没搞定,也挺急的,希望大家多多帮忙,3Q~
 
我觉得有多线程是一个比较不错的想法。
  第一个线程,只管接受数据,将收到的数据插入到临时表,然后继续等待下一组数据。也就是说,对于这位监视员来说,工作量不要太大,要随时处于待命状态。
  另一个线程,随时检验临时表,如果有数据存在,马上开始循环作相应的处理,也就是“到数据库里两个表检索一些字段的数据,然后插入到另一个表里”,处理完的数据,马上删除。
  这样,可以保证收到的数据不会丢失,数据处理虽然有些滞后(只有在特别忙碌的时候才出现),但也可以在空闲的时候补充处理完,应该是最好的方案了。
 
我也赞成用线程
 
特别感谢pyzfl,你的想法不错,我这两天也想了好多,基本和你那差不多,不过有些问题请教大家,你说的第一个线程始终监听串口,可是我不知道什么时候数据才接收完,而且什么时候关闭第一个线程?第2个线程也是一直检测临时表里是否有数据么?
 
还有怎么做到时刻监听串口和时刻检测数据表里是否有数据?
 
我的看法:
1。换数据库,不要用ACCESS等桌面型数据库,效率低,Interbase不错
2。表结构要优化,如果ID数据量大的话,尽量不要查多个表,宁可冗余,放在一个表里
3。不要把数据加到临时表里,应该存入内存块里
4。双线程:串口线程只管接受数据并存ID到内存块里,查询存表线程从内存块里读一批ID进行查表插入操作(用存储过程),线程间访问内存块应进行同步互斥,如果串口数据量很大的话,可考虑多创建几个查询存表线程
4。串口采用线程API+事件等待方式
 
to:labelsoft。谢谢你,有如下问题
1,这个版本基本上数据库是不会换了,所以考虑解决办法。
2,表结构也定好了基本不会在改了,因为其他模块都做好了。
3,怎么放入内存块?小第很菜,不会,请指教。
4,那是不是时刻监听端口和读内存?怎么访问内存的ID数据呢?
5,这个就更不会了,呵呵:)
可否写个小程序供参考?帮个忙吧,着急死了~
 
哦,你的问题,要看你的系统需求了。
  如果你是如同服务一样,随时监听串口的信息(如窍听器之类的),获取连续的、不定时的、无限的数据,那么你的线程是永远不关的,只有在程序关闭时,才结束自己的操作。
  如果只是象读卡器之类的,从串口获取有有限的数据,那你在数据读取完后关闭线程不就行了吗?
 
1。怎么放入内存块:最简单的做法,定义一全局数组,让线程用互斥量进行同步读或写。
2。肯定要时刻监听端口和读内存,实时嘛。访问全局数组时,先等待互斥量,有信号则读,读完则释放
3。串口线程采用API+事件:参考SPComm控件的源码,改造即可。在线程里等待线程结束事件和串口接收到字符事件的发生,接收到字符事件的发生时则根据协议先找到帧头,之后在判断窗口缓冲区里的字符个数是否符合要求,是则读指定个数,存入全局数组。
4。全局数组可做成环行队列,含读指针与写指针,这个我就不解释了,数据结构上就有
 
什么是线程API呀?
 
to:pyzfl那怎么保持时刻监听呢?是有限的数据,那是不是当接收到一个数据就开一个线程啊?然后接收下一个前释放?
to:labelsoft呵呵,我学的很有限,你指教的我还理解不了那么好,好多都不会做,能帮写个简单的DEMO吗?我参考着实现,谢谢了
 
帮帮忙呀~~
 
保持时刻监听是创建一个串口接收线程后,线程一直处理死循环监听串口,怎么能不停建、释放呢?那哪能收到数据。唉,说不清楚
 
还是没搞定呐,哎~~在出出主意吧
 
用视图先把两个表的相关字段连在一个临时表,然再对照,至少可以减少数据库的读取次数,
至于串口这块我也没做过呵,给不了什么帮助.
 
后退
顶部