如何使用 Spring Boot 从大约 100 个客户数据库中查询和检索结果?

How to query and retrieve results from ~100 customer databases using SpringBoot?

我有这样的场景,我必须 运行 对 100 个具有相似结构的客户数据库进行 10 个不同的查询,然后将结果推送到 ElasticSearch 集群进行分析。所有数据库连接都在我的 applications.properties 文件中配置。我决定为项目使用 Spring-Boot,并使用 Java High Level Rest Client 作为 ElasticSearch API。但是我发现在 Spring-Boot 中我必须为每个实体创建一个实体 class 并为每个数据库连接创建一个单独的 class 和方法。我是 Spring Boot 的新手,也不了解 entitymanager 或 rowmapper 的概念。它与 Java connection-statement-query-resultset 格式有很大不同。请帮助我

我尝试创建此数据库配置 class,我尝试配置从属性文件读取的单个数据库。我已经创建了基本的 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);
}

}

我不想为每个对象创建一个实体 class,因为查询和结果可能会有所不同。我也不想创建行映射器,因为我已经为检索到的行编写了 Json 映射器以将其推送到 elasticsearch

I am new to Spring Boot and am also not understanding the concepts of entitymanager or rowmapper.

您没有显示架构的任何细节,但我认为您不需要同时使用 JPA 和 JdbcTemplate。我会推荐一个或另一个。

我的偏好是 JdbcTemplate

JPA/Hibernate 是您不需要的矫枉过正和复杂性。如果您习惯编写 SQL SELECT,JdbcTemplate 就可以了。

It is quite different from Java connection-statement-query-resultset format.

不是真的。 JdbcTemplate 帮助您处理样板文件,但它仍然 JDBC 在下面。

100 个客户端数据库将需要 100 组 URL 和凭证,每组一组。那是一个很多的配置。你无法解决这个问题。

如果所有客户的模式都不相同,则问题很棘手。

我会将这两个问题分开:查询客户数据和推送到 Elastic Search。

如果所有客户的架构和查询都相同,则每个查询只需要一个 RowMapper

我认为可以使用单个 repository/data 访问对象。您只需要编写和测试一次,但您需要在运行时为每个数据库连接实例化一个新实例。