使用多个 jdbc 连接运行并行查询的 Spring Boot 应用程序

Posted

技术标签:

【中文标题】使用多个 jdbc 连接运行并行查询的 Spring Boot 应用程序【英文标题】:Spring boot application to run parllel querys with multiple jdbc connections 【发布时间】:2018-10-12 02:11:06 【问题描述】:

我正在寻找从一个数据库中查询数据并使用 java spring boot 独立应用程序将其加载到 SQL Server 数据库中的技术解决方案。

select a.student_id
max(decode(a.marks_limit, 99.99,100,null )) as max_marks,
b.student_city_code "NYC",
from student a, student_info b
where a.student_id=b.student_id
and a.student_id in (''a123,'b123','c123')
and  b.adress_modified > TO_TIMESTAMP('2018/09/13 10:13:18', 'YYYY/MM/DD HH:MI:SS')
group by a.student_id, b.student_city_code

我们正在连续运行这个 oracle 查询,它需要 1 小时的执行时间和大约 3000 万条记录,为了获得更好的结果,我们计划将此查询分成 3 个类似的查询,因此不要使用 in 运算符,而是计划在每个查询中使用 =,例如.student_id="a123" 在一个查询中和 a.student_id="b123" 在第二个查询中 a.student_id="b123" 在第三个查询中,我相信每次查询执行 1 小时的时间将减少到 ~20 分钟。

作为一种技术解决方案,它计划并行执行所有多个查询,并使用 Oracle 批处理流将结果并行提交到目标表。据我所知,Oracle JDBC 驱动程序支持流式传输。当我们迭代 ResultSet 时,它只会将 fetchSize 行加载到内存中。

请帮助示例代码库如何动态打开多个源和目标 JDBC 连接并在过程完成后关闭。 Java8 具有广泛的软件包。请建议您是否有更好的解决方案。

oracle-jdbc-con1     oracle-jdbc-con2        oracle-jdbc-con3
       |                   |                   |        
       |                   |                   | 
       V                   V                   V 
sql-jdbc-con1          sql-jdbc-con2         sql-jdbc-con3

【问题讨论】:

为什么需要使用spring boot来做到这一点?看起来有点矫枉过正。 应该 24/7 或每 1 小时连续运行我们的项目需要它,所以我们需要这样做 【参考方案1】:

任何类型的程序都会产生开销。另外,我认为这是一次性活动,不需要应用程序来完成。

我们最近将几个表从 mysql 迁移到 MS SQL Server,在尝试了几个选项后,我们使用了 SSMA。

SSMA 是 MS Sql Server 自己的工具,用于从其他数据库中引入数据库或模式或表。当您迁移时,比如说从 oracle 到 sql server 的单个表,它也会处理数据类型转换。

你只需要 - 安装 SSMA(仅限 Windows) - 配置源和目标数据源 - 在 Windows 应用程序上选择数据库对象 - 点击迁移

SSMA 有自己的版本,专门用于 Oracle OracleToSQL 这是introductory Documentations,但是您会发现很多分步指南。

【讨论】:

以上是关于使用多个 jdbc 连接运行并行查询的 Spring Boot 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有连接的情况下查询多个相关表,并使用 JDBC 获得一致的数据?

Greenplum 并行下载转储到本地集群

如何在单个 JDBC 连接中执行多个 JPA 查询

我们如何使用 jdbc 执行连接查询,而不是使用 pyspark 获取多个表

并行运行多个查询动画

如何使用 Spring 管理具有不同 jdbc(或休眠?)的多个“运行时注意到”数据库连接?