Эффективная система ведения журналов - Java / Oracle SQL - PullRequest
1 голос
/ 27 октября 2011

All

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

Если у меня есть 2 записи в таблице исключений, R1 и R2, каждая из которых завершается с 3 ошибками проверки, запрос вставки запускается 6 раз для каждого сообщения проверки, и пользователь видит все 6 сообщений в конце процесса проверки ,

Этот метод работал для меньшего набора записей. Но для 20 000 записей это, очевидно, стало узким местом.

В соответствии с моим первоначальным подходом к редизайну, ниже приведены варианты, которые мне нужны от всех в SO:

1> Создайте пользовательский класс средства ведения журнала со всей необходимой информацией для ведения журнала и для каждой записи об ошибке сохраните идентификатор записи в качестве ключа и объект класса средства ведения журнала в качестве значения в HashMap. Когда все записи обработаны полностью, выполните вставку базы данных для всех записей в HashMap за один раз.

2> Fire SQL периодически вставляет, т. Е. Для X записей всего, обрабатывает Y <= X записей каждый раз, выполняет операцию вставки один раз. и снова обрабатываю оставшиеся записи. </p>

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

Может ли каждый предоставить ваш отзыв относительно того, какова была бы эффективная конструкция системы ведения журналов и если есть более подходящие подходы, чем я упомянул выше?

Ответы [ 2 ]

2 голосов
/ 28 октября 2011

Полагаю, ваши проблемы связаны с тем, что вы выполняете операции на основе строк, а не на основе множеств?

Операция на основе набора будет самым быстрым способом загрузки данных.Если это невозможно, я бы использовал записи x для вставки за раз, так как она более масштабируема, для вставки всех сразу потребуется постоянно увеличиваться объем памяти (но, вероятно, это будет быстрее).

хорошее обсуждениездесь спросить Тома: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1583402705463

1 голос
/ 28 октября 2011

Вместо того, чтобы запоминать каждую ошибку в HashMap, вы можете попытаться (при условии, что СУБД поддерживает это) объединить все эти операторы вставки вместе и запустить ее в конце.Примерно так:

PreparedStatement ps = connection.prepareStatement("INSERT INTO table (...) values (?, ?, ...)");
for(...) {
   ps.setString(1, ...);
   ...
   ps.addBatch();
}
int[] results = ps.executeBatch();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...