【发布时间】: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