Jboss 4.2.3包含大量匿名线程的应用程序

时间:2017-01-19 15:32:01

标签: java multithreading jboss jboss-4.2.x

我们保留了遗留(jboss 4.2.3,ejb 3,jsp,jdk 1.6.45 64b)应用程序。

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

  • 用户Http请求
  • 网络服务请求
  • 一些CORBA连接
  • 一些外部JSM调用
  • 一些MDB内部流程

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

jboss service.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线程

  • 有时它会在几秒钟内增长到4 k并在几分钟内缓慢下降
  • 有时它可以增长到25 k线程并且需要几个小时才能减少并且应用程序无响应(需要重新启动)

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

所有这些线程都被nammed&#34; Thread-xxxxxx &#34;并且属于&#34; JBoss汇集线程&#34;

我们确信这些线程不是由应用程序创建的,但是我们无法找到可能导致生成此线程的内容。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

已解决! 问题与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!