我试图从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。新查询正在构建......
答案 0 :(得分:0)
尝试
Resultset sdResult = sdbConnInstance.executeQuery(SOURCE_DB_QUERY1.toString());
sdResult.setFetchSize(100);
会很快
将行大小更改为100。