如何在Spring Boot应用程序中使用两个单独的dataSource?
我希望我的应用程序使用一个dataSource,用于持久化我的模型和一个单独的dataSource供Activiti引擎使用,因此它可以将它的实体保存在一个单独的数据库中。
截至目前,Activiti的表格和我的应用程序表格都是在同一个数据库中创建的。
[被修改]:
我知道我可以定义两个独立的DataSource bean,如:
@Bean
public DataSource appDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("xxx");
dataSource.setUsername("xxx");
dataSource.setPassword("xxx");
return dataSource;
}
@Bean
public DataSource activitiDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("xxx");
dataSource.setUrl("xxx");
dataSource.setUsername("xxx");
dataSource.setPassword("xxx");
return dataSource;
}
但是我如何通知Activiti使用activitiDataSource?
我正在使用Activiti 5.16.4,顺便说一句......
谢谢!
答案 0 :(得分:3)
@ andy-wilkinson给出了答案,但这里有一个如何使用它的例子。
根据您的建议,创建另一个DataSource
,然后将其连接到SpringProcessEngineConfiguration
。像这样:
@Configuration
public class ActivitiConfiguration extends AbstractProcessEngineAutoConfiguration {
@Bean
@ConfigurationProperties(prefix = "datasource.activiti")
public DataSource activitiDataSource() {
return DataSourceBuilder
.create()
.url("jdbc:h2:mem:activiti")
.username("activiti")
.driverClassName("org.h2.Driver")
.build();
}
@Bean
public SpringProcessEngineConfiguration springProcessEngineConfiguration(
PlatformTransactionManager transactionManager,
SpringAsyncExecutor springAsyncExecutor) throws IOException {
return baseSpringProcessEngineConfiguration(
activitiDataSource(),
transactionManager,
springAsyncExecutor);
}
}
Activiti将使用activitiDataSource
创建其表并保留其数据。
现在,您可以创建另一个DataSource
来携带您的应用表和数据。这是一个基于spring-boot-sample-basic
的基本示例。
基本上它会在customerId
/ WaiterEntity
中保留WaiterRepository
(使用Spring Data JPA - 为了简洁而省略),然后将该持久值传递给Activiti basic2.bpmn
进程,只需将其打印到控制台。
@SpringBootApplication
public class Application {
@Bean
@Primary
@ConfigurationProperties(prefix = "datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder
.create()
.url("jdbc:h2:mem:primary")
.username("primary")
.driverClassName("org.h2.Driver")
.build();
}
@Bean
CommandLineRunner basics(final RuntimeService runtimeService,
final WaiterRepository repository) {
return new CommandLineRunner() {
@Override
public void run(String... strings) throws Exception {
runtimeService.startProcessInstanceByKey(
"waiter2",
Collections.singletonMap(
"customerId",
(Object) repository.save(new WaiterEntity(123L)).getCustomerId()));
}
};
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
注意@Primary
上的primaryDataSource
。如果不加考虑,WAITER_ENTITY
表将在activitiDataSource
中创建(没有任何其他特定配置)。
答案 1 :(得分:1)
在Spring启动时,您应该在application.properties中配置数据源配置。
例如:
spring.datasource.url=jdbc:postgresql://localhost:5432/activiti_development
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.driver-class-name=org.postgresql.Driver
参考:http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html