如何使用 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 访问对象。您只需要编写和测试一次,但您需要在运行时为每个数据库连接实例化一个新实例。
我有这样的场景,我必须 运行 对 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 访问对象。您只需要编写和测试一次,但您需要在运行时为每个数据库连接实例化一个新实例。