【问题标题】:Specify which datasource to use in service/dao when multiple datasources指定多个数据源时在service/dao中使用哪个数据源
【发布时间】: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


【解决方案1】:

你是如何写入数据库的?您使用什么技术 - JDBC 或 JPA? 您需要为 Datasource/EntityManager/EMFactory bean 提供限定名称,并使用该指定名称挂钩到您的消费代码。 如果您有多个数据源,则肯定需要@Primary。并为两个 DS 指定不同的名称,并使用您想要的名称。 希望这可以帮助。如果您可以在此处粘贴更多与 DS 相关的代码,我可以查看。

【讨论】:

  • datasources相关的代码粘贴在JDBCConfig文件中。我为此 DS 创建了第二个数据源和第二个事务管理器。然后我在我的服务上添加了@Transactional("nameOfTransactionManager")(并尝试了函数),但它似乎只是忽略了它,并使用带有@Primary 的第一个事务管理器,而不是我在服务上指定的那个。跨度>
  • 您可以尝试将“transactionManager”的名称更改为更自定义的名称,例如“moteurFormulaireTransactionManager”吗?因为我认为“transactionManager”是 Spring 给出的默认名称。这可能不起作用,因为您已命名它们,但值得一试。其余所有代码看起来都很好。我希望所有的 bean 都在进行组件扫描。
  • 一开始就是这样的名字,但是我有一个spring错误,说至少一个bean必须命名为“transactionManager”。我猜 bean 很好地接受了组件扫描,因为当我切换默认数据源(使用@Primary)时,我得到了我想得到的东西。问题仍然是默认情况下只使用事务管理器(使用@Primary),即使我用它的名称指定第二个也会被忽略..我不明白为什么。
猜你喜欢
  • 1970-01-01
  • 2021-01-19
  • 2015-02-03
  • 2014-09-26
  • 1970-01-01
  • 2018-08-24
  • 2015-03-16
  • 1970-01-01
  • 2019-06-30
相关资源
最近更新 更多