2012-04-26 2 views
0

가비지 컬렉터에 관한 질문. 데이터베이스 연결을 만들고 databse에서 일부 작업을 수행 한 후 오랜 시간 동안 연결 개체를 사용하지 않으면 가비지 수집기가 연결을 해제 할 수 있습니다. 나는이 연결을 나중에 사용하기를 원한다.데이터베이스 연결에 자바 가비지 컬렉터

EDIT : 확인하려면 웹 연결의 컨텍스트 수준에서 연결을 작성했으면 어떻게됩니까?

+0

당신은 그것을 만들 수 있습니다 정적 –

+0

감사 hardik 빠른 의견, 난 내 연결을 만든 경우 그냥 확인하기위한의 상황에 맞는 레벨에 그러면 webapp은 어떻게됩니까? – NutchUser

+0

나를 따라 반복; GC가 쓰레기를 수집하면 GC가 쓰레기를 수집합니다. 즉, 폐기 된 객체가 아니라 참조하는 객체가 있어야합니다. –

답변

6

개체로 유지하면 Connection 개체에 대한 참조 가비지 수집기가 개체를 절대 건드리지 않고 데이터베이스 연결이 유지됩니다. 여러 스레드에서 사용할 수 없다는 것을 기억하십시오.

반면에 TCP/IP 소켓과 같은 일부 기본 리소스가 너무 길게 열리면 인터럽트가 발생할 수 있습니다.

당신은 가비지 컬렉터에게 것이다 릴리스 연결 및 연결 자체와 관련된 모든 자바 객체를 (덮어 쓰기 또는 null로 설정하여) 연결에 대한 마지막 참조를 느슨하게합니다. 하지만 기본 데이터베이스 연결을 해제하지 않을 것이다, 따라서 당신은 항상 명시 적으로 호출해야합니다 :

connection.close(); 
+0

참고 : 연결을 참조 할 수있는 것은 자체 코드 일뿐만 아닙니다. 예 : 연결 풀에서 관리되는 경우 풀은 수명이 끝날 때까지 강력한 참조를 유지합니다. –

+0

가비지 수집 finalize가 연결을 닫는 드라이버 구현에 따라 달라질 수 있지만 신뢰할 수 없으므로 close를 호출해야합니다. 연결이 너무 오래 유휴 상태 인 경우 일부 드라이버 구현이 시간 초과되어 닫힐 수 있습니다. –

+0

"하지만 기본 데이터베이스 연결을 해제하지는 않습니다", 기본 데이터베이스 연결은 정확히 무엇입니까? –

0

연결을 유지하는 동안 연결이 가비지 수집되지 않습니다. 이론적으로 당신은 당신이 원하는만큼 오랫동안 그것을 계속 사용할 수 있습니다.

0

연결 개체를 더 이상 참조하지 않는 경우 가비지 수집을위한 멤버이지만 gc가 가비지 수집한다는 것을 보장 할 수는 없습니다. 그것은 전적으로 gc에 달려있다.

나중에 사용할 경우 글로벌 개체로 만드는 것이 좋습니다. 따라서 응용 프로그램은 참조를 유지하고 가비지 수집을위한 구성원이되지 않습니다.

+0

가비지 수집에 영향을주지 않습니다. 중요한 것은 연결에 대한 참조가 있는지 여부뿐입니다. 따라서 "connection.createStatement()"를 호출 할 수 있다면 연결이 수집되지 않습니다. – Torben

+0

혼란스러운 점 사과 드리며, 더 이상 언급하지 않으려 고합니다. 편집하겠습니다. 감사합니다 @ torben –

1

간단히 말해서 JVM 가비지 수집 : 사용자 또는 다른 누군가가 객체에 대한 참조를 가지고 있으면 JVM에서이를 가비지 수집 할 수 없습니다. 당신이 그것에 대한 참조가 없다면, JVM은 을 가지고 있지 않아서 그것을 원할 때까지 가비지 수집하지 않습니다.

0

연결에 대한 참조 유형에 따라 다릅니다. 만약 당신이 강력한 참조가 없다면 가비지 수집되지 않을 것이지만 약한 참조가 있다면 그것은 GC를받을 수 있습니다.

정적 또는 인스턴스 수준으로 유지되는 경우 가비지 수집되지 않습니다.

그러나 오래 동안 데이터베이스 연결을 유지하는 대신 (모든 데이터베이스가 연결 수에 제한이 있다고 가정 할 때) 필요할 때마다 해제하고 다시 얻어야합니다.

더 나은 연결 관리를 위해 ConnectionPool 사용을 고려해야합니다.

관련 문제