我们保留了遗留(jboss 4.2.3,ejb 3,jsp,jdk 1.6.45 64b)应用程序。
此应用程序大量使用数据库,并回复
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线程
线程转储显示所有这些线程都是RUNNABLE,但是没有堆栈跟踪(其他&#34;正常&#34;线程显示通常的堆栈跟踪)。
所有这些线程都被nammed&#34; Thread-xxxxxx &#34;并且属于&#34; JBoss汇集线程&#34;
我们确信这些线程不是由应用程序创建的,但是我们无法找到可能导致生成此线程的内容。
有什么想法吗?
答案 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!