Websphere Server 线程挂起
Posted
技术标签:
【中文标题】Websphere Server 线程挂起【英文标题】:Websphere Server threads getting hung 【发布时间】:2012-07-01 13:11:56 【问题描述】:我们有一个应用程序,我们使用 H2 嵌入式数据库来存储数据。我们有一个同步写入方法,它执行数据库插入。由于 H2 DB 是一个小型 Java 嵌入式 DB,我们在 write 方法上使用“同步”来处理嵌入式 DB 中的事务管理,而不是 DB。
但是在重负载期间,我们可以看到写线程被挂起。我们不确定哪个资源,这个线程正在挂起。
请看这段sn-p的代码:
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 中挂起,我们无法获取线程堆栈跟踪。
如果不是,我还需要知道为什么线程堆栈跟踪显示“未知来源”。
感谢您的帮助。
提前致谢。
【问题讨论】:
您显示的堆栈跟踪不在您显示的 write() 方法中。您也可以尝试强制 javacore 查看所有线程所在的位置。 【参考方案1】:你在使用 ejbs 吗?你如何获得连接?它是由aop服务器注入的吗?你从 jndi 检索它吗?您不应该同步该方法。 即使它是嵌入式数据库,您也应该依赖应用服务器设施。 即使您的数据库在内存中,您也需要将连接配置为数据源。如果您想在 db 上进行序列化写入,则需要将连接池配置为序列化 ansi 隔离级别 (there are 4 ansi isolation levels)。这样,您应该在没有同步的托管环境(应用服务器)中获得相同的效果,这应该避免在应用服务器内部。
【讨论】:
这是嵌入式数据库不在远程位置,它在物理上位于同一服务器中。 IT 是一种在本地存储数据的临时位置。我使用 H2 给出的数据源连接。数据检索是通过每 30 秒运行一次的服务计时器检索数据并通过 EJB 协议将其发送到远程服务器进行进一步处理。【参考方案2】:未知来源通常意味着行号可用。
编译时,编译器可以添加调试信息,如行号。如果它们不在 JAR 或 .class 文件中,则 JVM 无法为您提供该信息。
HTH
【讨论】:
【参考方案3】:看起来像 conn = dbConnect.getConnection();正在等待超过 60000 毫秒。
WAS 抛出的错误是因为资源适配器有一个机制轮询周期。它被认为是轮询企业信息系统 (EIS) 事件存储以查找新入站事件的速率(以毫秒为单位)。轮询周期以固定速率建立,这意味着如果轮询周期的执行因任何原因延迟,将立即发生下一个周期以“赶上”。在轮询期间,轮询线程将处于休眠状态。 一旦时间计算到 60000 毫秒,WebSphere Application Server 线程监视器就会将此轮询线程视为挂起并抛出异常。
【讨论】:
以上是关于Websphere Server 线程挂起的主要内容,如果未能解决你的问题,请参考以下文章
线程 WebContainer 已保持活动状态 N 毫秒,此线程可能已挂起
如何使 WebSphere Application Server 上长时间运行的 Web 请求超时? [复制]
在 Websphere Application Server 8.5 上运行的 Web 应用程序中的字符编码
Eclipse 远程调试 WebSphere Application Server (WAS)