为要插入数据库的数据实现Queue

时间:2011-03-31 11:50:16

标签: java mysql queue

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

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

谢谢, Saurabh

5 个答案:

答案 0 :(得分:2)

您可以使用类似ConcurrentLinkedQueue的线程安全队列实现来排队数据

答案 1 :(得分: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
        }
    }
}

答案 2 :(得分:1)

如果要批量处理数据并且支持简单的批处理技术(以及数据库插入性能),那么普通的并发队列是最好的

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

答案 3 :(得分:0)

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

查看RabbitMQActiveMQ

答案 4 :(得分:0)

  

一项工作将从另一端获取数据   并保持插入   数据库中。

ConcurrentLinkedQueue只是一种矫枉过正,它可以让多个线程无法访问锁。poll方法需要不必要的休眠时间间隔,你需要等到队列被填满,这又是另一种休眠。 如果你只有一个线程将东西放入队列,另一个线程将东西从队列中取出

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

LinkedBlockingQueue