我需要使用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等,但是似乎没有什么可以使此速度更快。
我想使这个速度更快,并希望获得任何帮助。
有类似问题!
数据集太大,而在一个涉及银行迁移任务的项目中
解决方案:使用PlSql代替Java Batch。它们总是更快。