2011-01-03 3 views
5

Websphere 7.0에서 실행되는 Java EE 5 응용 프로그램을 작성 중이며 데이터베이스 감사 로그 레코드의 지속성을 다중 스레드하기위한 스레드 안전성 및 성능이 뛰어난 방법을 찾으려고합니다. Java EE 응용 프로그램 내에서 멀티 스레드 감사 로깅을 안전하고 효율적으로 수행하기위한 알려진 방법이 있습니까?Java EE 데이터베이스 감사 로거를 멀티 스레드하는 방법은 무엇입니까?

배경 정보가 필요한 경우 : 응용 프로그램이 웹 서비스이고 수신 한 각 요청 메시지는 데이터베이스에 유지되어야하는 100 또는 200 개의 감사 로그 메시지를 생성합니다. 원래 감사 로깅은 java.util.logging.Handler를 확장하는 사용자 정의 감사 핸들러 클래스로 수행되었으며 publish 메소드는 데이터베이스 연결을 열고 LogRecord에서 준비된 명령문을 채우고 삽입을 실행합니다. 이 사용자 지정 처리기가 EJB의 스레드 내에서 실행 되었기 때문에 감사 로깅은 각 요청 메시지의 응답 시간에 최대 몇 초를 더할 수 있으며 SLA가 누락 된 원인이 될 수 있습니다.

그래서 감사 처리기가 Java EE의 규칙에 대해 별도의 스레드 (예, 새 스레드())를 생성하는 래퍼 처리기로 바뀌 었습니다. 랩퍼 핸들러는 Vector를 사용하여 감사 레 Z 드를 큐에 넣고, 감사 핸들러를 사용하여 별도의 스레드에서 가능한 빨리 처리합니다.

Java EE 스레딩의 규칙을 위반하는 동안이 래퍼는 매우 잘 작동합니다 ... MDB에서 동시 호출을 허용 할 때까지. 래퍼는 여러 EJB 호출이 허용 될 때 망쳐 버릴 가능성이 있으며 잠재적으로 각 로그 레코드를 데이터베이스에 여러 번 저장합니다. 이는 래퍼 또는 스레드 생성 논리에 버그가 있음을 나타냅니다.

나는이 문제를 확인하고 수정하려고 노력했지만, 더 좋은 방법이 있다면 먼저 물어볼 것이라고 생각했습니다.

+0

MDB에서 동시 호출이 무슨 뜻입니까? 우리는 MDB 대신에 Spring의 MessageListener를 사용한다는 점을 제외하면 비슷한 종류의 모델을 가지고 있습니다. –

+0

ActivationSpecification에는 하나의 ActSpec에서 동시에 처리 할 수있는 메시지 수를 지정하는 "최대 서버 세션"속성이 있습니다. 우리가 1시에 이것을하기 전에 주어진 시간에 서버 당 오직 하나의 메시지 만 처리되었습니다. 이 숫자를 1보다 크게 늘리면 주어진 시간에 여러 메시지가 서버에서 처리됩니다. –

+0

WebSphere MQ를 사용하고있는 것 같습니다. "최대 서버 세션"은 MDB가 아닌 WMQ의 커스텀 속성 인 것처럼 보입니다. 따라서 MQ 포럼에 게시하는 것이 좋습니다. –

답변

3

JMS를 사용하여 이러한 감사 메시지를 대기열에 넣은 다음이를 가져와 데이터베이스에 저장하는 다른 서비스를 호출합니다. 이것은 물론 모든 로그가 실시간으로 데이터베이스에 저장되는 것은 아니라는 것을 의미합니다. 그러나이 접근법은 Websphere에서 일부 작업을 덜어 주며 코드에 표준 위반 멀티 스레딩을 수행하지 않습니다.

+0

고마워, 그거 좋은 생각이야. 로드를 처리하는 방법을 확인하기 위해 개념 증명을 시도 할 것입니다. –