带有两个JPA数据库的Spring boot webapp
我想使用最新版本的SpringBatch管理器(1.3.0版)将现有的SpringBatch作业迁移到SpringBootWebApp 在我的带有两个JPA数据库的Spring boot webapp,spring,jpa,Spring,Jpa,我想使用最新版本的SpringBatch管理器(1.3.0版)将现有的SpringBatch作业迁移到SpringBootWebApp 在我的persistence.xml中,我使用两个PlatformTransactionManager实例配置了两个数据源。 显然,SpringBoot在默认情况下无法处理这种情况 Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying
persistence.xml
中,我使用两个PlatformTransactionManager
实例配置了两个数据源。
显然,SpringBoot在默认情况下无法处理这种情况
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: transactionManager,osm.transactionManager
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:313)
at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:337)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:252)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
//...
有没有想过如何覆盖spring引导默认值,以便可以同时使用两个数据源
EDIT:奇怪的是,尽管定义了两个不同的JpaTransactionManager
bean,但事务方面支持似乎没有bean的名称
<bean id="osm.transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="osm.entityManagerFactory" />
</bean>
<tx:advice id="txAdvice" transaction-manager="osm.transactionManager">
<tx:attributes>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="osmServiceOperation"
expression="execution(* com.company.osm.service.spec..*Service.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="osmServiceOperation" />
</aop:config>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
您必须手动配置数据源:
@Bean
public DataSource dataSource1() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
return dataSource;
}
@Bean
public DataSource dataSource2() {
...
return dataSource;
}
这样,由spring自动配置的数据源将不再可用
如果自动连接数据源,请小心。您必须使用限定符来指定应该使用哪一个。这两个数据源都已在persistence.xml中配置,该文件加载在我的WebAppConfiguration类中。这还不够吗?好吧,我来试试。@achingfingers最重要的部分是如何使用豆子。如果它们是按类型连接的,spring有两个相同类型的bean,不知道该做什么。
protected PlatformTransactionManager determineTransactionManager(TransactionAttribute txAttr) {
// ...
else if (this.transactionManagerBeanName != null) { <-- Should go here!
return this.beanFactory.getBean(this.transactionManagerBeanName, PlatformTransactionManager.class);
}
else {
return this.beanFactory.getBean(PlatformTransactionManager.class); <-- Goes here!
}
}
@Bean
public DataSource dataSource1() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
return dataSource;
}
@Bean
public DataSource dataSource2() {
...
return dataSource;
}