我正在开发一个使用 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/