java - 如何存储1000行及之后执行批处理?

标签 java sql prepared-statement

我正在尝试向数据库插入大量数据(几百万行),并且我想使用“批量”来完成此操作。所以,我有一个方法,它从 csv 接收 1000 行,并且它将在 for 循环迭代所有这 1000,000 行之后执行批处理,依此类推。我写了这个方法,但它似乎只向数据库添加了这 1000 行中的一行。

这是我尝试过的。

public void insertToDatabase(List<Account> listOfAccounts, Connection connection){

    PreparedStatement preparedStatement = null;
    try
    {
        preparedStatement = connection.prepareStatement( INSERT_ACCOUNT_QUERY );
    }
    catch( SQLException e1 )
    {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try
    {

        for( Account account : listOfAccounts )
        {

            connection.setAutoCommit( false );


            preparedStatement.setString( 1, account.getFirstName( ) );
            preparedStatement.setString( 2, account.getLastName( ) );
            preparedStatement.setInt( 3, account.getHomeTellNumber( ) );
            preparedStatement.setInt( 4, account.getMobileTellNumber( ) );
            preparedStatement.setString( 5, account.getAddress( ) );
            preparedStatement.setString( 6, account.getCity( ) );
            preparedStatement.setString( 7, account.getState( ) );
            preparedStatement.setString( 8, account.getJob( ).getCode( ) );
            preparedStatement.setString( 9, account.getLocale( ).getCode( ) );

            preparedStatement.addBatch( );
        }


        preparedStatement.executeBatch( );

    }

    catch( SQLException e )
    {
        // TODO Auto-generated catch block
        e.printStackTrace( );
    }
    finally
    {
        try
        {
            preparedStatement.close( );
        }
        catch( SQLException e )
        {
            // TODO Auto-generated catch block
            e.printStackTrace( );
        }
    }
}

因此,该方法仅将列表中的最后一个元素插入数据库,而不是在最后一次添加所有元素。

谢谢。

最佳答案

如果您启用自动提交,您当前的脚本应该可以工作。由于您已将自动提交设置为 false,因此您必须显式提交更新:

preparedStatement.executeBatch();
// add the next line
connection.commit();

我建议仅启用自动提交。如果您怀疑您的 JDBC 驱动程序默认具有此设置,则只需在进入循环之前调用以下一次即可:

connection.setAutoCommit(true);

然后,您就不必显式提交您的工作。

关于java - 如何存储1000行及之后执行批处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53862937/

相关文章:

php - pdo 准备好的语句不更新

java - 如何创建一个 boolean 方法来确定是否已经过了足够多的秒

java - 如何使用 WSO2 ESB XSLT 中介器将 <?xml-multiple?> 元素添加到 DSS 输出的特定位置?

java - 为什么在java中同时运行和开始调用

sql - 使用 Date.today 加入命名范围的一部分

php - 使用 php 的 mysqli 准备好的语句很慢

java - 将 MD5 messageDigest 从 Java 转换为 Digest::MD5 Ruby

php - 7 个带有内连接的查询到 1 个查询,mysql

sql - SQL语法错误:“(”附近

mysql - 列到行转换: MySQL