ResultSet next()性能极慢

问题描述 投票:2回答:1

我试图从一个oracle db中获取一些结果,然后用jdbc batch将这些行插入到另一个oracle db中。但是,当循环使用 resultset.next() 是非常慢的。

选择查询包括rowNum和一些表的连接。另外,里面有90多列。我没有任何机会来改进查询,它是无法达到的。不过,我想这是不够有挑战性的,这阐明速度很慢。这是不正常的,我找不到任何解决方案。

这是我的代码。当我把所有的代码都注释掉的时候 while 而不是 counter++,速度依然缓慢。所以我很确定问题的来源是 sdResult.next(). 你也可以在下面找到性能结果。

    try {
            ResultSet sdResult = sdbConnInstance.executeQuery(SOURCE_DB_QUERY1.toString());
            logger.info("bulkInsert started at: " + dateFormat.format(cal.getTime()));
            LinkedHashMap<String, String> columnMap = new LinkedHashMap<String, String>();
            ArrayList<LinkedHashMap> bulkList = new ArrayList<LinkedHashMap>();
            operationCleaned = true;
            int counter = 0;
            int countToBulkInsert = 0;
            while(sdResult.next()) {                                
                operationCleaned = false;
                counter++;
                for (int i = 0; i < SOURCE_DB_COLUMNS1_ARRAY.length; i++) {
                        String column = SOURCE_DB_COLUMNS1_ARRAY[i];
                        try {
                                columnMap.put(column, sdResult.getString(column));
                        } catch (Exception e) {
                                columnMap.put(column, null);
                        }

                }
                bulkList.add(columnMap);
                columnMap = new LinkedHashMap<String, String>();
                if (countToBulkInsert == BULK_INSERT_COUNT) {
                        tdbConnInstance.insertWithBatch(INSERT_QUERY_TEMPLATE.toString(), bulkList);
                        lEndTime = System.currentTimeMillis();
                        logger.info(countToBulkInsert + " rows are inserted in " + (lEndTime - lStartTime) + " ms. Total count=" + counter + ". New query is building...");
                        lStartTime = System.currentTimeMillis();
                        countToBulkInsert = 0;
                        bulkList = new ArrayList<LinkedHashMap>();
                        operationCleaned = true;
                }
            }
   } catch (Exception e) {
        e.printStackTrace();
        logger.error("Failed to insert!");
   }

如果我不使用setFetchSize()。

INFO: 100行插入时间为61804毫秒。在61804毫秒内插入100行。总计数=100。新查询正在建立...

INFO:100条记录在61804毫秒内被插入,总计数=100。100条记录在94150毫秒内被插入。总数=200。新的查询正在建立...

INFO:100条记录在61148毫秒内被插入,总计数=200。100条记录在61148毫秒内被插入。总计数=300。新查询正在建立...

如果我在PreparedStatement中使用setFetchSize(100)。

INFO: 100条记录在62毫秒内被插入。總計數=100.新查詢正在建立中... 新查询正在建立...

INFO:100条记录在62毫秒内插入,总计数=100。100条记录在60367毫秒内被插入。总计数=200。新的查询正在建立...

INFO:100条记录在64540毫秒内被插入,总计数=200。100条记录在64540毫秒内被插入。总数=300。新的查询正在建立...

java oracle jdbc resultset
1个回答
0
投票

试试

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

会很快

将100改为你的行数。

© www.soinside.com 2019 - 2024. All rights reserved.