2012-05-26 3 views
0

나는 오라클의 데이터베이스에 연결하려면 다음 코드를 사용 :각 쿼리에 대해 데이터베이스에 연결해야합니까?

Connection conn = null; 
Statement stmt = null; 
ResultSet rset = null; 
String jdbc_url = "jdbc:oracle:thin:hr/[email protected]:1521:XE"; 
String query = ""; 
try { 
    DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); 
    conn = DriverManager.getConnection(jdbc_url); 
    stmt = conn.createStatement(); 
    query = "select username " + " from users "; 
    rset = stmt.executeQuery(query); 

    // my codes 

} catch (SQLException sqle) { 
    System.out.println("result error, " + e.getMessage()); 
} catch (NumberFormatException nfe) { 

} finally { 
    try { 
     rset.close(); 
     stmt.close(); 
     conn.close(); 

    } catch (Exception e) { 
     System.out.println("Error in closing " + e.getMessage()); 
    } 
} 

나는 내가 원하는 모든 쿼리 있도록 모든 행동이 코드를 사용해야합니까? 연결하고 종료 하시겠습니까? 매번?

+0

이 서버 측 또는 클라이언트 측 코드인가? – Puce

+0

연결 풀을 사용하는 것이 좋습니다. Oracle 드라이버에는 사용할 수있는 연결 풀이 있습니다. 반면에이 데이터 소스의 공유 정적 변수를 구현하거나 싱글 톤 디자인 패턴을 사용할 수 있습니다. –

답변

1

매번 연결할 필요가 없습니다. 매번 결과 집합과 문을 닫아야합니다. 좋은 DB 랩퍼 클래스의 예는 this answer을 참조하십시오.

Connection을 생성자에서 초기화 된 클래스 변수로 만들 수 있습니다. 다음과 같은 내용 :

public class DbWrapper { 
    private Connection conn = null; 
    String jdbc_url="jdbc:oracle:thin:hr/[email protected]:1521:XE"; 

    public DbWrapper() { 
     conn=DriverManager.getConnection(jdbc_url); 
    } 

    public Arraylist<User> getUsers() { 
     ... 
    } 
} 
0

풀링 된 연결/DataSource를 사용하는 것이 좋습니다.

하나의 DataSource 인스턴스는 하나의 작업 단위이며 작업 단위 (UOW)가 완료되면 닫아야합니다 (그러나 풀링 된 연결을 사용하는 경우 DB 연결을 닫지는 않습니다).

또한 상위 JPA를 사용하는 것을 고려하십시오.

0

응용 프로그램이 Tomcat, GlassFish와 같은 서버에서 실행되는 가장 좋은 방법은 JNDI을 사용하여 연결하는 것입니다. 그렇지 않으면 Oracle JDBC 드라이버를 사용 중이므로 OracleDataSource 클래스를 사용할 수 있습니다.

Connection 개체를 얻으려면 Singleton design pattern을 구현할 수 있습니다. 간단한 방법은 Java enumerations을 사용하는 것입니다. 이와

enum DBEnum { 
    ORACLE_XE { 
     private DataSource ds = initDataSource(); 
     private DataSource initDataSource() { 
      try { 
       OracleDataSource ds = new OracleDataSource(); 
       ds.setDriverType("thin"); 
       ds.setServerName("localhost"); 
       ds.setPortNumber(1521); 
       ds.setDatabaseName("XE"); // Oracle SID 
       ds.setUser("Herong"); 
       ds.setPassword("TopSecret"); 
       return ds; 
      } catch (Exception e) { 
       throw new RuntimeException(e); 
      } 
     } 
     @Override 
     public Connection getConnection() throws SQLException { 
      return ds.getConnection(); 
     } 
    }; 
    public abstract Connection getConnection() throws SQLException; 
} 

그리고 당신은 당신의 코드를 변경합니다 :

Connection conn = null; 
Statement stmt = null; 
ResultSet rset = null; 
String query = ""; 
try { 
    conn = DBEnum.ORACLE_XE.getConnection(); 
    stmt = conn.createStatement(); 
    query = "select username " + " from users "; 
    rset = stmt.executeQuery(query); 

    // my codes 

} catch (SQLException sqle) { 
    System.out.println("result error, " + e.getMessage()); 
} catch (NumberFormatException nfe) { 

} finally { 
    try { 
     rset.close(); 
     stmt.close(); 
     conn.close(); 

    } catch (Exception e) { 
     System.out.println("Error in closing " + e.getMessage()); 
    } 
} 
관련 문제