2012-07-01 71 views
0

我们有一个应用程序,我们使用H2嵌入式数据库存储数据。我们有一个同步写入方法,可以插入数据库。由于H2 DB是一个小型Java嵌入式数据库,因此我们在写入方法上使用“synchronized”来处理嵌入式数据库中的事务管理,而不是在数据库中。Websphere服务器线程挂起

但是在重载时,我们可以看到写入线程正在挂起。我们不确定哪个资源,这个线程正在被挂起。

请看看这个代码片段:

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中的线程转储中,我们可以看到线程堆栈跟踪如下。

[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) 

在上面的堆栈跟踪,我需要知道为什么我在堆栈跟踪得到“未知源”的原因。这些罐子在类路径中可用,我们在类路径中也有H2.jar。我们不确定为什么,如果线程挂在H2中,我们无法获得线程堆栈跟踪。

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

感谢你的帮助。

在此先感谢。

+0

您显示的堆栈跟踪不在您所显示的write()方法中。你也可以尝试强制一个javacore来查看你的所有线程在哪里。 – dbreaux

回答

0

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

+0

这是嵌入式数据库不在远程位置,它物理上在同一台服务器上。 IT是一种在本地存储数据的临时位置。我使用H2给出的数据源连接。数据检索通过服务计时器进行,该服务计时器每30秒运行一次并检索数据并将其发送到远程服务器,以便通过EJB协议进行进一步处理。 – Sam

0

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

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

HTH

+0

是否*不可用,正确? – dbreaux

0

它看起来像康恩= dbConnect.getConnection();正在等待超过60000ms。

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

相关问题