Реализация очереди для данных для вставки в базу данных - PullRequest
3 голосов
/ 31 марта 2011

Мы разрабатываем систему отслеживания транспортных средств, в которой несколько устройств GPS продолжают отправлять свои местоположения GPS на сервер, используя соединение TCP.Коммуникатор TCP декодирует местоположение GPS и вставляет эти данные в базу данных.Прямо сейчас один поток коммуникатора TCP обслуживает один запрос устройства.После декодирования данных GPS он создает соединение с базой данных, вставляет данные и освобождает соединение.Поскольку количество устройств увеличивается, количество одновременных подключений к базе данных (то есть MySQL) также увеличивается.Следовательно, я хочу реализовать очередь, в которой каждый поток коммуникатора TCP будет передавать данные на один конец, а одно задание будет получать данные с другого конца и продолжать их вставку в базу данных.

Кто-нибудь может предложить мне лучшеерешение справиться со всем этим?Наше приложение основано на Java, а база данных - MySQL.

Спасибо, Saurabh

Ответы [ 5 ]

2 голосов
/ 31 марта 2011

Вы можете использовать поточно-ориентированную реализацию очереди, например ConcurrentLinkedQueue , чтобы поставить в очередь данные

2 голосов
/ 31 марта 2011

Вы можете просто создать простой 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
        }
    }
}
1 голос
/ 31 марта 2011

Простая параллельная очередь лучше всего подходит, если вы собираетесь собирать данные, и она поддерживает простые методы пакетирования (и, следовательно, производительность вставки базы данных)

Однако более гибкий подход, если вы хотите заниматься и другими делами, - это использовать ExecutorService с фиксированным числом потоков. Таким образом, вы можете добавлять задачи для выполнения чего угодно с ограниченной степенью параллелизма.

0 голосов
/ 31 марта 2011

одна работа будет принимать данные с другого конца и продолжайте вставлять его в базы данных.

ConcurrentLinkedQueue - это просто перебор, для более чем одного потока свободный доступ к блокировке. Метод poll использует ненужные интервалы ожидания, также вам нужно подождать, пока очередь заполнится, опять же, еще один вид сна. Если у вас есть только один поток, помещающий материал в очередь, и другой поток, удаляющий материал из очереди

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

или

LinkedBlockingQueue  
0 голосов
/ 31 марта 2011

Вам необходимо реализовать очередь сообщений.

Посмотрите либо RabbitMQ , либо ActiveMQ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...