IT

예외 발생 시 데이터베이스 연결을 닫는 최상의 설계 패턴

itgroup 2023. 9. 25. 22:34
반응형

예외 발생 시 데이터베이스 연결을 닫는 최상의 설계 패턴

저는 자바를 처음 사용합니다(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

반응형