2012-07-01 4 views
0

우리는 H2 내장 데이터베이스를 사용하여 데이터를 저장하는 애플리케이션을 보유하고 있습니다. 우리는 DB 삽입을 수행하는 동기화 된 쓰기 메소드를 가지고 있습니다. H2 DB는 Java 내장 DB이므로 작은 DB를 사용하지 않고 임베디드 DB에서 트랜잭션 관리를 처리하기 위해 write 메소드에서 "synchronized"를 사용합니다.Websphere Server 스레드가 걸렸습니다

그러나 과부하 일 때 쓰기 쓰레드가 멈추는 것을 볼 수 있습니다. 우리는 어떤 리소스에 대해 확신이 없으며,이 스레드는 매달려 있습니다.

이 코드 조각 제발 봐 :

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; 
    } 
} 

우리는이 DB에 접근 할 수있는 여러 쓰기 방법이있다. 코드에서 우리는 코드가 간단하다는 것을 알 수있었습니다. 그러나 우리는 리소스가 잠기는 곳을 잘 모릅니다.

또 다른 문제는 (Websphere) system.out의 쓰레드 덤프에 있습니다. 다음과 같이 thread stacktrace를 볼 수 있습니다. 위의 스택 트레이스에서

[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는 클래스 경로에서 사용할 수 있으며 classpath에 H2.jar도 있습니다. 왜 쓰레드가 H2에 걸리면 우리는 쓰레드 스택 트레이스를 얻을 수 없는지 확실하지 않다.

그렇지 않은 경우 스레드 스택 추적에 "알 수없는 소스"가 표시되는 이유를 알아야합니다.

감사합니다.

미리 감사드립니다.

+0

보여주는 스택 추적이 현재 표시중인 write() 메소드에 없습니다. 또한 모든 스레드가 어디에 있는지 알기 위해 javacore를 강요하려고 시도 할 수도 있습니다. – dbreaux

답변

0

ejbs를 사용하고 있습니까? 어떻게 연결 되나요? Aop 서버에 주입 되었습니까? jndi에서 가져 옵니까? 메서드를 동기화하면 안됩니다. 임베디드 db 인 경우에도 응용 프로그램 서버 기능에 의존해야합니다. 데이터베이스가 메모리에 있더라도 데이터 소스로 연결을 구성해야합니다. db에 직렬화 된 쓰기를 원하면 연결 풀을 직렬화 된 ANSI 격리 수준 (there are 4 ansi isolation levels)으로 구성해야합니다. 이 방법으로 동기화되지 않은 관리 환경 (앱 서버)에서 동일한 효과를 얻고, 이는 앱 서버 내부에서 피해야합니다.

+0

임베디드 DB가 물리적으로 동일한 서버에있는 원격 위치에 있지 않습니다. IT는 데이터를 로컬에 저장하는 일종의 임시 위치입니다. 나는 H2에 의해 주어진 Datasource 연결을 사용한다. 데이터 검색은 30 초마다 실행되고 데이터를 검색하여 EJB 프로토콜을 통해 추가 처리를 위해 원격 서버로 보낸 서비스 타이머를 통해 수행됩니다. – Sam

0

알 수없는 소스는 일반적으로 줄 번호를 사용할 수 있음을 나타냅니다.

컴파일 할 때 컴파일러는 줄 번호와 같은 디버그 정보를 추가 할 수 있습니다. JAR 또는 .class 파일에이 파일이 없으면 JVM은 해당 정보를 제공 할 수 없습니다.

HTH

+0

* 사용할 수 없습니까? * 맞습니까? – dbreaux

0

그것은 dbConnect.getConnection =()는 CONN 같다; 60000ms 이상 기다리고 있습니다.

리소스 어댑터에 하나의 메커니즘 폴링 기간이 있기 때문에 WAS에서 발생하는 오류입니다. 새 인 Y 운드 이벤트에 대해 엔터프라이즈 정보 시스템 (EIS) 이벤트 저장소를 폴링하는 비율 (밀리 초 단위)입니다. 폴링주기는 고정 된 비율로 설정됩니다. 즉 폴링주기의 실행이 어떤 이유로 지연되는 경우 다음주기가 즉시 "따라 잡기"위해 발생합니다. 폴링 기간 동안 폴링 스레드가 잠자기 상태가됩니다. 시간이 60000 밀리 초로 계산되면 WebSphere Application Server 스레드 모니터는이 폴링 스레드를 중단 된 것으로 간주하고 예외를 throw합니다.

관련 문제