Укажите, какой источник данных использовать в service / dao, когда несколько источников данных - PullRequest
0 голосов
/ 11 июля 2019

Мне нужно использовать 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);
    }

FormulaireDAO.java

public interface FormulaireDAO extends GenericEntityDAO<Formulaire> {

    List<Formulaire> findAllByUniqueId(String uniqueId);

}

У кого-нибудь есть идеи, чтобы я мог это сделать?Спасибо

1 Ответ

0 голосов
/ 11 июля 2019

Как вы пишете в базу данных?Какую технологию вы используете - JDBC или JPA?Вам нужно дать квалифицированные имена вашим компонентам Datasource / EntityManager / EMFactory и использовать это указанное имя для подключения к вашему потребляющему коду.Если у вас есть несколько источников данных, обязательно нужно быть @Primary.И дайте разные имена обоим DS и используйте тот, который вы хотите.Надеюсь это поможет.Если вы можете вставить сюда больше кода, связанного с DS, я могу проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...