我正在尝试向数据库插入大量数据(几百万行),并且我想使用“批量”来完成此操作。所以,我有一个方法,它从 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/