2014-01-16 2 views
0

최대 절전 모드를 사용하는 Spring webapp을 개발 중입니다. 현재 MySQL 데이터베이스를 사용할 수없는 경우 (예를 들어 단순히 시작되지 않은 경우) 서버가 정상적으로 시작되고 Hibernate 쿼리가 처음 트리거 될 때 예외가 발생합니다.서버 시작시 데이터베이스 가용성 테스트

서버 시작시 데이터베이스 가용성을 확인하는 방법이 있습니까?

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" 
    p:driverClassName="${jdbc.driver}" 
    p:url="${jdbc.url}" 
    p:username="${jdbc.user}" 
    p:password="${jdbc.password}" 
    p:maxActive="${dbcp.maxActive}" 
    p:maxIdle="${dbcp.maxIdle}" 
    p:maxWait="${dbcp.maxWait}" /> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 
    p:dataSource-ref="dataSource" 
    p:packagesToScan="com.myapp.data.domain"> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
      <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> 
      <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop> 
     </props> 
    </property> 
</bean> 

<bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
    p:sessionFactory-ref="sessionFactory" /> 

<tx:annotation-driven transaction-manager="hibernateTransactionManager" /> 
+0

간접적 인 방법을 확인할 수는 있지만 직접적인 방법은 아닐 것이라고 생각합니다. –

답변

1

당신은 모든 속성을 설정 한 후 호출되는 방법에 dataSource의 유효성을 확인하는 간단한 빈을 만들 수 있습니다

여기에 내 현재의 ApplicationContext이다. 이는 @PostConstruct 주석을 사용하거나 InitializingBean을 구현하여 가능합니다. 주석이는 다음과 같습니다

@Compontent 
public class DataSourceValdationBean { 

    private DataSource dataSource; 

    @Autowire 
    public void setDataSource(DataSource dataSource) { 
    this.dataSource = dataSource; 
    } 

    @PostConstruct 
    public void validateDataSource() { 
    try { 
     Connection c = dataSource.getConnection(); 
     Statement s = c.createStatement(); 
     s.excuteQuery("SELECT 1"); // you have to change this depending on your DBMS 
    } catch (SQLException | SQLTimeoutException e) { 
     // log error and throw exception 
    } 
    } 

} 
1

쉬운 방법이 있는지 모르겠지만, 당신이 ServletContextListener을 만들고 contextInitialized()에서 테스트 쿼리를 실행할 수 있습니다. 검색되지 않은 예외가 있으면 서블릿 컨테이너가 시작되지 않습니다.

+0

나는 그가 질문에서 똑같은 말을하고 대답을 요청했다고 생각합니다. – ashokramcse

관련 문제