【发布时间】:2019-11-21 09:00:00
【问题描述】:
我需要在我的项目中使用 2 个不同的 mysql 数据库。为此,我在 JDBC 配置文件中添加了第二个数据源。我想在我的服务或 DAO 中指定它必须访问的数据源。
我试图在我的服务之上的 @Transactional 中指定它应该使用哪个 DataSourceTransactionManager,但它不起作用。 第一个数据源运行良好,当我在第二个数据源上切换@Primary 注解时,它也运行良好,因此不是每个数据库配置特有的问题。
JDBCConfig.java
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JDBCConfig {
@Value("${bonecp.url}")
private String jdbcUrlPrm;
@Value("${bonecp.username}")
private String jdbcUsernamePrm;
@Value("${bonecp.password}")
private String jdbcPasswordPrm;
@Value("${bonecp.driverClass}")
private String driverClassPrm;
@Value("${bonecp.moteurFormulaire.url}")
private String jdbcUrlMoteurFormulaire;
@Value("${bonecp.moteurFormulaire.username}")
private String jdbcUsernameMoteurFormulaire;
@Value("${bonecp.moteurFormulaire.password}")
private String jdbcPasswordMoteurFormulaire;
@Value("${bonecp.moteurFormulaire.driverClass}")
private String driverClassMoteurFormulaire;
@Value("${bonecp.idleMaxAgeInMinutes}")
private Integer idleMaxAgeInMinutes;
@Value("${bonecp.idleConnectionTestPeriodInMinutes}")
private Integer idleConnectionTestPeriodInMinutes;
@Value("${bonecp.maxConnectionsPerPartition}")
private Integer maxConnectionsPerPartition;
@Value("${bonecp.minConnectionsPerPartition}")
private Integer minConnectionsPerPartition;
@Value("${bonecp.partitionCount}")
private Integer partitionCount;
@Value("${bonecp.acquireIncrement}")
private Integer acquireIncrement;
@Value("${bonecp.statementsCacheSize}")
private Integer statementsCacheSize;
@Primary
@Bean(name = "prmDataSource", destroyMethod = "close")
public DataSource prmDataSource() {
BoneCPDataSource dataSource = new BoneCPDataSource();
dataSource.setDriverClass(driverClassPrm);
dataSource.setJdbcUrl(jdbcUrlPrm);
dataSource.setUsername(jdbcUsernamePrm);
dataSource.setPassword(jdbcPasswordPrm);
dataSource.setIdleConnectionTestPeriodInMinutes(idleConnectionTestPeriodInMinutes);
dataSource.setIdleMaxAgeInMinutes(idleMaxAgeInMinutes);
dataSource.setMaxConnectionsPerPartition(maxConnectionsPerPartition);
dataSource.setMinConnectionsPerPartition(minConnectionsPerPartition);
dataSource.setPartitionCount(partitionCount);
dataSource.setAcquireIncrement(acquireIncrement);
dataSource.setStatementsCacheSize(statementsCacheSize);
return dataSource;
}
@Bean(name = "moteurFormulaireDataSource", destroyMethod = "close")
public DataSource moteurFormulaireDataSource() {
BoneCPDataSource dataSource = new BoneCPDataSource();
dataSource.setDriverClass(driverClassMoteurFormulaire);
dataSource.setJdbcUrl(jdbcUrlMoteurFormulaire);
dataSource.setUsername(jdbcUsernameMoteurFormulaire);
dataSource.setPassword(jdbcPasswordMoteurFormulaire);
dataSource.setIdleConnectionTestPeriodInMinutes(idleConnectionTestPeriodInMinutes);
dataSource.setIdleMaxAgeInMinutes(idleMaxAgeInMinutes);
dataSource.setMaxConnectionsPerPartition(maxConnectionsPerPartition);
dataSource.setMinConnectionsPerPartition(minConnectionsPerPartition);
dataSource.setPartitionCount(partitionCount);
dataSource.setAcquireIncrement(acquireIncrement);
dataSource.setStatementsCacheSize(statementsCacheSize);
return dataSource;
}
@Primary
@Bean(name="prmTransactionManager")
@Autowired
DataSourceTransactionManager prmTransactionManager(@Qualifier("prmDataSource") DataSource prmDatasource) {
DataSourceTransactionManager txm = new DataSourceTransactionManager(prmDatasource);
return txm;
}
@Bean(name="transactionManager")
@Autowired
DataSourceTransactionManager transactionManager(@Qualifier("moteurFormulaireDataSource") DataSource moteurFormulaireDatasource) {
DataSourceTransactionManager txm = new DataSourceTransactionManager(moteurFormulaireDatasource);
return txm;
}
}
初始化程序扫描的CoreConfig.java
@Configuration
@EnableAutoConfiguration
@ComponentScan({ "san.prm.core.service",
"san.prm.core.helper",
"com.santeos.commons.security.password"
})
@Import({ JDBCConfig.class, MailConfiguration.class, SecurityConfig.class })
@PropertySource("classpath:app.properties")
public class CoreConfig {
}
FormulaireServiceImpl.java
@Service("formulaireService")
@Transactional("transactionManager")
public class FormulaireServiceImpl extends AbstractBusinessService<Formulaire> implements FormulaireService {
@Autowired
private FormulaireDAO formulaireDAO;
@Override
public List<Formulaire> getFormsByUniqueId(String uniqueId) {
return formulaireDAO.findAllByUniqueId(uniqueId);
}
FormulareDAO.java
public interface FormulaireDAO extends GenericEntityDAO<Formulaire> {
List<Formulaire> findAllByUniqueId(String uniqueId);
}
有人知道我可以这样做吗?谢谢
【问题讨论】:
-
看来您的问题已在此处得到解答 - stackoverflow.com/questions/48954763/…
-
问题不一样。我不想在链中使用事务管理器,而只是单独使用。上面写着“方法必须在不同的bean中才能使用不同的事务管理器。”,这是我的情况,但只使用@Primary的事务管理器,第二个被忽略。
标签: spring hibernate spring-boot