【问题标题】:Implementing Queue for data to be inserted in the database为要插入数据库的数据实现队列
【发布时间】:2011-03-31 11:50:16
【问题描述】:

我们正在开发一种车辆跟踪系统,其中多个 GPS 设备使用 TCP 连接不断将其 GPS 位置发送到服务器。 TCP 通信器解码 GPS 位置并将该数据插入数据库。目前,TCP 通信器的一个线程服务于一个设备请求。解码 GPS 数据后,它会创建与数据库的连接并插入数据并释放连接。 随着设备数量的增加,与数据库(即 MySQL)的并发连接数也在增加。因此,我想实现一个队列,其中 TCP 通信器的每个线程将数据推送到一端,一个作业将从另一端获取数据并将其插入数据库。

谁能建议我处理这一切的最佳解决方案?我们的应用基于 Java,数据库是 MySQL。

谢谢, 苏拉布

【问题讨论】:

    标签: java mysql queue


    【解决方案1】:

    您可以使用像ConcurrentLinkedQueue 这样的线程安全队列实现来对数据进行排队

    【讨论】:

      【解决方案2】:

      您可以创建一个简单的Thread 来处理数据库写入。然后让您的通信器线程将需要写入的数据排队。像这样的:

      public class DatabaseQueue extends Thread {
          private LinkedBlockingQueue<Data> queue = new LinkedBlockingQueue<Data>();
      
          public void queueData(Data data) {
              queue.add(data);
          }
      
          public void run() {
              while (true) {
                  Data data = queue.take();
                  // write data to database
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        如果您要对数据进行批处理,并且它支持简单的批处理技术(以及因此数据库插入性能),那么一个简单的并发队列是最好的

        但是,如果您还想做其他事情,一种更灵活的方法是使用具有固定线程数的 ExecutorService。通过这种方式,您可以添加任务以执行任何操作,同时达到有限的并发度。

        【讨论】:

          【解决方案4】:

          你需要实现一个消息队列。

          查看RabbitMQActiveMQ

          【讨论】:

            【解决方案5】:

            一个作业将从另一端获取数据 并保持插入 数据库。

            ConcurrentLinkedQueue 只是一种矫枉过正,它是让多个线程访问无锁。poll 方法需要不必要的睡眠间隔,你还需要等到队列被填满,再次进入另一种睡眠。 如果您只有一个线程将内容放入队列,而另一个线程将内容从队列中取出

            Queue<GPRSObj> queue = Collections.synchronizedList(new LinkedList<GPRSObj>());
            

            LinkedBlockingQueue  
            

            【讨论】:

              猜你喜欢
              • 2013-03-22
              • 1970-01-01
              • 1970-01-01
              • 2021-08-18
              • 2020-08-19
              • 1970-01-01
              • 2017-07-27
              • 1970-01-01
              • 2020-11-01
              相关资源
              最近更新 更多