Как запросить и получить результаты из ~ 100 клиентских баз данных с помощью SpringBoot? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть сценарий, в котором мне нужно выполнить 10 различных запросов в 100 клиентских базах данных со схожей структурой, а затем отправить результаты в кластер ElasticSearch для анализа. Все соединения с базой данных настраиваются в моем файле application.properties. Я решил использовать Spring-Boot для проекта и Java High Level Rest Client в качестве API ElasticSearch. Однако я обнаружил, что в Spring-Boot мне нужно создать класс сущностей для каждой сущности и создать отдельный класс и методы для каждого соединения с базой данных. Я новичок в Spring Boot, и я также не понимаю концепции entitymanager или rowmapper. Он сильно отличается от формата Java-оператора-запроса-запроса-набора результатов. Пожалуйста, помогите мне

Я пытался создать этот класс конфигурации базы данных, где я пытался настроить чтение одной базы данных из файла свойств. Я создал основные методы datasource () и jdbctemplate ()

package elasticsearch;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "entityManagerFactory",
    basePackages = { "elasticsearch" }
)
public class DatabaseConfig {


@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "primary.datasource")
public DataSource dataSource() {
    return DataSourceBuilder.create().build();
}


@Bean(name = "jdbcTemplate")
public JdbcTemplate jdbcTemplate(@Qualifier("dataSource") DataSource         dataSource){
    return new JdbcTemplate(dataSource);
}


@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
        EntityManagerFactoryBuilder builder,
        @Qualifier("dataSource") DataSource dataSource) {
    return builder
            .dataSource(dataSource)
            .packages("elasticsearch")
            .persistenceUnit("elasticsearch")
            .build();
}


@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(
        @Qualifier("entityManagerFactory") EntityManagerFactory
                entityManagerFactory
) {
    return new JpaTransactionManager(entityManagerFactory);
}

}

Я не хочу создавать класс сущностей для каждого объекта, потому что запросы, а также результаты могут отличаться. Кроме того, я не хочу создавать операторы строк, потому что я уже написал картографы Json для извлеченных строк, чтобы передать их вasticsearch

1 Ответ

0 голосов
/ 14 июня 2019

Я новичок в Spring Boot и также не понимаю понятия entitymanager или rowmapper.

Вы не показываете детали вашей схемы, но я не думаю, что вам нужны и JPA, и JdbcTemplate. Я бы порекомендовал один или другой.

Мои предпочтения будут JdbcTemplate.

JPA / Hibernate - это излишество и сложность, которая вам не нужна. JdbcTemplate будет хорошо, если вам удобно писать SQL SELECT.

Он сильно отличается от формата Java-оператора-запроса-запроса-набора результатов.

Не совсем. JdbcTemplate помогает вам с шаблоном, но он все еще находится под JDBC.

100 клиентским базам данных потребуется 100 наборов URL и учетных данных, по одному для каждой. Это много конфигурации. Вы не можете обойти это.

Проблема неразрешима, если схемы не идентичны для всех клиентов.

Я бы разделил две проблемы: запрос данных о клиенте и переход к Elastic Search.

Требуется только один RowMapper на запрос, если схема и запрос идентичны для всех клиентов.

Я думаю, что можно использовать один объект хранилища / доступа к данным. Вам нужно только написать и протестировать его один раз, но вам нужно создать новый экземпляр во время выполнения для каждого соединения с базой данных.

...