Jboss 4.2.3 具有大量匿名线程的应用程序

Jboss 4.2.3 Application with huge number of anonymous Threads

我们维护一个遗留(jboss 4.2.3,ejb 3,jsp,jdk 1.6.45 64b)应用程序。

此应用程序大量使用数据库,并响应

Http 连接池是标准的(tomcat 5.5 有 250 个连接),数据库池连接提高到 300(而不是标准的 60)。

jbossservice.xml(定义默认线程池的地方)是

<mbean code="org.jboss.util.threadpool.BasicThreadPool"name="jboss.system:service=ThreadPool">
  <attribute name="Name">JBoss System Threads</attribute>
  <attribute name="ThreadGroupName">System Threads</attribute>
  <attribute name="KeepAliveTime">60000</attribute>
  <attribute name="MaximumPoolSize">10</attribute>
  <attribute name="MaximumQueueSize">1000</attribute>
  <attribute name="BlockingMode">run</attribute>

我们的一位客户在一天中的部分时间表现不佳。
生成了很多与用户活动无关的线程。

正常活动线程计数为 300/400 个线程

线程转储显示所有这些线程都是 RUNNABLE ,但没有堆栈跟踪(其他 "normal" 线程显示通常的堆栈跟踪)。

所有这些线程都被命名为“Thread-xxxxxx”并且属于“JBoss 线程池

我们确定这些线程不是由应用程序创建的,但我们找不到可能导致此线程生成的原因。

有什么想法吗?

已解决! 问题与 SQL SERVER Jdbc 驱动程序有关,我们的代码在 Statement 上使用了 setQueryTimeout 指令,驱动程序中存在一个错误,导致它为每个查询创建一个线程来管理超时.

查看: https://connect.microsoft.com/SQLServer/feedbackdetail/view/785983/jdbc-additional-thread-for-every-query-when-using-setquerytimeout
https://connect.microsoft.com/SQLServer/feedback/details/669427/property-to-create-timer-threads-per-statement-or-connection-in-jdbc-driver

删除 setQueryTimeout 指令解决问题。

HTH!