我们正在开发一种车辆跟踪系统,其中多个GPS设备使用TCP连接将其GPS位置发送到服务器。 TCP通信器解码GPS位置并将该数据插入数据库。现在,TCP通信器的一个线程服务于一个设备请求。解码GPS数据后,它会创建与数据库的连接并插入数据并释放连接。 随着设备数量的增加,与数据库(即MySQL)的并发连接数也在增加。因此,我想实现一个队列,其中TCP通信器的每个线程将数据推送到一端,一个作业将从另一端获取数据并将其插入数据库。
有人能建议我处理这一切的最佳解决方案吗?我们的应用程序基于Java,数据库是MySQL。
谢谢, Saurabh
答案 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)
答案 4 :(得分:0)
一项工作将从另一端获取数据 并保持插入 数据库中。
ConcurrentLinkedQueue只是一种矫枉过正,它可以让多个线程无法访问锁。poll
方法需要不必要的休眠时间间隔,你需要等到队列被填满,这又是另一种休眠。
如果你只有一个线程将东西放入队列,另一个线程将东西从队列中取出
Queue<GPRSObj> queue = Collections.synchronizedList(new LinkedList<GPRSObj>());
或
LinkedBlockingQueue