2010-02-13 2 views
0

내 자기를 더 잘 설명하는 의사 코드. 나는이 시점에서 자바를 배우고있다. 새로운으로 결과 집합 내가하는 방법이 있다면이 방법을 사용할 필요로메소드에서 새 객체로 반환 될 때 원래 resultSet은 어떻게됩니까?

public resultSet getEverything() 
{  
    resultSet rs = blabla;  
    return rs 
} 

나는 그것이 따라서 나는 그것을 사용, 검색 및 rs.close() 수없는 어쩌면 '가까운'I 몹시 떠들어 대다.

이전 결과 집합은 어떻게됩니까? 가비지 수집기에서 수집 할 수 있습니까? 'new'resultSet을 닫을 때 자체가 닫습니까? 코드 효율성/성능에 어떤 영향을 줍니까?

의견을 보내 주시면 대단히 감사하겠습니다. 내가 생각하기에 자바보다 오히려 OOP 문제가 더 많다. 감사합니다.

답변

1

메소드에서 java.sql.ResultSet을 리턴하면 안됩니다. 항상 객체 또는 데이터 구조로 매핑되고 생성되어야하며 finally 블록에서 생성 된 메소드의 범위에서 닫혀 있어야합니다.

java.sql.ResultSet은 희소 자원 인 데이터베이스 커서와 연관되어 있습니다. 오랫동안 열어 놓고 싶지는 않습니다.

가비지 수집기는 결과 집합, 명령문 또는 데이터베이스 연결을 정리하지 않습니다. 메모리에서 참조를 제거하지만 커서 또는 연결은 여전히 ​​데이터베이스 측에서 열립니다. 그것들을 제대로 닫는 것은 당신의 책임입니다. 그렇지 않으면 공급이 고갈 될 것입니다.

개체, 데이터 구조 또는 CachedRowSet이 올바른 반환 값입니다.

0

여기에는 하나의 resultSet 만 있습니다. 당신은 그것을 만들고 그것을이 메소드에서 리턴한다. 호출 메소드 (getEverything()을 호출하는 메소드)는 이제 그것을 가지고있다. 이 메소드에는 사용자가 작성한 resultSet이있다. 결과 집합은 두 번째 경우

getEverything(); 

:

resultSet rs = getEverything(); 

을 단순히 같은 메소드를 호출 대 :이 같은 - 그것을 닫습니다 그러나 만약 호출하는 방법은 getEverything()의 결과를 할당해야합니다 (즉, 삭제 된) 비공개 가비지 컬렉터가이를 닫을 기회없이 사용할 수있게됩니다.

+0

감사합니다 .. 정말로 분명하게 만들었습니다 :) 다른 한편으로는 duffymo가 그의 답변에서 지적한 점은 흥미 롭습니다 ... 동일한 방법으로 DB에 대한 연결을 닫으면 더 좋습니다. –

관련 문제