@DDwrt100

Spring как интегрировать второй базой, сторонную базу данных?

Добрый день всем.
Столкнулся с такой проблемой.
В текущем проекте используется две базы данных, Postgress, и ClickHouse.
Соответсвенно ClickHouse не имеет прямой интеграции с Spring.
Я смог интегрировать ClickHouse с помощью стороннего драйвера. Однако столкнулся с проблемой, что обе базы данны вместе не хотят работать. Все примеры что я видел в интернете, показывают как использовать две базы данных, которые уже имеют интеграцию с Spring. Как мне все же заставить их работать вместе?
Код файла Properties
####Spring Configuration####
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
####Postgress DB ####

#spring.pg.datasource.driver-class-name=org.postgresql.Driver
spring.pg.datasource.url=jdbc:postgresql://localhost:5432/java_db
spring.pg.datasource.username=****
spring.pg.datasource.password=****

####
spring.jpa.hibernate.ddl-auto=none
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
####
#second db
spring.ch.datasource.url=jdbc:clickhouse://127.0.0.1:9000
spring.ch.datasource.driverClassName=com.github.housepower.jdbc.ClickHouseDriver


Включение базы данных Postgress основной, так же тут попытка добавить второй базой ClickHouse.Такой код компилируется , но все методы работают от имени Postgress в таком варианте.
import com.zaxxer.hikari.HikariDataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.transaction.annotation.EnableTransactionManagement;
//Adding first database(Postgress) to Spring config, Properties takes in application.properties
@Configuration
@EnableTransactionManagement

public class ConfigPG {
    @Bean
    @Primary
    @ConfigurationProperties("spring.pg.datasource")
    public DataSourceProperties firstDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @ConfigurationProperties("spring.pg.datasource.configuration")
    public HikariDataSource firstDataSource() {
        return firstDataSourceProperties().initializeDataSourceBuilder()
                .type(HikariDataSource.class).build();
    }

    @Bean
    @ConfigurationProperties("spring.ch.datasource")
    public DataSourceProperties secondDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("spring.ch.datasource.configuration")
    public BasicDataSource secondDataSource() {
        return secondDataSourceProperties().initializeDataSourceBuilder()
                .type(BasicDataSource.class).build();
    }
}


И собственно подключение к базе ClickHouse , которое было организовано ранее.
@Configuration
@EnableScheduling
@EnableTransactionManagement
@ComponentScan("com.github.housepower")

public class ConfigurationClickHouse {
    @Bean
    public DataSource chDatasource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.github.housepower.jdbc.ClickHouseDriver");
        dataSource.setUrl("jdbc:clickhouse://localhost:9000");
        return dataSource;
    }

    @Bean
    public JdbcTemplate chJDBC(DataSource chDatasource) {
        return new JdbcTemplate(chDatasource);

    }
  • Вопрос задан
  • 1224 просмотра
Решения вопроса 1
@DDwrt100 Автор вопроса
Покопался немного. Могу сузить область вопроса.
Отключил отдельное описание подключения к CH. Вся область настройки сузилась до одного класса.
@Bean
    @Primary
    @ConfigurationProperties("spring.pg.datasource")
    public DataSourceProperties firstDataSourceProperties() {
        return new DataSourceProperties();
    }



    @Bean
    @ConfigurationProperties("spring.ch.datasource")
    public DataSourceProperties secondDataSourceProperties() {
        return new DataSourceProperties();
    }




    @Bean(name = "PG")
    @Primary
    @ConfigurationProperties("spring.pg.datasource.configuration")
    public DataSource firstDataSource() {
        return firstDataSourceProperties().initializeDataSourceBuilder()
                .type(BasicDataSource.class).build();
    }


    @Bean(name = "CH")
    @ConfigurationProperties("spring.ch.datasource.configuration")
    public DataSource secondDataSource() {
        return secondDataSourceProperties().initializeDataSourceBuilder()
                .type(BasicDataSource.class).build();
    }

Сейчас проблема в том, что если я отключаю метод подключения к одной базе данных, вторая начинает работать.
Если компилирую со всеми включенными методами, то на все запросы идут к Postgress базе данных.

Как мне управлять, в слое данных, из какой базы данных я хочу читать?

Сейчас относительно ClickHouse, DAO выглядит следующим образом
@Qualifier("CH")
private  JdbcTemplate ch;

    @Autowired
    public ClickHouseDAO1(JdbcTemplate dataSource) {
        this.ch = dataSource;

    }



    public List<DataRecord> query(String query) {

        List<DataRecord> answer = ch.query(query, DataRecord.Mapper.INSTANCE);

        return answer;
    }

Но оно не рабоет должным образом.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы