programing

풀의 JDBC 접속 닫기

kingscode 2023. 2. 1. 22:08
반응형

풀의 JDBC 접속 닫기

JDBC를 사용하기 위한 표준 코드 섹션은...

Connection conn = getConnection(...);
Statement  stmt = conn.conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
                                                ResultSet.CONCUR_READ_ONLY);
ResultSet  rset = stmt.executeQuery (sqlQuery);

// do stuff with rset

rset.close(); stmt.close(); conn.close();

질문 1: Connection Pool을 사용할 때는 마지막에 Connection을 닫아야 합니까?그렇다면 풀링의 목적이 상실된 것은 아닐까요?그렇지 않은 경우, DataSource는 Connection의 특정 인스턴스가 해방되어 재사용 가능한 시기를 어떻게 알 수 있습니까?이건 좀 헷갈리네요. 조언해 주셔서 감사합니다.

질문 2: 다음 방법은 표준에 가깝습니까?풀에서 연결을 시도하고 DataSource를 설정할 수 없는 경우 오래된 DriverManager를 사용합니다.런타임에 어떤 부품이 실행되는지조차 알 수 없습니다.위의 질문을 반복하면서 이러한 방법으로 나오는 Connection을 종료해야 합니까?

synchronized public Connection getConnection (boolean pooledConnection)
                                                        throws SQLException {
        if (pooledConnection) {
                if (ds == null) {
                        try {
                                Context envCtx = (Context)
                                        new InitialContext().lookup("java:comp/env");
                                ds = (DataSource) envCtx.lookup("jdbc/NamedInTomcat");
                                return ds.getConnection();
                        } catch (NamingException e) {
                                e.printStackTrace();
                }}
                return (ds == null) ? getConnection (false) : ds.getConnection();
        }
        return DriverManager.getConnection(
                "jdbc:mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord);
}

편집: 스택 트레이스가 표시되지 않기 때문에 풀링된 접속을 얻을 수 있다고 생각합니다.

Connection Pool을 사용할 때는 마지막에 Connection을 닫아야 합니까?그렇다면 풀링의 목적이 상실된 것은 아닐까요?그렇지 않은 경우, DataSource는 Connection의 특정 인스턴스가 해방되어 재사용 가능한 시기를 어떻게 알 수 있습니까?이건 좀 헷갈리네요. 조언해 주셔서 감사합니다.

네, 물론 풀링된 연결도 닫아야 합니다.실제 연결고리를 감싸는 겁니다.덮개 아래에서 풀장과의 실제 연결이 해제됩니다.실제 연결이 실제로 닫힐지 또는 새 연결을 위해 재사용될지는 풀에 따라 결정됩니다.getConnection()따라서 접속 풀을 사용하고 있는지 여부에 관계없이 항상 모든 JDBC 리소스를 역순으로 닫아야 합니다.finally의 블록try차단할 수 있습니다.Java 7에서는 스테이트먼트를 사용하여 이를 더욱 단순화할 수 있습니다.


다음 방법은 규격에 가까운 것입니까?풀에서 연결을 시도하고 DataSource를 설정할 수 없는 경우 오래된 DriverManager를 사용합니다.런타임에 어떤 부품이 실행되는지조차 알 수 없습니다.위의 질문을 반복하면서 이러한 방법으로 나오는 Connection을 종료해야 합니까?

그 예는 꽤 무섭다..DataSource응용 프로그램 전체 DB 구성 클래스의 일부 생성자/초기화에서 응용 프로그램 시작 중에 한 번만 사용할 수 있습니다. 그냥 요.getConnection()동일한 데이터 소스로 처리됩니다.늘체크

다음 항목도 참조하십시오.

풀은 일반적으로 랩된 Connection 개체를 반환합니다.여기서 close() 메서드는 덮어쓰며 일반적으로 Connection을 풀로 되돌립니다.close()를 호출하는 것은 정상이며, 아마도 여전히 필요합니다.

close() 메서드는 다음과 같습니다.

public void close() throws SQLException {
  pool.returnConnection(this);
}

두 번째 질문에서는 하단 블록이 실행되는지 여부를 나타내는 로거를 추가할 수 있습니다.데이터베이스 접속의 설정에는 어느 쪽인가 밖에 하고 싶지 않다고 생각합니다.데이터베이스 액세스에는 풀만 사용합니다.어느 쪽이든 누출을 방지하기 위해 연결부를 닫는 것이 매우 중요합니다.

실제로 접속 관리를 위한 최선의 접근법은 어느 코드에 대해서도 이들을 배제하지 않는 것입니다.

연결을 열고 닫는 유일한 위치인 SQLExecutor 클래스를 만듭니다.

그러면 응용 프로그램의 나머지 부분 전체가 풀에서 연결을 끊고 모든 부분을 관리(또는 잘못 관리)하는 대신 실행자에게 문장을 펌프합니다.

실행자의 인스턴스는 원하는 수만큼 가질 수 있지만 연결을 열고 닫는 코드를 사용자가 직접 작성해서는 안 됩니다.

또한 이를 통해 단일 코드 집합에서 모든 SQL을 기록할 수 있습니다.

언급URL : https://stackoverflow.com/questions/4938517/closing-jdbc-connections-in-pool

반응형