java - ResultSet next() 性能极慢

标签 java oracle jdbc resultset

我试图从 Oracle 数据库中获取一些结果,然后使用 jdbc 批处理将这些行插入到另一个 Oracle 数据库中。但是使用 resultset.next() 的 while 循环非常慢。

选择查询包括 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():

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

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

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

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

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

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

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

最佳答案

尝试

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

速度会很快

将 100 更改为行大小。

关于java - ResultSet next() 性能极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36694911/

相关文章:

jdbc - 如何编写带有两个的查询?按顺序占位符?

java - 如何通过连接池实现多线程

java - 如何在 switch case 中使用 Map 中的 int 值?

Java - 不使用列表搜索文件

java - 使用 Java GroupLayout 定位

sql - 如何在oracle中提取或更新xml属性值

sql - 如何从物理文件更新 CLOB 列?

java - 如何使用 java 读取注册表值?

sql-server - 将 Oracle sql "CONNECT BY LEVEL"转换为 T-SQL

sql - JDBC 使用 UPDATE FROM 状态