【问题标题】:Fast streaming batch data from mssql database来自 mssql 数据库的快速流式批处理数据
【发布时间】:2020-06-19 01:03:24
【问题描述】:

我需要使用 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】:

    遇到了类似的问题!

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

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


    根据我为大数据集编写的经验,我想添加另一个想法

    • 与其在每次迭代后提交,不如选择 BULK COMMITS

    我们过去常常在对结果集进行 30,000 次迭代后一起提交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      相关资源
      最近更新 更多