在服务器启动时测试数据库可用

时间:2014-01-16 17:00:16

标签: java mysql spring hibernate startup

我正在开发一个使用Hibernate的Spring webapp。目前,如果我的MySQL数据库不可用(例如,根本没有启动),则服务器正常启动,并在第一次触发Hibernate查询时抛出异常。

有没有办法在服务器启动时检查数据库可用性?

这是我当前的applicationContext:

<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" />

2 个答案:

答案 0 :(得分:1)

您可以创建一个简单的bean,用于验证在设置所有属性后调用的方法中的dataSource。这可以通过@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 :(得分:1)

我不知道是否有更简单的方法,但您可以创建ServletContextListener并从contextInitialized()运行测试查询。如果存在任何未捕获的异常,则servlet容器将无法启动。