Java 为要插入到数据库中的数据实现队列

Java 为要插入到数据库中的数据实现队列,java,mysql,queue,Java,Mysql,Queue,我们正在开发一个车辆跟踪系统,其中几个GPS设备使用TCP连接不断将其GPS位置发送到服务器。TCP通信器解码GPS位置并将该数据插入数据库。现在,TCP通信器的一个线程为一个设备请求提供服务。解码GPS数据后,它会创建到数据库的连接,插入数据并释放连接。 随着设备数量的增加,到数据库(MySQL)的并发连接数量也在增加。因此,我想实现一个队列,其中TCP communicator的每个线程将数据推送到一端,一个作业将从另一端获取数据并将其插入数据库 有人能给我建议处理这一切的最好办法吗?我们的

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

有人能给我建议处理这一切的最好办法吗?我们的应用程序基于Java,数据库是MySQL

谢谢,
Saurabh

您需要实现一个消息队列


看一看或

您可以使用线程安全的队列实现,如对数据进行队列处理

您只需创建一个简单的
线程
,即可处理数据库写入。然后让通信器线程将需要写入的数据排队。大概是这样的:

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
        }
    }
}
公共类数据库队列扩展线程{
私有LinkedBlockingQueue=新LinkedBlockingQueue();
公共无效队列数据(数据){
添加(数据);
}
公开募捐{
while(true){
Data=queue.take();
//将数据写入数据库
}
}
}

如果要对数据进行批处理,并且它支持简单的批处理技术(从而提高数据库插入性能),那么普通并发队列是最好的选择

但是,如果您还想做其他事情,则更灵活的方法是使用带有固定线程数的ExecutorService。通过这种方式,您可以在有限的并发性范围内添加任务来执行任何操作

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

ConcurrentLinkedQueue只是一个滥杀,它让多个线程访问无锁。
poll
方法会占用不必要的睡眠时间,你还需要等待队列被填满,这又是另一种睡眠。 如果只有一个线程将内容放入队列,另一个线程将内容从队列中取出

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