Websphere 服务器线程挂起

问题描述 投票:0回答:3

我们有一个应用程序,使用 H2 嵌入式数据库来存储数据。我们有一个同步写入方法来执行数据库插入。由于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;
  }
}

我们有多种写入方法可以访问该数据库。从代码中我们可以看出,代码很简单。但我们不确定资源被锁定在哪里。

另一个问题是在(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 中挂起,我们将无法获取线程堆栈跟踪。

如果没有,我还需要知道为什么线程堆栈跟踪显示“未知来源”。

感谢您的帮助。

提前致谢。

multithreading websphere h2 hung
3个回答
0
投票

你使用ejb吗?你如何获得连接?是aop服务器注入的吗?你从 jndi 检索它吗?您不应该同步该方法。 即使它是嵌入式数据库,您也应该依赖应用程序服务器设施。 即使您的数据库位于内存中,您也需要将连接配置为数据源。如果您想在数据库上进行序列化写入,则需要将连接池配置为序列化 ansi 隔离级别(有 4 个 ansi 隔离级别)。通过这种方式,您应该在没有同步的托管环境(应用程序服务器)中获得相同的效果,这应该在应用程序服务器内避免。


0
投票

来源未知通常意味着行号可用。

编译时,编译器可以添加行号等调试信息。如果它们不存在于 JAR 或 .class 文件中,则 JVM 无法为您提供该信息。

HTH


0
投票

看起来像 conn = dbConnect.getConnection();等待时间超过 60000ms。

WAS抛出的错误是因为资源适配器有一种机制轮询周期。它被视为轮询企业信息系统 (EIS) 事件存储以查找新入站事件的速率(以毫秒为单位)。轮询周期以固定速率建立,这意味着如果轮询周期的执行因任何原因而延迟,则下一个周期将立即发生以“赶上”。在轮询期间,轮询线程将处于休眠状态。 一旦时间计算到 60000 毫秒,WebSphere Application Server 线程监视器就会将该轮询线程视为挂起并抛出异常。

© www.soinside.com 2019 - 2024. All rights reserved.