从mssql数据库快速流处理批处理数据

问题描述 投票:0回答:1

我需要使用Hibernate从SQL Server数据库中的复杂查询中读取每一行,并将结果写入文件。但是查询可以返回数百万条记录,因此以下代码似乎是适当的:

Session unwrap = entityManager.unwrap(Session.class);
NativeQuery nativeQuery =
    unwrap.createNativeQuery("the sql query string read from a file");
nativeQuery.setFlushMode(FlushMode.MANUAL);
nativeQuery.addEntity("C", CustomObject.class);
nativeQuery.setFetchSize(100000);
nativeQuery.setReadOnly(true);
ScrollableResults scroll = nativeQuery.scroll(ScrollMode.FORWARD_ONLY);

while(scroll.next()) {
   CustomObject customObject = (CustomObject) scroll.get(0);
   jsonGenerator.writeObject(customObject); // using the JsonGenerator library https://fasterxml.github.io/jackson-core/javadoc/2.6/com/fasterxml/jackson/core/JsonGenerator.html
   unwrap.evict(claimEntity);
}

当前,此代码大约需要3-4天才能将大约100万条记录写入文件,这太慢了。我将mssql-jdbc驱动程序与hibernate一起使用,并且假定驱动程序可能会忽略获取大小,但是由于其他驱动程序不支持大容量复制功能,因此更改驱动程序不是我的选择。

问题是,休眠状态可能正在建立连接以从数据库中分别获取每一行,从而导致昂贵的网络调用。

我曾尝试设置自适应缓冲,启用游标,将连接自动提交模式设置为false等,但是似乎没有什么可以使此速度更快。

我想使这个速度更快,并希望获得任何帮助。

java sql-server hibernate spring-boot jdbc
1个回答
0
投票

有类似问题!

数据集太大,而在一个涉及银行迁移任务的项目中

解决方案:使用PlSql代替Java Batch。它们总是更快。

© www.soinside.com 2019 - 2024. All rights reserved.