예외 발생 시 데이터베이스 연결을 닫는 최상의 설계 패턴
저는 자바를 처음 사용합니다(Java 6을 사용하고 있습니다).저는 모든 Java POJO와 서블릿에 대해 아래 디자인 패턴을 사용하여 GlassFish 3.1.2 웹 서버를 통해 Oracle 11G 데이터베이스에 액세스했습니다.
사용 가능한 모든 프로세스(또는 차이점이 무엇인지 확실하지 않은 세션)를 사용하면 간헐적인 데이터베이스 오류(ORA-12519)가 발생하여 애플리케이션에서 프로세스가 해제되지 않는다고 생각하게 됩니다.
아래 디자인 패턴을 보면 예외 발생 시 데이터베이스에 대한 JDBC 연결이 해제되도록 하는 더 나은 방법이 있습니까?예를 들어, 저는 또한 다음과 같이 배치해야 합니다.if ( conn != null) conn.close();
캐치블럭 안의 암호?아니면 더 좋은 디자인의 패턴이 있습니까?어떤 의견이나 힌트라도 미리 감사드립니다.
public String MyFunction() throws Exception {
Connection conn;
CallableStatement cs;
try {
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("jdbc/MyPool");
conn = ds.getConnection();
cs = conn.prepareCall( "{call my_sproc (?)}" );
cs.registerOutParameter(1, Types.VARCHAR);
cs.execute();
String outParam = cs.getString(1);
if ( conn != null ) // close connection
conn.close();
} catch (Exception e) {
outParam = "an error occurred";
}
return outparam;
}
if ( conn != null ) // close connection
conn.close();
이 선에서conn
null일 수 없습니다.자바 6 이전까지 가장 많이 사용된 패턴은 다음과 같습니다.
Connection conn = null;
try {
// initialize connection
// use connection
} catch {
// handle exception
} finally {
if (conn != null) {
try { conn.close(); } catch (Exception e) { /* handle close exception, quite usually ignore */ }
}
}
Java 7을 사용하면 리소스를 사용해 보는 구성이 덜 번거로워질 것입니다.위 코드는 훨씬 짧은 코드로 변경할 수 있습니다.
try (Connection conn = createConnection()) {
// use connection
} catch {
// handle exception
}
// close is not required to be called explicitly
항상 블록을 사용하여 리소스를 확보합니다.
시도 블록이 종료되면 마지막 블록이 항상 실행됩니다.이렇게 하면 예기치 않은 예외가 발생하더라도 최종 블록이 실행됩니다.
try {
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("jdbc/MyPool");
conn = ds.getConnection();
cs = conn.prepareCall( "{call my_sproc (?)}" );
cs.registerOutParameter(1, Types.VARCHAR);
cs.execute();
String outParam = cs.getString(1);
} catch (Exception e) {
outParam = "an error occurred";
}
finally {
conn.close();
}
자바 7은 resources 시도 기능을 지원합니다.당신을 위한 마지막 수단이 될 겁니다http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
마지막 블록은 시도에 할당된 리소스를 닫습니다.마치 당신이 c#에서 키워드를 사용하는 것처럼.
그러나 사용자는 java se6를 사용하고 있습니다...다른 사용자의 옵션 보기 :)
중요: 사용한 문장도 닫아야 합니다.
저는 다음보다 더 우아한 또 다른 방법을 선호합니다.
} finally {
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
/* handle close exception, quite usually ignore */
}
}
}
DbUtils.closeQuiet: http://commons.apache.org/dbutils/apidocs/org/apache/commons/dbutils/DbUtils.html 을 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/11160557/best-design-pattern-to-close-database-connection-when-exception-occurs
'IT' 카테고리의 다른 글
Excel 2007 조건부 포맷 - 셀 컬러를 얻는 방법은? (0) | 2023.09.25 |
---|---|
$.각 () 대 () 루프 - 및 성능 (0) | 2023.09.25 |
VBA로 특정 열을 삭제하는 방법은? (0) | 2023.09.25 |
파이프라인에서 $null을 처리하는 방법 (0) | 2023.09.25 |
콘솔 및 파일 첨부 파일을 사용한 매우 간단한 log4j2 XML 구성 파일 (0) | 2023.09.25 |