현재 Java 응용 프로그램을 작성 중입니다. 독립 클라이언트이며 Spring
및 Hibernate
입니다. 또한 C3P0
.
이전 버전에서는 데이터베이스 연결에 표준 사용자 (구성 파일에 하드 코드 된)를 사용했지만 이제는 모든 사용자가 자신의 자격 증명을 제공해야합니다.
데이터베이스 코드가있는 빈은 기본적으로 필요에 따라 작성됩니다.
XML 파일을 변경하고 자격 증명과 일부 연결 설정을 설정하는 포스트 프로세서를 추가했습니다. 지금과 비슷하게 보입니다 :봄과 최대 절전 모드로 데이터베이스 연결 테스트
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();
configurer = new PropertyPlaceholderConfigurer();
// properties are retrieved from a private method
configurer.setProperties(getProperties());
context.addBeanFactoryPostProcessor(configurer);
context.setConfigLocations(new String[] { "first.xml","second.xml" });
context.refresh();
return context.getBean("myClass", MyClass.class);
이 모든 것이 예상대로 작동하지만 지금은 내가 붙어있는 부분에 도달합니다.
연결에 대한 테스트 기능을 제공하여 사용자가 버튼을 클릭 한 다음 자격 증명이 수락되었는지 여부를 알려주고 싶습니다.
첫 번째 아이디어는 데이터베이스에서 간단한 선택을하는 것이 었습니다. 그러나 로그를 살펴보면 Spring이 refresh()
(또는 빈의 인스턴스화) 중에 데이터베이스에 연결하려고 시도한다는 사실을 알게되었습니다. 로그에서 예외를 볼 수 있습니다 (예 :
). java.sql.SQLException: Connections could not be acquired from the underlying database!
불행히도 Spring은 실제로 신경 쓰지 않습니다. 예외는 로그 아웃되지만 refresh()
이 끝나고 이것 때문에 예외가 발생하지 않습니다. 나는 단순히 예외를 잡을 수 있기를 바랬다. 그런 다음 연결이 실패했다는 것을 알았다.
필자는 계획대로 선택을 할 수 있지만 가능한 한 많이 연결을 제한하려고합니다. 데이터베이스 서버가 여러 번 시도한 후에 사용자를 차단하기 때문입니다. 연결 풀에 대한 설정을 변경하기 전에 영구적으로 많은 시도가있었습니다 (이미 재미 있었음).
이 문제와 관련한 내 검색은 거의 없습니다. 어떻게 든 예외를 얻을 수있는 방법이 있습니까? 또는 Spring은 인스턴스화/새로 고침 중 연결 오류에 대해 알려주는 API를 제공합니까?
대체 방법에 대한 아이디어가 없습니까? 가급적이면 연결이 가능한지 여부를 판별하기위한 하나의 시도 만 필요합니다.
편집 : 관심있는 사람 : Santosh의 제안에 따라 JDBC
에 연결 테스트를 구현했습니다.
빈 인스턴스 생성 중에 발생한 데이터베이스 오류/예외를 사용하는 쉬운 방법이없는 것 같습니다.
답장을 보내 주셔서 감사합니다. 필자는 이미 순수한 JDBC를 사용하는 것을 고려해 봤으며 그것은 나의 백업 계획의 일종이다. 나는 더 짧고 우아한 해결책이 있기를 바랐다.
연결 매개 변수를 쉽게 사용할 수 없으므로 (자격 증명 제외) XML 파일에 저장되므로 추가 코드가 필요합니다. 그러나 적어도 그것은 완전히 통제 할 수있는 것이 사실입니다. –