如何在Spring Boot应用程序中使用两个单独的数据源?
我希望应用程序使用一个dataSource,用于持久化模型,而Activiti引擎使用一个单独的dataSource,以便将其实体保存在单独的数据库中。
到目前为止,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,顺便说一句…
谢谢!
@ andy- wilkinson给出了答案,但这是如何使用它的示例。根据您的建议,创建另一个DataSource,然后将其连接到SpringProcessEngineConfiguration。像这样:
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创建其表并保留其数据。
activitiDataSource
现在,您可以创建另一个DataSource来携带应用程序表和数据。这是基于的基本示例spring-boot-sample- basic。基本上,它customerId在WaiterEntity/中保留a WaiterRepository(使用Spring Data JPA-为简洁起见,然后将其保留)传递到Activiti basic2.bpmn进程,该进程仅将其打印出到控制台。
spring-boot-sample- basic
customerId
WaiterEntity
WaiterRepository
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(没有任何其他特定配置)。
@Primary
primaryDataSource
WAITER_ENTITY