가비지 컬렉터에 관한 질문. 데이터베이스 연결을 만들고 databse에서 일부 작업을 수행 한 후 오랜 시간 동안 연결 개체를 사용하지 않으면 가비지 수집기가 연결을 해제 할 수 있습니다. 나는이 연결을 나중에 사용하기를 원한다.데이터베이스 연결에 자바 가비지 컬렉터
EDIT : 확인하려면 웹 연결의 컨텍스트 수준에서 연결을 작성했으면 어떻게됩니까?
가비지 컬렉터에 관한 질문. 데이터베이스 연결을 만들고 databse에서 일부 작업을 수행 한 후 오랜 시간 동안 연결 개체를 사용하지 않으면 가비지 수집기가 연결을 해제 할 수 있습니다. 나는이 연결을 나중에 사용하기를 원한다.데이터베이스 연결에 자바 가비지 컬렉터
EDIT : 확인하려면 웹 연결의 컨텍스트 수준에서 연결을 작성했으면 어떻게됩니까?
을 개체로 유지하면 Connection
개체에 대한 참조 가비지 수집기가 개체를 절대 건드리지 않고 데이터베이스 연결이 유지됩니다. 여러 스레드에서 사용할 수 없다는 것을 기억하십시오.
반면에 TCP/IP 소켓과 같은 일부 기본 리소스가 너무 길게 열리면 인터럽트가 발생할 수 있습니다.
당신은 가비지 컬렉터에게 것이다 릴리스 연결 및 연결 자체와 관련된 모든 자바 객체를 (덮어 쓰기 또는 null
로 설정하여) 연결에 대한 마지막 참조를 느슨하게합니다. 하지만 기본 데이터베이스 연결을 해제하지 않을 것이다, 따라서 당신은 항상 명시 적으로 호출해야합니다 :
connection.close();
참고 : 연결을 참조 할 수있는 것은 자체 코드 일뿐만 아닙니다. 예 : 연결 풀에서 관리되는 경우 풀은 수명이 끝날 때까지 강력한 참조를 유지합니다. –
가비지 수집 finalize가 연결을 닫는 드라이버 구현에 따라 달라질 수 있지만 신뢰할 수 없으므로 close를 호출해야합니다. 연결이 너무 오래 유휴 상태 인 경우 일부 드라이버 구현이 시간 초과되어 닫힐 수 있습니다. –
"하지만 기본 데이터베이스 연결을 해제하지는 않습니다", 기본 데이터베이스 연결은 정확히 무엇입니까? –
연결을 유지하는 동안 연결이 가비지 수집되지 않습니다. 이론적으로 당신은 당신이 원하는만큼 오랫동안 그것을 계속 사용할 수 있습니다.
연결 개체를 더 이상 참조하지 않는 경우 가비지 수집을위한 멤버이지만 gc가 가비지 수집한다는 것을 보장 할 수는 없습니다. 그것은 전적으로 gc에 달려있다.
나중에 사용할 경우 글로벌 개체로 만드는 것이 좋습니다. 따라서 응용 프로그램은 참조를 유지하고 가비지 수집을위한 구성원이되지 않습니다.
가비지 수집에 영향을주지 않습니다. 중요한 것은 연결에 대한 참조가 있는지 여부뿐입니다. 따라서 "connection.createStatement()"를 호출 할 수 있다면 연결이 수집되지 않습니다. – Torben
혼란스러운 점 사과 드리며, 더 이상 언급하지 않으려 고합니다. 편집하겠습니다. 감사합니다 @ torben –
간단히 말해서 JVM 가비지 수집 : 사용자 또는 다른 누군가가 객체에 대한 참조를 가지고 있으면 JVM에서이를 가비지 수집 할 수 없습니다. 당신이 그것에 대한 참조가 없다면, JVM은 에을 가지고 있지 않아서 그것을 원할 때까지 가비지 수집하지 않습니다.
연결에 대한 참조 유형에 따라 다릅니다. 만약 당신이 강력한 참조가 없다면 가비지 수집되지 않을 것이지만 약한 참조가 있다면 그것은 GC를받을 수 있습니다.
정적 또는 인스턴스 수준으로 유지되는 경우 가비지 수집되지 않습니다.
그러나 오래 동안 데이터베이스 연결을 유지하는 대신 (모든 데이터베이스가 연결 수에 제한이 있다고 가정 할 때) 필요할 때마다 해제하고 다시 얻어야합니다.
더 나은 연결 관리를 위해 ConnectionPool 사용을 고려해야합니다.
당신은 그것을 만들 수 있습니다 정적 –
감사 hardik 빠른 의견, 난 내 연결을 만든 경우 그냥 확인하기위한의 상황에 맞는 레벨에 그러면 webapp은 어떻게됩니까? – NutchUser
나를 따라 반복; GC가 쓰레기를 수집하면 GC가 쓰레기를 수집합니다. 즉, 폐기 된 객체가 아니라 참조하는 객체가 있어야합니다. –