如何使用 Spring Boot 从约 100 个客户数据库中查询和检索结果?
Posted
技术标签:
【中文标题】如何使用 Spring Boot 从约 100 个客户数据库中查询和检索结果?【英文标题】:How to query and retrieve results from ~100 customer databases using SpringBoot? 【发布时间】:2019-10-29 06:19:01 【问题描述】:我有这样一个场景,我必须对 100 个具有相似结构的客户数据库运行 10 个不同的查询,然后将结果推送到 ElasticSearch 集群进行分析。所有数据库连接都在我的 applications.properties 文件中配置。我决定将 Spring-Boot 用于项目并使用 Java High Level Rest Client 作为 ElasticSearch API。但是我发现在 Spring-Boot 中我必须为每个实体创建一个实体类,并为每个数据库连接创建一个单独的类和方法。我是 Spring Boot 的新手,也不了解 entitymanager 或 rowmapper 的概念。它与 Java connection-statement-query-resultset 格式完全不同。请帮帮我
我尝试创建这个数据库配置类,我尝试配置从属性文件读取的单个数据库。我已经创建了基本的 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 映射器以将其推送到弹性搜索
【问题讨论】:
你也不能使用 JPA,而使用普通的 JDBC(或者可能是 jOOQ)。在这种情况下,您不需要定义实体。 普通 JDBC 是否可以与 Spring Boot 一起使用?那么在这种情况下,我不必创建存储库或控制器,对吧? 当然,普通的 JDBC 可以与 Spring Boot 一起使用。 JPA 使用 JDBC 本身。 感谢您的意见 【参考方案1】:我是 Spring Boot 新手,也不了解 Spring Boot 的概念 entitymanager 或 rowmapper。
您没有显示架构的任何详细信息,但我认为您不需要同时需要 JPA 和 JdbcTemplate
。我会推荐一个或另一个。
我的偏好是JdbcTemplate
。
JPA/Hibernate 是您不需要的过度杀伤和复杂性。 JdbcTemplate
如果您对编写 SQL SELECT 感到满意,那会很好。
它与 Java connection-statement-query-resultset 格式有很大的不同。
不是真的。 JdbcTemplate
帮助您处理样板文件,但它仍然是 JDBC。
100 个客户端数据库将需要 100 组 URL 和凭据,每组一组。这是一个很多的配置。你无法解决这个问题。
如果所有客户的架构不同,问题就很棘手。
我会将这两个问题分开:查询客户数据和推送到 Elastic Search。
如果所有客户的架构和查询都相同,则每个查询只需要一个 RowMapper
。
我认为可以使用单个存储库/数据访问对象。您只需要编写和测试一次,但您需要在运行时为每个数据库连接实例化一个新实例。
【讨论】:
非常感谢您的解释。在这种情况下,属性文件非常敏感,因此我考虑创建抽象层,而不是直接读取文件并使用显式名称运行带有这些值的 JDBC 连接。整个 SpringBoot 的想法是将其作为微服务运行。我猜普通的 JDBC 或 JdbcTemplate 在这里工作 对我来说感觉不像是微服务,而更像是你想要定期运行以获取更新的批处理作业。你不需要每一种新技术来解决这个问题。明智地选择。 “敏感”?为何如此?这听起来像是一个简单的问题:(1)读取 N 组连接配置集,(2)循环遍历每个连接,(3)循环遍历每个客户要执行的每个查询,(4)查询您需要的数据集合, (5) 将收集到的数据推送到 Elastic Search。为一个客户做这件事,看看性能怎么样,决定这个过程是否适合你的批处理窗口。 是的,您已正确识别它,这将是一个定期运行的批处理作业。唯一的问题是我永远不能在我的代码中提及任何客户名称或详细信息,这必须以不同的方式完成。因此,我正在考虑使用抽象层等。但我想现在我有一个想法,阅读您对这个问题的初步看法。再次感谢 抽象?一个带有加密凭据的界面和每个客户的 guid 就可以做到这一点。以上是关于如何使用 Spring Boot 从约 100 个客户数据库中查询和检索结果?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring Boot(服务器端)和 Angular(前端)将 100K 数据加载到表中
在 Spring boot 中添加超过 65535 个条目的 jar
使用 MSSQL 数据库的 Spring Boot 查询失败
如何使用 OAuth2 保护 2 个 Spring Boot 微服务之间的通信?