我有一个程序,使用5个串口从硬件获取数据并将它们保存在MySQL数据库中,并使用tcp / ip将它们传输到第三位
对于串行端口,我使用Async,因此已经分离了threads.so但是不能使系统发挥作用。但是如果我在串口组件创建的线程中使用MySQL连接,则浪费时间从缓冲区读取并使缓冲区超过加载错误
另一方面,如果我将数据进程和MySQL存储发送到匿名线程,它会导致队列中有许多工作线程......
处理此类应用的最佳方法是什么?
答案 0 :(得分:0)
通过在COM端口和MySQL线程之间设置FIFO队列,您所描述的问题是可解决的。 COM设备有一些数据流(命名为上游),将此数据放入线程安全FIFO(Delphi有一个实现:System.Generics.Collections.TThreadedQueue)并为MySQL分配N个线程,从FIFO队列中读取数据部分(将其命名为下游)。因此,您将问题转换为经典的生产者/消费者任务。如果MySQL线程太慢,FIFO大小会增长,在这种情况下你必须增加MySQL线程的数量。您可以通过查看FIFO平均大小来检测最佳MySQL线程数。
如果物理设备写入数据的速度比程序更快,则会导致驱动程序缓冲区过载问题。在你的情况下,它发生由于MySQL线程部分的缓慢。
说实话,与CPU和线程相比,COM端口速度非常慢,我确定你的问题的核心 - 你从COM设备读取大量的小尺寸数据并将每一个小数据包装到SQL操作在你的MySQL库的背景中。将您的外观转移到BATCHING - 将大量小型数据与更大的数据批量相结合,这样您就可以减少TCP / IP上的SQL操作量