우리는 H2 내장 데이터베이스를 사용하여 데이터를 저장하는 애플리케이션을 보유하고 있습니다. 우리는 DB 삽입을 수행하는 동기화 된 쓰기 메소드를 가지고 있습니다. H2 DB는 Java 내장 DB이므로 작은 DB를 사용하지 않고 임베디드 DB에서 트랜잭션 관리를 처리하기 위해 write 메소드에서 "synchronized"를 사용합니다.Websphere Server 스레드가 걸렸습니다
그러나 과부하 일 때 쓰기 쓰레드가 멈추는 것을 볼 수 있습니다. 우리는 어떤 리소스에 대해 확신이 없으며,이 스레드는 매달려 있습니다.
이 코드 조각 제발 봐 :
public synchronized int write(IEvent event) {
String methodName = "write";
Connection conn = null;
PreparedStatement updtStmt = null;
Statement stmt = null;
ResultSet rSet = null;
int status = 0;
try {
dbConnect.checkDBSizeExceed();
conn = dbConnect.getConnection();
updtStmt = conn.prepareStatement(insertQuery);
updtStmt.setString(1, (String) event.getAttributeValue());
......
updtStmt.setString(30, (String) event.getAttributeValue());
updtStmt.setBoolean(31, false);
status = updtStmt.executeUpdate();
}catch(SQLException ex){
logger.log(methodName,logger.print(ex),Logger.ERROR);
} catch(Exception ex){
logger.log(methodName,logger.print(ex),Logger.ERROR);
} finally {
try {
if (updtStmt != null)
updtStmt.close();
if (conn != null)
conn.close();
}catch(SQLException ex) {
logger.log(methodName,logger.print(ex),Logger.ERROR);
return status;
}
return status;
}
}
우리는이 DB에 접근 할 수있는 여러 쓰기 방법이있다. 코드에서 우리는 코드가 간단하다는 것을 알 수있었습니다. 그러나 우리는 리소스가 잠기는 곳을 잘 모릅니다.
또 다른 문제는 (Websphere) system.out의 쓰레드 덤프에 있습니다. 다음과 같이 thread stacktrace를 볼 수 있습니다. 위의 스택 트레이스에서
[6/15/12 3:13:38:225 EDT] 00000032 ThreadMonitor W WSVR0605W: Thread "WebContainer : 3" (00000066) has been active for 632062 milliseconds and may be hung. There is/are 2
thread(s) in total in the server that may be hung.
at com.xxxx.eaws.di.agent.handlers.AuditEmbeddedDBHandler.store(Unknown Source)
at com.xxxx.eaws.di.agent.eventlogger.2LoggerImpl.logEvent(Unknown Source)
at com.xxxx.eecs.eventlogger.EventLoggerAdapter.logAuditEvent(EventLoggerAdapter.java:682)
at com.xxxx.eecs.eventlogger.EventLoggerAdapter.logEvent(EventLoggerAdapter.java:320)
at com.xxxx.eecs.eventlogger.EventLogger.logEventInternal(EventLogger.java:330)
at com.xxxx.eecs.eventlogger.EventLogger.logEvent(EventLogger.java:283)
at com.ibm.wps.auth.impl.ImplicitLoginFilterChainImpl.login(ImplicitLoginFilterChainImpl.java:55)
at com.ibm.wps.auth.impl.AuthenticationFilterChainHandlerImpl.invokeImplicitLoginFilterChain(AuthenticationFilterChainHandlerImpl.java:393)
at com.ibm.wps.auth.impl.InitialAuthenticationHandlerImpl.checkAuthentication(InitialAuthenticationHandlerImpl.java:204)
at com.ibm.wps.state.phases.PhaseManagerImpl.callInitialAuthenticationHandler(PhaseManagerImpl.java:240)
, 나는 내가 스택 추적에서 "알 수없는 소스"를 얻고 이유를 알 필요가있다. 이 jar는 클래스 경로에서 사용할 수 있으며 classpath에 H2.jar도 있습니다. 왜 쓰레드가 H2에 걸리면 우리는 쓰레드 스택 트레이스를 얻을 수 없는지 확실하지 않다.
그렇지 않은 경우 스레드 스택 추적에 "알 수없는 소스"가 표시되는 이유를 알아야합니다.
감사합니다.
미리 감사드립니다.
보여주는 스택 추적이 현재 표시중인 write() 메소드에 없습니다. 또한 모든 스레드가 어디에 있는지 알기 위해 javacore를 강요하려고 시도 할 수도 있습니다. – dbreaux