【发布时间】:2017-11-03 11:04:57
【问题描述】:
配置
我已经按照本教程在spring-data中配置了两个数据源:
tomcat启动,两个数据库用flyway初始化成功。
第一个DataSource配置是这样的
@Configuration
@EnableTransactionManagement
@EnableMybatisRepositories(
value = "com.domain.api.userManagement.repository",
mapperLocations = {
"classpath*:/mappers/userManagement/*Mapper.xml",
"classpath*:/beforemappers/userManagement/*Mapper.xml"
}
)
public class UserManagementDbConfig {
@Value("${api.db.userManagement.version}")
private String version;
@Primary
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "api.db.userManagement")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Qualifier("userManagement")
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public SqlSessionFactoryBean sqlSessionFactory() throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
return sessionFactory;
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(initMethod = "migrate")
public Flyway flyway() throws SQLException {
Flyway flyway = new Flyway();
flyway.setBaselineOnMigrate(true);
flyway.setLocations("classpath:db/migration/userManagement");
flyway.setSqlMigrationPrefix("V");
flyway.setSqlMigrationSuffix(".sql");
flyway.setEncoding("UTF-8");
flyway.setValidateOnMigrate(false);
flyway.setOutOfOrder(true);
flyway.setTargetAsString(version);
flyway.setDataSource(dataSource());
return flyway;
}
}
还有第二个DataSource:
@Configuration
@EnableTransactionManagement
@EnableMybatisRepositories(
value = "com.domain.api.companyManagement.repository",
mapperLocations = {
"classpath*:/mappers/companyManagement/*Mapper.xml",
"classpath*:/beforemappers/companyManagement/*Mapper.xml"
}
)
public class CompanyManagementDbConfig {
@Value("${api.db.companyManagement.version}")
private String version;
@Bean(name = "companyManagementDataSource")
@ConfigurationProperties(prefix = "api.db.companyManagement")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Qualifier("companyManagement")
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "companyManagementSqlSessionFactory")
public SqlSessionFactoryBean sqlSessionFactory() throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
return sessionFactory;
}
@Bean(name = "companyManagementSqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(initMethod = "migrate", name = "companyManagementFlyway")
public Flyway flyway() throws SQLException {
Flyway flyway = new Flyway();
flyway.setBaselineOnMigrate(true);
flyway.setLocations("classpath:db/migration/companyManagement");
flyway.setSqlMigrationPrefix("V");
flyway.setSqlMigrationSuffix(".sql");
flyway.setEncoding("UTF-8");
flyway.setValidateOnMigrate(false);
flyway.setOutOfOrder(true);
flyway.setTargetAsString(version);
flyway.setDataSource(dataSource());
return flyway;
}
}
这就是我编写负责插入的服务的方式:
@Service
public class TestServiceImpl extends AbstractCrudService<TestRepository, Test, Long> implements TestService {
@Autowired
public TestServiceImpl(TestRepository repository) {
super(repository);
}
@Override
@Transactional("companyManagement")
public void insert(Test user) {
super.insert(user);
}
@Override
@Transactional("companyManagement")
public void updateIgnore(Test user) {
super.updateIgnore(user);
}
}
application.yml:
server:
port: 8080
session:
timeout: -1
api:
db:
userManagement:
version: 0.0.17
url: jdbc:postgresql://localhost:3333/UM?autoReconnect=true&useUnicode=true&connectionCollation=utf8_general_ci&characterSetResults=utf8&characterEncoding=UTF-8
username: ******
password: ******
driver-class-name: org.postgresql.Driver
minIdle: 0
maxIdle: 10
maxActive: 50
maxWait: 6000
testOnBorrow: true
validationQuery: SELECT 1
timeBetweenEvictionRunsMillis: 1800000
numTestsPerEvictionRun: 50
minEvictableIdleTimeMillis: 10
testWhileIdle: true
companyManagement:
version: 0.0.17
url: jdbc:postgresql://localhost:3334/CM?autoReconnect=true&useUnicode=true&connectionCollation=utf8_general_ci&characterSetResults=utf8&characterEncoding=UTF-8
username: ******
password: ******
driver-class-name: org.postgresql.Driver
minIdle: 0
maxIdle: 10
maxActive: 50
maxWait: 6000
testOnBorrow: true
validationQuery: SELECT 1
timeBetweenEvictionRunsMillis: 1800000
numTestsPerEvictionRun: 50
minEvictableIdleTimeMillis: 10
testWhileIdle: true
结果
Fri Nov 03 17:18:46 ICT 2017
There was an unexpected error (type=Internal Server Error, status=500).
### Error updating database. Cause: org.postgresql.util.PSQLException: ERROR: relation "cm_test" does not exist Position: 13 ### The error may involve com.domain.api.companyManagement.domain.Test._insert-Inline ### The error occurred while setting parameters ### SQL: insert into "cm_test"("name") values(?) ### Cause: org.postgresql.util.PSQLException: ERROR: relation "cm_test" does not exist Position: 13 ; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: relation "cm_test" does not exist Position: 13
此存储库应尝试插入第二个数据源,但它尝试使用第一个(主)数据源。
复制
网址:https://github.com/kopax/spring-data-mybatis-test
需要使用docker-compose up -d或者手动不使用docker启动这两个数据库。
您是如何设法使用多个 DataSource 的?
【问题讨论】:
-
你能分享你的 application.yml/.properties 文件吗?
-
@TurbutAlin 我已经添加了我的
application.yml的相关部分 -
另外两件事: - 默认的 spring.datasource 呢?初始化了吗? - 您的配置类型中缺少 basePackages 扫描。我看到它有 mapperLocations。不确定这是否有用。也许我以后会找时间在本地尝试。
-
我没有使用属性
spring.datasource,而是使用api.db.userManagement。 basePackage 扫描发生在Application.java使用@SpringBootApplication(scanBasePackages={"com.domain.api.userManagement","com.domain.api.companyManagement"}) -
请为 transactionManager 添加限定符并将其用于您的。方法事务注释。
标签: java spring spring-mvc spring-data datasource