2013-07-09 12 views
0

내 J2EE 응용 프로그램에서 StaleConnectionException이 발생했습니다. 나는 (그리고 검색 한) 공부를했고 해결책을 찾았습니다.WebSphere 및 StaleConnectionException

여기 있습니다. 내가 StaleConnectionException를 관리해야하는 경우 처음 메서드 호출에 육초의 제 지연을 가지고 있기 때문에

public static Connection getConnection() { 
    Connection conn = null; 

    try { 
     if (ds == null) ds = (DataSource) new Utility.makeLookup(); 
     conn = ds.getConnection(); 
     conn.setAutoCommit(false); 

     // Check quality of return connection 
     Statement stmt = conn.createStatement(); 
     stmt.executeQuery("Select 1 from dual"); 
     stmt.close(); 

    } catch (Throwable t) { 
     try { 
      // Recovery 
      ds = (DataSource) new Utility.makeLookup(); 
      conn = ds.getConnection(); 
      conn.setAutoCommit(false); 
      return conn; 
     } catch (Throwable t2) { /* RIP */ } 
    } 

    return conn; 
    } 

나는이 솔루션을 좋아하지 않는다.

해결 방법 : 새 브라우저 세션이 시작될 때 연결을 테스트 해 봅니다.하지만이 방법도 마음에 들지 않습니다.

구현할 수있는 것이 더 있습니다.

미리 감사드립니다. 나는 결코이 예외 들어,하지만 한

답변

0

안녕하세요, 하나있어. 이것은 거의 응용 문제가 될 수 없습니다. 데이터 소스 정의 또는 DB 설정에 문제가있을 수 있습니다. 좀 더 자세한 정보를 제공해 주시겠습니까?

1. 버전, OS/아키텍처, DB 공급 업체/버전, JDBC 드라이버가 관리 콘솔 WAS에서
2. 데이터 소스/연결 풀 설정을 사용
3. 예외 스택 추적

그러나 연결 풀의 초기 연결 수를 0으로 설정하면 요청시 새 연결을 열 수 있습니다.

0

나는이 문제에 직면했다 : 연결이 아침에, 예를 들어, DB 측에서 시간이 초과되었습니다 때 무슨 일이 있었 내 경우에는 1 사용자가 응용 프로그램에 연결할 때. 사실 DB 연결 풀의 최소 크기는 기본적으로 1이므로 연결 풀에서 유지 관리하는 마지막 연결 시간이 초과되었습니다. 해결 방법은 0으로 줄이는 것입니다 (WAS7/Oracle). 우리는 더 이상이 문제에 직면하지 않았습니다.

나는 최근에이 문제가 발생하고 다른 해결책을 발견 한

0

이 속성은 WAS 콘솔, 자원> JDBC> 된 데이터 소스> [당신의 DS 이름]> 연결 풀 특성에 있습니다. 다른 사람이이 스레드를 발견하면 게시하겠다고 생각했습니다. java.sql.Connection 오브젝트는 기본 데이터베이스에 연결하는 isValid 함수를 포함합니다. 이렇게하면 연결이 유효하지 않은 것으로 간주되어 제거 될 수 있습니다. 그런 다음 IBM article에 설명 된대로 연결을 다시 시도 할 수 있습니다.

Context ctx = null; 
DataSource dataSource = null; 
Connection conn = null; 
boolean retry = false; 
int numOfRetries = 0; 

do 
{ 
    try 
    { 
    ctx = new InitialContext(); 
    dataSource = (DataSource) ctx.lookup("My Database"); 
    conn = dataSource.getConnection(); 

    // Make sure this connection is valid before continuing 
    // This connection could be from the connection pooled 
    // and the underlying db connection could be closed. 
    if (conn.isValid(5) == false) 
    { 
     throw(new java.sql.SQLException("INVALID_CONNECTION")); 
    } 

    retry = false; 
    } 
    catch (Exception ex) 
    { 
    if (numOfRetries < 2) 
    { 
     retry = true; 
     numOfRetries++; 

     // Sleep for one second before retry 
     Thread.sleep(1000); 
    } 
    else 
    { 
     retry = false; 

     throw (ex); 
    } 
    } 
} while (retry == true); 
1

하나의 응용 프로그램에 대해 동일한 예외가 발생했습니다. websphere 관리 콘솔에서 다음 설정을 지정하여 문제를 없앴습니다.Webphere 응용 프로그램 서버 8.5를 사용하고 있습니다. 다른 옵션에서도 비슷한 옵션을 사용할 수 있어야합니다.

관리 콘솔 -> 리소스는 -> JDBC는 -> 데이터 소스 -> (이 문제를주고 모든 데이터 소스) ->는 WebSphere Application Server에 데이터 소스 속성 -> 확인 검증 새로운 연결 -> 유효성을 확인 풀링 기존 연결 -> 적용 -> 저장 -> 서버 다시 시작

이 접근 방식은 약간의 시간이 소요될 수 있지만 예외가 없어졌습니다.