java - 服务器启动时测试数据库可用性

标签 java mysql spring hibernate startup

我正在开发一个使用 Hibernate 的 Spring Web 应用程序。目前,如果我的 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" />

最佳答案

您可以创建一个简单的 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
    }
  }

}

关于java - 服务器启动时测试数据库可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21168092/

相关文章:

Java future : get the time per request

java - 使用正则表达式限制文本框

php - MySQL 表有 4,000,000 条记录?

mysql - 如何查找某一列的所有值都相同的行?

php - 跳过获取表中不需要的数据

java - TomEE 中的 Spring JDBCTemplate 偶尔出现 "Failed to validate a newly established connection"SQL 异常

java - 在 Java 中存储用户凭据的推荐做法是什么?

Java Swing 绝对坐标

java - Spring RestTemplate 使用自定义 header 和请求对象发布请求

java - .iterator() 调用上的空指针异常