极慢的ResultSet next()性能

时间:2016-04-18 13:07:28

标签: java oracle jdbc resultset

我试图从oracle db获取一些结果,然后使用jdbc批处理将这些行插入另一个oracle db。但是使用@Override public void run(XConfiguration configuration, Environment environment) throws Exception { configuration.setLoggingFactory(null); LoggingFactory loggingFactory = new LoggingFactory(); FileAppenderFactory fileAppenderFactory = new FileAppenderFactory(); fileAppenderFactory.setArchive(true); fileAppenderFactory.setArchivedFileCount(7); fileAppenderFactory.setArchivedLogFilenamePattern("rest_service-%d{yyyy-MM-dd}-%i.log.gz"); Duration duration = Duration. milliseconds(100); fileAppenderFactory.setBatchDuration(duration); fileAppenderFactory.setBatchSize(128); fileAppenderFactory.setBounded(false); fileAppenderFactory.setCurrentLogFilename("rest_service.log"); fileAppenderFactory.setLogFormat("%-6level [%d{HH:mm:ss.SSS}] [%t] %logger{5} - %X{code} %msg %n"); fileAppenderFactory.setThreshold(Level.INFO); fileAppenderFactory.setTimeZone(TimeZone.getTimeZone("UTC")); ArrayList<AppenderFactory> arrayList = new ArrayList<AppenderFactory>(); arrayList.add(fileAppenderFactory); loggingFactory.setAppenders(arrayList); configuration.setLoggingFactory(loggingFactory); //registered some resources. } 的循环非常慢。

select查询包括rowNum和一些表连接。此外,其中有90多列。我没有任何机会改进查询它无法访问。尽管如此,我认为这还不足以澄清缓慢。这不正常,我找不到任何解决方案。

这是我的代码。当我注释掉所有代码时 在resultset.next()但不在while内,仍然存在缓慢。所以我很确定问题的根源是counter++。您还可以在下面找到效果结果。

sdResult.next()

如果我不使用setFetchSize():

INFO:在61804 ms内插入100行。总人数= 100。新查询正在构建......

信息:在94150毫秒内插入100行。总人数= 200。新查询正在构建......

INFO:在61148毫秒内插入100行。总人数= 300。新查询正在构建......

如果我将setFetchSize(100)与PreparedStatement一起使用:

信息:在62毫秒内插入100行。总人数= 100。新查询正在构建......

INFO:在60367 ms内插入100行。总人数= 200。新查询正在构建......

信息:在64540毫秒内插入100行。总人数= 300。新查询正在构建......

1 个答案:

答案 0 :(得分:0)

尝试

 Resultset sdResult = sdbConnInstance.executeQuery(SOURCE_DB_QUERY1.toString());
sdResult.setFetchSize(100);

会很快

将行大小更改为100。