我希望能够利用Spring Boot数据源自动配置。但是,它并不支持我使用的所有功能,特别是logValidationErrors
。
spring:
datasource:
driverClassName: oracle.jdbc.OracleDriver
url: jdbc:jtds:sqlserver://111.11.11.11/DataBaseName
username: someuser
password: somepass
testOnBorrow: true
testWhileIdle: true
validationQuery: select /* validationQuery */ 1 from dual
minEvictableIdleTimeMillis: 1000
validationInterval: 30000
这些目前尚未使用:
logValidationErrors: true
maxAge: 1800000 # //30 Minute idle age
removeAbondoned: true
我可以抓住创建的DataSource bean并手动设置这些值吗?或者有更好的方法来扩展或包装自动配置?
有关logValidationErrors
等的更多信息,请参阅此处:https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html
答案 0 :(得分:2)
我用BeanPostProcessor
解决了这个问题,类似于Dave Syer的建议:
@Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof DataSource) {
DataSource ds = (DataSource) bean;
ds.setLogValidationErrors(true);
ds.setRemoveAbandoned(true);
ds.setMaxAge(1800000);
}
return bean;
}
我也可能会提交PR以将属性添加到Spring Boot本身。
答案 1 :(得分:1)
有多种方法可以解决此问题。
首先,您可能希望针对the spring boot project提交针对TomcatDataSourceConfiguration
的提款请求。添加这些依赖项非常简单(请参阅validationInterval in the source code以获取示例。
或者,您可以按照自己的方式创建自己的数据源。如果存在DataSource
bean,则boot不会尝试创建自己的bean。然后,您可以从TomcatDataSourceConfiguration
延伸,并通过覆盖dataSource
添加所需的任何属性。最后,您应该导入扩展类,以便注册bean,这将禁用它的自动配置。
如果您选择了最后一个选项并且对您有用,那么如果您认为这些属性对更广泛的受众感兴趣,则仍然值得report an issue。
答案 2 :(得分:1)
如果我是你,我会@Autowire
现有的DataSource
,根据需要投降,然后设置额外的属性。对某些豆子来说这可能是危险的(如果他们从他们的属性初始化),但我怀疑这是否会成为问题。