Multithreading Websphere服务器线程挂起

Multithreading Websphere服务器线程挂起,multithreading,websphere,h2,hung,Multithreading,Websphere,H2,Hung,我们有一个应用程序,使用H2嵌入式数据库存储数据。我们有一个同步写入方法,可以执行DB插入。由于H2 DB是一个小型Java嵌入式DB,因此我们在write方法上使用“synchronized”在嵌入式DB中而不是在DB中处理事务管理 但是在重载期间,我们可以看到写线程被挂起。我们不确定该线程挂起的是哪个资源 请看这段代码: public synchronized int write(IEvent event) { String methodName = "write"; Connec

我们有一个应用程序,使用H2嵌入式数据库存储数据。我们有一个同步写入方法,可以执行DB插入。由于H2 DB是一个小型Java嵌入式DB,因此我们在write方法上使用“synchronized”在嵌入式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)
在上面的stacktrace中,我需要知道为什么我在堆栈跟踪中得到“未知源”。这些jar在类路径中可用,我们在类路径中也有H2.jar。我们不知道为什么,如果线程在H2中挂起,我们就无法获得线程堆栈跟踪

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

谢谢你的帮助


提前感谢。

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

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

编译时,编译器可以添加诸如行号之类的调试信息。如果JAR或.class文件中没有这些信息,JVM就不能提供这些信息


HTH

它看起来像conn=dbConnect.getConnection();正在等待超过60000毫秒

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

这是嵌入式数据库不在远程位置,而是物理上在同一服务器中。它是一种在本地存储数据的临时位置。我使用H2给出的数据源连接。数据检索是通过服务计时器进行的,服务计时器每30秒运行一次,检索数据并将其发送到远程服务器,以便通过EJB协议进行进一步处理。所显示的堆栈跟踪不在所显示的write()方法中。您还可以尝试强制javacore查看所有线程的位置。