我正在寻找技术解决方案;使用 java spring boot 从一个数据库查询数据并将其加载到 SQL Server 数据库中。
模拟查询以获取在给定时间 20 小时内更新的产品名称:
SELECT
productName, updatedtime FROM
products WHERE
updatedtime BETWEEN '2018-03-26 00:00:01' AND '2018-03-26 19:59:59';
这是我们遵循的方法。
1) 其长时间运行的 Oracle 查询,在工作时间运行大约 1 小时,并返回约 100 万条记录。
2) 我们必须使用 JDBC 将此结果集插入/转储到 SQL Server 表中。
3) 据我所知,Oracle JDBC 驱动程序支持流式传输。当我们迭代 ResultSet 时,它仅将 fetchSize 行加载到内存中。
int currentRow = 1;
while (rs.next()) {
// get your data from current row from Oracle database and accumulate in a batch
if (currentRow++ % BATCH_SIZE == 0) {
//insert whole accumulated batch into SqlServer database
}
}
在这种情况下,我们不需要将 Oracle 中的所有巨大数据集存储在内存中。我们将批量插入到SqlServer中BATCH_SIZE。唯一的事情是我们需要考虑在哪里提交到 SqlServer 数据库。
4)这里的瓶颈是从oracle数据库获取数据的查询执行等待时间,所以我计划将查询分成10个相等的部分,这样每个查询都会给出每小时之间的更新时间,如图所示。这样每个查询的执行时间也减少到约 10 分钟。 例如: 选择 产品名称,更新时间 FROM 产品在哪里 更新时间介于“2018-03-26 01:00:01”和“2018-03-26 01:59:59”之间;
5. 为此,我需要 5 个 Oracle JDBC 连接和 5 个 Sql 服务器连接(用于查询数据并插入数据库)来独立完成其工作。我是 JDBC 连接池新手 如果连接未使用等,我该如何进行连接池和关闭连接?
请建议您是否有其他更好的方法来快速从数据源获取数据作为实时数据。请建议。提前致谢。
最佳答案
这是 Spring Batch 的典型用例。
这里您有 ItemReader(从源数据库)和 ItemWriter(到目标数据库)的概念。
您可以定义多个数据源,并且您将能够以固定的获取大小进行读取(例如 JdbcCursorItemReader),并能够创建并行执行的网格。
通过快速搜索,您可以在网上找到许多与此类任务相关的示例。
我知道我不会发布与该概念相关的代码,但我需要一些时间来准备一个像样的示例
关于java - 使用 Spring Boot 将 Oracle 数据传输到 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52747059/