Java 检索百万条记录并将其插入表中

Java 检索百万条记录并将其插入表中,java,performance,sql-server-2008,jdbc,pagination,Java,Performance,Sql Server 2008,Jdbc,Pagination,有一列我想检索并插入到另一个表中 例如,下面是我要检索值的第一个表 表1 记录 1 ABC新加坡 2 DEF越南 我从表1中检索上面的列值,然后插入到另一个表中,如下所示 表2 ID名称国家/地区 1 ABC新加坡 2 DEF越南名称 目前,我可以使用java,首先检索记录,然后拆分值并插入。然而,当Table1有数百万条记录要检索并将这些百万条记录插入Table2时,我希望通过批处理或分页来实现更好的性能 任何指示我如何在我的情况下使用分页将不胜感激 如果您需要在代码中使用MSSQL 2008

有一列我想检索并插入到另一个表中 例如,下面是我要检索值的第一个表

表1
记录
1 ABC新加坡
2 DEF越南

我从表1中检索上面的列值,然后插入到另一个表中,如下所示

表2
ID名称国家/地区
1 ABC新加坡
2 DEF越南名称

目前,我可以使用java,首先检索记录,然后拆分值并插入。然而,当Table1有数百万条记录要检索并将这些百万条记录插入Table2时,我希望通过批处理或分页来实现更好的性能

任何指示我如何在我的情况下使用分页将不胜感激

如果您需要在代码中使用MSSQL 2008(而不是在SQL中,即使使用多个分隔符也会更容易),那么您可能希望使用具有适当批量大小的批插入,并在您的选择上结合良好的获取大小:

    //Prepare statements first
    try(PreparedStatement select = con.prepareStatement("SELECT * FROM SOURCE_TABLE");
            PreparedStatement insert = con.prepareStatement("INSERT INTO TARGET_TABLE(col1, col2, col3) VALUES (?,?,?)")) {

        //Define Parameters for SELECT
        select.setFetchDirection(ResultSet.FETCH_FORWARD);
        select.setFetchSize(10000);

        int rowCnt = 0;

        try(ResultSet rs = select.executeQuery()) {
            while(rs.next()) {
                String row = rs.getString(1);
                String[] split = row.split(" |\\$|\\*"); //However you want to do that
                //Todo: Error handling for array length

                //Todo: Type-Conversions, if target data is not a string type
                insert.setString(1, split[0]);
                insert.setString(2, split[1]);
                insert.setString(3, split[2]);
                insert.addBatch();

                //Submit insert in batches of a good size:
                if(++rowCnt % 10000 == 0) {
                    int[] success = insert.executeBatch();
                    //Todo: Check if that worked.
                }
            }
            //Handle remaining inserts
            int[] success = insert.executeBatch();
            //Todo: Check if that worked.               
        }

    } catch(SQLException e) {
        //Handle your Exceptions
    }

关于“好”取和批大小的计算,你要考虑一些参数:

  • Fetchsize会影响客户端的内存消耗。如果您有足够的内存,您可以将其变大

  • 提交数百万行的插入将需要一些时间。根据您的要求,您可能希望每隔一段时间提交一次插入事务(每250.000次插入?)

  • 考虑事务隔离:确保关闭自动提交,因为提交每个插入将使大部分批处理收益消失


为什么不使用sql脚本呢?但考虑到您的记录格式对于每个记录都是相同的。使用sql将非常简单高效。您可以编写
Split()
拆分记录然后从表1插入查询值的函数只有一个列值。我需要先在sql脚本内部拆分,然后插入表2中,不知道如何拆分,而且sql脚本不是很熟练:(以下是如何编写拆分函数,然后需要将传入的记录插入所需的表中如果我使用sql脚本,即使有r百万条记录也会更有效?是的。因为DBMS是为处理和处理大型数据库和大量记录而构建的。嘿,简,谢谢。实际上我是用sql脚本完成的。不过,我会尝试一下这又是一次。知道如何在java中使用批处理查询没有什么坏处。谢谢