2017-01-19 7 views
0

우리는 레거시 (jboss 4.2.3, ejb 3, jsp, jdk 1.6.45 64b) 응용 프로그램을 유지 관리합니다.Jboss 4.2.3 수많은 익명 스레드가있는 응용 프로그램

이 응용 프로그램은 데이터베이스의 무거운 사용을하고,

  • 사용자의 HTTP 요청
  • 웹 서비스 요청
  • 일부 CORBA 연결
  • 일부 외부 JSM 호출
  • 일부 MDB 내부 프로세스에 대응

Http conn (표준 250 개가있는 tomcat 5.5) 데이터베이스 풀 연결이 300 (표준이 아닌)으로 증가합니다.

(기본 스레드 풀은 다음 IsDefined) 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> 

하나는 일의 부분에서 나쁜 성능을 가지고있다.
사용자 활동과 관계없이 생성 된 많은 스레드가 있습니다. 카운트 스레드

정상 활동은 때때로 초 4 K로 성장하고 때로는 수 25 개 K 스레드로 성장 분

  • 천천히 감소하고 감소하는 시간이 소요 300/400 스레드

    • 입니다 응용 프로그램이 응답하지 않게됩니다 (다시 시작해야 함)

    스레드 덤프는 모든 스레드가 실행 가능하지만 스택 추적이 없음을 보여줍니다 (다른 "정상"스레드는 일반적인 스택 추적을 표시합니다).

    그 모든 스레드는 "스레드-XXXXXX을"nammed과에 속한다 "보스 풀링 스레드"

    우리는 그 스레드 응용 프로그램에 의해 생성되지 않도록하지만, 우리가 무엇을 할 수 찾을 수 없습니다 이 스레드 생성을 담당하십시오.

    아이디어가 있으십니까?

  • 답변

    0

    해결되었습니다. 문제는 SQL SERVER Jdbc 드라이버와 관련이 있습니다. 우리 코드는 Statement에 setQueryTimeout 명령을 사용합니다. 드라이버에 시간 초과를 관리하기 위해 각 쿼리마다 스레드를 만드는 버그가 있습니다.

    볼 : 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

    문제를 해결한다.

    HTH!