2013-01-14 1 views
10

고객의 요청을 처리하는 웹 서버가 있습니다. 이 웹 서버의 한 구성 요소는 데이터베이스에 대한 연결을 유지합니다.JDBC 연결이 여전히 괜찮은지 확인하는 안전한 방법이 있습니까?

연결을 종료했는지 또는 사용하기 전에 더 이상 작동하지 않는지를 알아야합니다. 현재 나는 다음과 같은 것을합니다 :

// Decide connection details on alias. 
private String alias = null; 
// I must have my own because I prepare statements. 
private Connection connection = null; 

public Connection getConnection() { 
    try { 
    if (connection.isClosed()) { 
     // Start afresh. 
     connection = null; 
    } 
    // ** More tests here to check connection is ok. 
    if (connection == null) { 
     // Make a new connection. 
     connection = Connections.getConnection(alias); 
    } 
    } catch (SQLException ex) { 
    // Cause a NPE further down the line. 
    connection = null; 
    } 
    return connection; 
} 

슬프게도 이것은 때때로 여러 가지 오류 중 하나가 발생하는 부실 연결을 반환합니다. 그러한 모습처럼 :

은 java.sql.SQLException : 이오 예외 : 이것은 단지 기록 된 오류 중 하나입니다

참고 소켓 쓰기 오류 및이 하나에 대한 후 발생 : 소프트웨어 때문에 연결이 중단되었습니다 72 시간 동안 유휴 상태.

내가 찾고있는 것은 연결이 작동되고 안정적인지 지속적으로 알려주는 최소한의 데이터베이스 일반 테스터입니다. 이것이 가능한가?

아주 작은 쿼리를 실행해도 상관 없지만 데이터베이스에 무관심하고 시간/리소스가 거의 필요하지 않습니다.

현재 : Java 5에서 실행 중이므로 Connection.isValid은 해결책이 아닙니다.


나중에이 질문을 방문 당신의 사람들을 위해

추가 - 나는 결국 조언을 제공했다 진짜 연결 풀로 이동 만 할일까요 쉽게 아니었다 그러나 모든의 내 문제가 사라졌습니다.

유일하게 이상한 부분은 연결 풀에서 close 연결을 완료해야한다는 사실을 깨닫는 것입니다. 풀은 닫기를 가로 채서 뒤에서 풀로 반환합니다.

+1

연결을 일상적인 문제로 확인하는 준비가 된 연결 풀과 비교할 때 어떤 점이 있습니까? –

+0

@MarkoTopolnik - 아무것도 - 그런대로 -하지만 나는 이러한 연결에 첨부 된 진술을 준비 했으므로 직접 처리해야합니다. 아니면 내가? – OldCurmudgeon

+1

사실 그것은 준비된 명령문 풀을 사용하여 이러한 풀도 처리해야하는 문제입니다. BTW 내 선택은 * boneCP * 될 것입니다. –

답변

11

오라클의 경우 SELECT 1 또는 SELECT 1 FROM DUAL과 같은 간단한 SQL 문을 사용하는 것이 가장 좋습니다. (공급 업체 특정 구문에 대해서는 데이터베이스를 참조하십시오.)

실패한 경우 연결을 새로 고칩니다. 이것이 바로 WebLogic과 같은 Java EE 애플리케이션 서버가 구성한 경우이를 테스트하는 데 사용됩니다. 연결이 닫히고 여전히 유효하지 않은 경우

+0

일부 응용 프로그램 서버가 이미이 검사를 자동으로 수행한다는 사실 (사용자의 대답에 약간 암시 된 것처럼 보임)을 강조 표시하면이 검사를 자동으로 수행하는 것이 좋습니다. WebSphere가 중요하다. – Isaac

+0

완료 - 고맙습니다. – duffymo

+0

'SELECT 1'은 모든 데이터베이스에 적용됩니까? – OldCurmudgeon

8

java.sql.Connection.isValid(int timeout) 

true를 반환보십시오.

+0

죄송합니다 - 저는 Java 5에서 실행 중임을 명심해야합니다. – OldCurmudgeon

+0

java.sql.Connection.isValid (int timeout) 메서드는'1 1 – JackB

4

모든 데이터베이스에는 기존 테이블에 의존하지 않는 쿼리가 있습니다.

values 1 
+0

'값을 호출합니다. "? 그것은 내가 인식하는 SQL이 아닙니다 ... – duffymo

+1

DB2는이 구문을 사용하여 값 목록에서 ad-hoc 테이블을 작성합니다. 문서에서 'VALUES 문'을 검색하십시오. –

+0

고마워,하지만 나는 DB2를 사용하지 않는다. – duffymo

0

임 내 경우, 나는 자바를 사용 : Oracle의 경우, 많은 다른 데이터베이스의 경우

select 1 from dual 

(MySQL은, H2)를 시도, 시도

select 1 

DB2는 그것의 고유 한 구문이 .sql.Connection.isValid (int timeout) :

getConnection (또는이 예제에서는 getInstance no poll) 메서드가 있습니다.

try { 
    if (connect == null) || ! connect.isValid()) { 
     connect.DriverManager.getConnection(...); 
} catch (SQLException e) { 
    logger.error(...); 
    connect = null; 
} 
return connect; 
+0

이 솔루션을 옵션으로 제공 할 가치는 분명 있지만 isValid는 Java 1.6 이상에서만 사용할 수 있습니다. 전반적으로 - 조언은 * 연결 풀 *에 대한 것입니다. – OldCurmudgeon

관련 문제