H2組み込みデータベースを使用してデータを保存するアプリケーションがあります。DB挿入を行う同期書き込みメソッドがあります。H2 DB は小さな Java 組み込み DB であるため、書き込みメソッドで「同期」を使用して、DB ではなく組み込み DB でトランザクション管理を処理します。
しかし、負荷が高いと、書き込みスレッドがハングアップすることがわかりました。どのリソースでこのスレッドがハングしているのか不明です。
このコード スニペットを見てください。
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 にアクセスできる複数の書き込みメソッドがあります。コードから、コードが単純であることがわかりました。しかし、リソースがどこでロックされているかはわかりません。
もう 1 つの問題は、(Websphere) system.out のスレッド ダンプにあります。以下のようなスレッド スタック トレースを確認できます。
[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 はクラスパスで利用でき、クラスパスには H2.jar もあります。スレッドが H2 でハングした場合、スレッドのスタックトレースを取得できない理由はわかりません。
そうでない場合は、スレッド スタック トレースが「不明なソース」を示している理由も知る必要があります。
あなたの助けに感謝。
前もって感謝します。