Java: TaskExecutor для асинхронной записи в базу данных? - PullRequest
2 голосов
/ 13 марта 2011

Я подумываю об использовании Java TaskExecutor для запуска асинхронной записи в базу данных. Понятно, что потоки не приходят бесплатно, но если я использую фиксированный размер пула потоков, скажем, 5-10, как это плохая идея?

Наше приложение читает из очень большого файла, используя буфер, и сбрасывает эту информацию в базу данных после выполнения некоторых манипуляций с данными. Использование асинхронных записей здесь кажется идеальным, чтобы мы могли продолжить работу над файлом. Что мне не хватает? Почему не каждое приложение использует асинхронную запись?

Ответы [ 4 ]

2 голосов
/ 21 апреля 2011

Идея совсем не плохая. На самом деле, я только что попробовал вчера, потому что мне нужно было создать копию онлайн-базы данных, которая имеет 5 различных категорий с примерно 60000 элементами в каждой.

Переместив операцию анализа / сохранения каждой категории в параллельные задачи и разделив импорт каждой категории на более мелкие партии, выполняемые параллельно, я сократил общее время импорта с нескольких часов (по оценкам) до 26 минут. По пути я нашел хороший кусок кода для разделения коллекции: http://www.vogella.de/articles/JavaAlgorithmsPartitionCollection/article.html

Я использовал ThreadPoolTaskExecutor для запуска задач. Ваши задачи - простая реализация интерфейса Callable.

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

Я не уверен, что пул потоков даже необходим.Я хотел бы рассмотреть возможность использования отдельного потока DatabaseWriter, который делает все записи и обработки ошибок для вас.Примерно так:

 public class AsyncDatabaseWriter implements Runnable {
     private LinkedBlockingQueue<Data> queue = ....
     private volatile boolean terminate = false;

     public void run() {
         while(!terminate) {
            Data data = queue.take();
            // write to database
         }
     }
     public void ScheduleWrite(Data data) {
         queue.add(data);
     }
 }

Мне лично нравится стиль использования Proxy для потоковых операций, которые могут занять много времени.Я не говорю, что такой подход лучше, чем использование исполнителей, просто добавив его в качестве альтернативы.

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

Почему не все приложения используют асинхронную запись?

Часто необходимо / полезно / проще справляться с ошибкой записи синхронным способом.

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

почему не каждое приложение использует асинхронную запись? - потому что каждое приложение делает разные вещи.

Вы можете поверить, что некоторые приложения даже не используют базу данных OMG !!!!!!!!!

серьезно, учитывая, что вы не говорите, каковы ваши стратегии неудачи - звучит так, как будто это может быть разумно Что произойдет, если запись не удалась? или дБ как-то убирает

В некоторых базах данных, таких как sybase, есть (или, по крайней мере, есть) вещь, в которой они действительно не любят, когда несколько писателей объединяются в одну таблицу - все авторы заканчивают тем, что блокировали друг друга - так что, возможно, это не будет иметь большого значения. ..

...