Как хранить 1000 строк и после выполнения партии? - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь вставить в базу данных огромное количество данных (несколько миллионов строк), и я хочу сделать это с помощью «пакетов».Итак, у меня есть метод, который получает, скажем, 1000 строк из CSV, и он будет выполнять пакет после цикла for для всех этих 1000 тысяч строк и так далее.Я написал метод, но кажется, что он добавляет в базу данных только одну строку из этих 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( );
        }
    }
}

Таким образом, метод вставки в базу данных толькопоследний элемент из списка, чтобы добавить их все сразу, в конце.

Спасибо.

1 Ответ

0 голосов
/ 20 декабря 2018

Если вы оставили автоматическую фиксацию включенной, ваш текущий скрипт должен работать.Поскольку вы установили автоматическую фиксацию в false, вы должны явно зафиксировать свое обновление:

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

Я рекомендую просто оставить автоматическую фиксацию включенной.Если вы подозреваете, что ваш драйвер JDBC имеет этот параметр по умолчанию, просто вызовите следующее, прежде чем вы попадете в цикл:

connection.setAutoCommit(true);

Тогда вам не придется явно фиксировать свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...