0

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 でハングした場合、スレッドのスタックトレースを取得できない理由はわかりません。

そうでない場合は、スレッド スタック トレースが「不明なソース」を示している理由も知る必要があります。

あなたの助けに感謝。

前もって感謝します。

4

3 に答える 3

0

ejbを使用していますか?どのように接続を取得しますか?aopサーバーによって注入されますか? jndiから取得しますか?メソッドを同期しないでください。埋め込みデータベースであっても、アプリ サーバー機能に依存する必要があります。データベースがメモリ内にある場合でも、接続をデータソースとして構成する必要があります。データベースにシリアル化された書き込みが必要な場合は、接続プールをシリアル化された ansi 分離レベルに構成する必要があります ( 4 つの ansi 分離レベルがあります)。このようにして、管理された環境 (アプリ サーバー) で同期せずに同じ効果を得る必要があります。これは、アプリ サーバー内では避ける必要があります。

于 2012-07-01T14:13:48.807 に答える
0

不明なソースは通常、行番号が利用可能であることを意味します。

コンパイル時に、コンパイラは行番号などのデバッグ情報を追加できます。それらが JAR または .class ファイルに存在しない場合、JVM はその情報を提供できません。

HTH

于 2012-07-02T02:57:46.307 に答える