c3p 0 의 DEBUG--CLOSE BY CLIENT STACK TRACE

프로젝트 는 C3P 0 데이터베이스 연결 탱크 를 사용 합 니 다.최근 에 Exception 을 발 견 했 습 니 다.
java.lang.Exception: DEBUG -- CLOSE BY CLIENT STACK TRACE at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:566) at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470) at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964) at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
이 이상 이 시스템 운행 에 아무런 영향 을 미 치지 않 았 다 는 것 을 발견 하지 못 했 습 니 다.인터넷 에서 도 debug 등급 의 로 그 를 끄 면 됩 니 다.확실히 debug 등급 에 놓 인 이상 은 중요 한 이상 이 아 닙 니 다!하지만 호기심 때문에 그 경 위 를 알 고 싶 어 하 는 것 을 멈 출 수 없다!
그래서 인터넷 에서 아래 의 일 지 를 검색 하여 많은 이익 을 얻 고 여러분 에 게 공유 하 며 작가 에 게 감 사 를 드 립 니 다.
원본 주소:http://hi.baidu.com/xhr8334/item/7e5a6f5326aa02d5d48bacca
한 무리의 친구 들 이 무리 속 에서 나 에 게 한 문 제 를 물 었 다.
NewPooledConnection - closed by a client. java.lang.Exception: DEBUG -- CLOSE BY CLIENT STACK TRACE at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:566) at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyRe source(C3P0PooledConnectionPool.java:470) at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:96 4) at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.ja va:547) C3P0PooledConnectionPool - Successfully destroyed PooledConnection: com.mchange.v2.c3p0.impl.NewPool
나 는 그 DEBUG 를 보 았 다.나 는 디 버 깅 정보 라 고 말 했다.LOG4J 의 등급 을 수정 하면 된다.
이 친구 들 은 성공 한 이상 왜 이상 한 짓 을 하 느 냐 고 이해 하지 못 한다.
여기 서 두 가지 상업 개발 의 원칙 문 제 를 말 할 수 밖 에 없다.
첫째,위 에서 들 어 온 데 이 터 를 엄 격 히 걸 러 내 고 아래 에 전 달 된 데 이 터 를 자세히 검사 합 니 다.
둘째,이상 을 합 리 적 으로 사용한다.
첫 번 째 는 사실 간단 하 다.모듈 화 개발 의 사상 문제 다.자신의 행위 에 대해 책임 을 지다.전단 에서 되 돌아 오 는 데이터 가 무엇 인지 검증 이 필요 합 니 다.불합격 제거 나 수정.합격 처 리 를 마 친 후에 도 소문 이 나 기 전에 합격 여 부 를 검증 해 야 한다.
구체 적 으로 이 문제 에 서 는 Spring 에서 데이터 원본 에 관 한 설정 파일 입 니 다.

//데이터 원본 관련 정보 설정 생략

이 프로필 에는 두 가지 정보 가 매우 유용 하 다.하 나 는 클 라 스,하 나 는 destroy-method.쉽게 말 하면 하 나 는 데이터 소스 의 실현 류 이 고 하 나 는 분석 방법 이다.Spring 은 이 프로필 을 읽 은 후에 이러한 정보 에 따라 일부 종 류 를 예화 한 다음 에 내부 에서 중간 에 있 는 설정 정보 에 따라 데이터 원본 을 실제 구성 해 야 합 니 다.예 를 들 면 username 같은 거.
근 데 문제 가 생 겼 어 요.이곳 의 ComboPooledDataSource 데이터 원본 이 반드시 사용 가능 할 것 이 라 고 보장 할 수 없고 close 방법 이 반드시 연결 을 닫 을 수 있 을 것 이 라 고 보장 할 수 없습니다.그 렇 죠?Spring 자 체 는 이러한 종류의 실제 효과 가 있 는 지 검사 할 수 없고 bug 가 없습니다.사실 검사 도 못 해 요.마찬가지 로 close 방법 이 효과 가 있 는 지 검사 도 필요 하 다.이것 이 바로 내 가 방금 말 한 것 으로,위의 데이터 에 대한 엄격 한 검사 이다.
그래,어떻게 검사 하지?가장 간결 한 방법 은 실제 구조,연결 탱크,데이터 베이스 연결 을 얻 고 테스트 문 구 를 실행 한 다음 에 연결 을 닫 는 것 이다.모든 것 이 성공 한다 면 OK.그 테스트 문구 에 대해 WebSphere 데이터 원본 을 설정 한 학생 들 은 기억 하 십 니까?데이터 원본 설정 에 기본적으로 쓰 이 는 SQL 문 구 는'SELECT 1 FROM TABLE'입 니 다.응,맞 아.이게 바로 테스트 문구 야.
이 절 차 는 통 하고 순조롭게 진행 할 수 있다.그러면 자신의 능력 범위 내 에서 이 데이터 소스 와 연결 탱크 는 사용 할 수 있다 고 말 할 수 있다.그렇지?
여기에 지식 하 나 를 보충 하 다.java.sql.Connection,이 건 class 가 아니 라 interface 입 니 다.
public interface Connection extends Wrapper 。
모든 JDBC 데이터베이스 연결 의 실현 클래스 는 이 인터페이스의 모든 방법 을 실현 해 야 한다.예컨대API 에서 설명 하 는 것 은 이것 을 즉시 방출 하 는 것 입 니 다.  Connection  대상 의 데이터베이스 와 JDBC 자원 이 자동 으로 방출 되 기 를 기다 리 는 것 이 아 닙 니 다.
자바 에 익숙 한 학생 들 은 한 가 지 를 기억 해 야 한다.규범 에서 요구 하 는 것 은 인터페이스의 실현 류 가 반드시 인 터 페 이 스 를 실현 해 야 하 는 모든 방법 이다.하지만 이 말 은 또 하나의 의미 가 있다.그것 은 모든 방법 을 실현 하 는 것 외 에 몇 가지 방법 을 더 쓸 수 있다 는 것 이다.아무 도 너 를 상관 하지 않 을 것 이다.
아하,그럼 의문 이 군.API 는 close 가 연결 을 닫 고 자원 을 방출 하도록 규정 하고 있 지만하지만 이것 은 단지 너의 인터페이스의 바람 일 뿐이다.아마도 사람들 이 업 체 를 실현 하 는 것 은 close 방법 이 멋 있 지 않다 고 생각 할 것 이 며,close Connection 으로 바 꿔 야 한다.그럼...Spring 은 어 리 석 은 단추 제거 close 방법 으로 연결 을 닫 을까요?비록 이 방법 은 반드시 실현 되 어야 하지만,반드시 내용 이 있어 야 한다 고 말 한 것 은 아니다.빈 방법 이 라면?
그래서 destroy-method 라 는 설정 항목 이 나 타 났 습 니 다.Spring 이 말 했 습 니 다.괜 찮 습 니 다.어르신 께 서 어느 것 이 시원 한 지 저 에 게 알려 주시 면 됩 니 다.
이제 테스트 끝 났 습 니 다.모든 것 이 성공 했다.
이제 두 번 째 문 제 를 살 펴 보 자.이상 을 합 리 적 으로 사용 하 다.
또 하나의 문제 에 봉착 했다.테스트 에 성 공 했 으 니 사용자 에 게 설명 을 해 야 하지 않 겠 습 니까?설마 테스트 에 성공 하고 큰 돈 을 벌 었 단 말 인가?안 어 울 리 잖 아.생각해 보 세 요.당신 은 프로그래머 입 니 다.그리고 버튼 을 눌 러 서 테스트 를 했 습 니 다.결 과 는 사실 테스트 에 성 공 했 지만 시스템 은 아무런 움직임 도 주지 않 았 다.그리고 너 는 바보 같이 바보 같이 기다 리 며 하늘 과 땅 이 늙 을 때 까지 기 다 렸 다..........................................................만약 당신 이 한 시간 을 기 다 려 도 움직임 이 보이 지 않 고,사람 이 죽지 않 으 면 시체 가 보이 지 않 는 다 면,당신 은 어머니 를 욕 할 수 있 습 니까?
그러면 어떻게 통지 해야만 반드시 유효 하 다 고 보장 할 수 있 습 니까?println?이것 은 반드시 볼 수 있 는 것 은 아니다.다른 사람 도 동시에 정 보 를 출력 할 수 있 기 때문에 단번에 지 워 버 렸 다.그러면 어떤 친구 가 말 했 습 니 다.잠시 멈 추 는 것 이 좋 겠 습 니 다.제 가 수출 한 후에 멈 추고 움 직 이지 않 겠 습 니 다.
응,좋아.
여러분 생각해 보 세 요.많은 물건 을 수출 한 후에 이 프로그램 은 움 직 이지 않 고 계속 실행 하지 않 습 니 다.이것 은 무엇 입 니까?
이상 하 잖 아!
프로그래머 만 이 이 정 보 를 볼 수 있다 는 것 을 보증 할 수 있다.예 를 들 어 테스트 성공 이다.이것 이 바로 스프링 이 이런 방식 으로 통지 해 야 하 는 이유 다.
여 기 는 요?저 는 학생 들 의 습관 이 자 연 스 러 운 생각 으로 바 뀌 고 싶 습 니 다.이상 하 게 도 반드시 나 쁜 소식 을 알 리 는 것 은 아니다.이상 은 이상 입 니 다.원 하신 다 면 코드 가 실 행 될 때 throws 하나의 Exception 을 사용 할 수 있 습 니 다.이상 은 비교적 격렬 한 통지 방식 에 불과 하 다.그 가 없 는 것 은 단지 이것 뿐이다.
지금 또 문제 가 생 겼 다.테스트 를 하려 면 여기까지 실 행 될 때마다 테스트 를 해 봐 야 한다.그럼...설마 여기 걸 려 서 안 가 는 거 야?더 안 어 울 리 는데.
로그 4J 를 잘 아 는 친구 들 이 알 아 봤 을 거 예요.로그 4J 가 출력 한 로그 예요.이런 로 그 는 개발 기간 에 만 존재 해 야 하 며 발표 기간 에 존재 해 서 는 안 된다 는 것 이 분명 하 다.개발 기간 에 데이터 베 이 스 를 많이 바 꾸 었 기 때 문 입 니 다.예 를 들 어 표를 바 꾸 거나 데이터 베 이 스 를 바 꾸 는 것 입 니 다.그래서 사용자 에 게 성공 여 부 를 알려 야 합 니 다.그러나 제품 이 개발 되 고 정식 적 으로 발표 되면 이런 정 보 는 다시 나타 나 서 는 안 된다.상업 화 운영 의 응용 은 함부로 배치 하 는 것 을 허락 하지 않 기 때문이다.그렇지?
그래서 log4J 가 방법 을 제 공 했 습 니 다.메시지 수준.인 포 는 이 이상 을 볼 수 없다.실현 하기 도 쉽 습 니 다.catch 가 되 었 습 니 다.그리고 아무런 처리 도 하지 않 습 니 다.즉,빈 catch 블록 입 니 다.
구체 적 으로 실 현 될 때 catch 에서 판단 할 수 있 으 며,등급 이 INFO 라면 아무것도 하지 않 는 다.만약 그렇지 않다 면 규칙 에 따라 해라.
'이상 을 합 리 적 으로 사용한다'는 말 과 결합 하면 이상 을 던 져 야 할 때 던 져 야 한 다 는 것 이다.던 질 필요 가 없 을 때 는 던 지지 않 는 다.프로그래머 에 게 필요 할 때 이상 한 정 보 를 보 는 것 이 가장 적합 하 다.
이상 한 사용 에 대해 서 는 말 을 전개 하지 않 겠 습 니 다.관심 있 는 학생 은 임 예 박사의 고 품질 자바 프로 그래 밍 을 참조 할 수 있다.

좋은 웹페이지 즐겨찾기