Multithreading Websphere服务器线程挂起
我们有一个应用程序,使用H2嵌入式数据库存储数据。我们有一个同步写入方法,可以执行DB插入。由于H2 DB是一个小型Java嵌入式DB,因此我们在write方法上使用“synchronized”在嵌入式DB中而不是在DB中处理事务管理 但是在重载期间,我们可以看到写线程被挂起。我们不确定该线程挂起的是哪个资源 请看这段代码: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
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查看所有线程的位置。