我在写一个Spring Boot(Batch)应用程序,它应该以特定的退出代码退出。当数据库无法连接时,需要返回退出代码。为什么我的自定义DataSource getConnection()抛出“SQLException:URL不能为空”?
我的方法是通过明确创建DataSource
bean尽早处理此异常,调用getConnection()
并捕获并抛出实现ExitCodeGenerator
的自定义异常。配置如下:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
...
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSourceProperties dataSourceProps() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("spring.datasource")
public DataSource customDataSource(DataSourceProperties props) {
DataSource ds = props.initializeDataSourceBuilder().create().build();
try {
ds.getConnection();
} catch (SQLException e) {
throw new DBConnectionException(e); // implements ExitCodeGenerator interface
}
return ds;
}
...
}
我想重用尽可能多的春天开机自动配置成为可能,这就是为什么我使用@ConfigurationProperties
。我不知道这是否是要走的路。
上DataSourceProperties.getUrl()
调用返回的配置URL(从我的属性文件):
spring.datasource.url=jdbc:oracle:....
但为什么春天引导抛出此异常,当我打电话DataSource.getConnection()
:
java.sql.SQLException: The url cannot be null
at java.sql.DriverManager.getConnection(DriverManager.java:649) ~[?:1.8.0_141]
at java.sql.DriverManager.getConnection(DriverManager.java:208) ~[?:1.8.0_141]
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:308) ~[tomcat-jdbc-8.5.15.jar:?]
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203) ~[tomcat-jdbc-8.5.15.jar:?]
at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:735) ~[tomcat-jdbc-8.5.15.jar:?]
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:667) ~[tomcat-jdbc-8.5.15.jar:?]
at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:482) [tomcat-jdbc-8.5.15.jar:?]
at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:154) [tomcat-jdbc-8.5.15.jar:?]
at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118) [tomcat-jdbc-8.5.15.jar:?]
at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107) [tomcat-jdbc-8.5.15.jar:?]
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:131) [tomcat-jdbc-8.5.15.jar:?]
at com.foo.bar.BatchConfiguration.customDataSource(BatchConfiguration.java:xxx) [main/:?]
...
或者你知道一些更清洁的方式来处理这种情况?
感谢
编辑:春天启动的版本是1.5.4
您是否试图引入杀死应用程序的致命错误? – ryan2049
我尽可能早地检测到失败的数据库连接。 – hellectronic