Как сделать многопоточным регистратор аудита базы данных Java EE?

Я работаю над приложением Java EE 5, работающим на Websphere 7.0, и пытаюсь найти поточно-ориентированный и производительный способ многопоточного сохранения записей журнала аудита базы данных. Существуют ли какие-либо известные методы безопасного и эффективного ведения многопоточного аудита в приложении Java EE?

Если вам нужна справочная информация: приложение является веб-службой, и каждое полученное им сообщение запроса приводит к создание 100 или 200 сообщений журнала аудита, которые должны сохраняться в базе данных. Первоначально ведение журнала аудита выполнялось с помощью настраиваемого класса обработчика аудита, который расширяет java.util.logging.Handler, а метод публикации открывает соединение с базой данных, заполняет подготовленный оператор из LogRecord и выполняет вставку. Поскольку этот настраиваемый обработчик выполнялся в потоке EJB, ведение журнала аудита могло увеличивать время ответа на каждое сообщение запроса до нескольких секунд и приводило к пропуску SLA.

Таким образом, обработчик аудита был заменен обработчиком оболочки, который добавляет создает отдельный поток ( да, с помощью new Thread (), вопреки правилам Java EE ). Обработчик оболочки использует вектор для постановки записей аудита в очередь и сохраняет их как можно быстрее в отдельном потоке с помощью обработчика аудита.

Хотя он нарушает правила потоковой передачи Java EE, эта оболочка работает достаточно хорошо. . , пока мы не разрешим одновременные вызовы в MDB. Оболочка может ошибиться, если разрешено несколько вызовов EJB, и потенциально может сохранять каждую запись журнала в базе данных несколько раз. Похоже, это указывает на то, что в логике создания оболочки или потока есть ошибка.

Я собирался поработать над выявлением и исправлением этой проблемы, но решил сначала спросить SO, есть ли лучший способ.

5
задан Arjan Tijms 15 June 2013 в 12:57
поделиться