2012-09-03 3 views
1

현재 Java 응용 프로그램을 작성 중입니다. 독립 클라이언트이며 SpringHibernate입니다. 또한 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에 연결 테스트를 구현했습니다.
빈 인스턴스 생성 중에 발생한 데이터베이스 오류/예외를 사용하는 쉬운 방법이없는 것 같습니다.

답변

1
  1. 찾고있는 기능의 종류는 봄 + 최대 절전 모드를 사용하여 달성하기가 매우 까다 롭습니다.
  2. 연결 속성은 세션 팩토리 수준에서 설정되며 자격 증명이 잘못된 경우 세션 팩터 리는 인스턴스화되지 않습니다.
  3. @Bozo가 그의 answer here에서 인용. 당신이 할 수있는 일

    LocalSessionFactoryBean을 확장하고 getObject() 메소드를 오버라이드 (override)하고는 sessionFactory에가 null의 경우, ( java.lang.reflect.Proxy 또는 CGLIB /와 Javassist를 통해) 프록시를 반환 할 수 있습니다.그러면 SessionFactory이 주입됩니다. 프록시는 SessionFactory에 대한 참조를 보유해야하며, 은 처음에는 null입니다. 프록시에 연결하라는 메시지가 표시 될 때마다 의 sessionFacotry가 여전히 null이면 buildSessionFactory() (LocalSessionFactoryBean)을 호출하고 위임합니다. 그렇지 않으면 을 예외로 설정하십시오.

  4. 간단하고 기초적인 접근 방식 ClassPathXmlApplicationContext를 작성하기 전에, 단순히 원시 JDBC 호출을 사용하여 연결을 얻으려고 특징으로있다 (그리고 물론 대신 전류 의 새 공장 빈지도). 성공하면 계속 진행하거나 적절한 메시지를 사용하십시오.

  5. 여기에서 연결 시도를 제한 할 수 있습니다.
+0

답장을 보내 주셔서 감사합니다. 필자는 이미 순수한 JDBC를 사용하는 것을 고려해 봤으며 그것은 나의 백업 계획의 일종이다. 나는 더 짧고 우아한 해결책이 있기를 바랐다.
연결 매개 변수를 쉽게 사용할 수 없으므로 (자격 증명 제외) XML 파일에 저장되므로 추가 코드가 필요합니다. 그러나 적어도 그것은 완전히 통제 할 수있는 것이 사실입니다. –

관련 문제