我正在开发一个Spring Boot / Spring Batch项目,我需要配置两个数据源。一个是用于跟踪事务的内存中hsqldb数据库。另一个是常规MySQL数据库,将由我的ItemWriters更新。
问题是,一旦我尝试配置第二个数据源,Spring就会开始抛出“无法解决的循环依赖”错误,即
Error creating bean with name 'preprodDataSource' defined in class path
resource [xxx/tools/batch/xxx/MyConfiguration.class]: Initialization of
bean failed; nested exception is
org.springframework.beans.factory.BeanCurrentlyInCreationException: Error
creating bean with name 'dataSourceAutoConfigurationInitializer': Requested bean is
currently in creation: Is there an unresolvable circular reference?
我的MyConfiguration.java文件的相关块看起来像:
@Bean
public DataSource transactionsDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:mem:testdb;sql.enforce_strict_size=true;hsqldb.tx=mvcc");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
@Bean
public DataSource preprodDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/somedb");
dataSource.setUsername("someuser");
dataSource.setPassword("somepass");
return dataSource;
}
如果我注释掉定义第二个数据源的@Bean,一切都很好。应用程序启动并运行没有问题。但是,如果我把它留在里面,我会得到上面的错误。
我对此的天真解释是,Spring正在构建一个'dataSourceAutoConfigurationInitializer'实例来处理第一个数据源的初始化,当它试图构造第二个数据源来处理第二个数据源时,会发生不好的事情。
有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
默认情况下,Spring Boot的自动配置会尝试使用您的应用程序JdbcTemplate
为您创建DataSource
。正如您配置了两个,它不知道使用哪一个。要告诉它应该使用哪一个mark one of them as @Primary
:
@Bean
@Primary
public DataSource transactionsDataSource() {
BasicDataSource dataSource = new BasicDataSource();
…
return dataSource;
}