我正在开发一个使用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" />
答案 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容器将无法启动。