Java 如何有效地将数据从CSV加载到数据库中?

Java 如何有效地将数据从CSV加载到数据库中?,java,sql,database,postgresql,database-performance,Java,Sql,Database,Postgresql,Database Performance,我有一个包含数据的CSV/TSV文件,希望将该CSV数据加载到数据库中。我正在使用Java或Python和PostgreSQL来实现这一点(我无法改变这一点) 问题是,对于每一行,我都会进行一次插入查询,如果我有600.000行,那么效率就没有那么高了。有没有更有效的方法 我想知道我是否可以获取更多行,只创建一个大查询并在我的数据库上执行它,但我不确定这是否有帮助,或者我应该将数据分成100个部分并执行100个查询?如果CSV文件与,那么最有效的方法就是使用CopyManagerAPI 参见或示

我有一个包含数据的CSV/TSV文件,希望将该CSV数据加载到数据库中。我正在使用Java或Python和PostgreSQL来实现这一点(我无法改变这一点)

问题是,对于每一行,我都会进行一次插入查询,如果我有600.000行,那么效率就没有那么高了。有没有更有效的方法


我想知道我是否可以获取更多行,只创建一个大查询并在我的数据库上执行它,但我不确定这是否有帮助,或者我应该将数据分成100个部分并执行100个查询?

如果CSV文件与,那么最有效的方法就是使用
CopyManager
API

参见或示例代码


如果您的输入文件与Postgres的copy命令不兼容,您需要自己编写INSERT。但您可以通过使用JDBC批处理来加速该过程:

大致如下:

PreparedStatement insert=connection.prepareStatement(“插入…”);
int batchSize=1000;
int batchRow=0;
//迭代文件中的行
而(…){
…分析行,提取列。。。
插入.setInt(1,…);
插入固定管柱(2,…);
插入.setXXX(…);
insert.addBatch();
batchRow++;
如果(batchRow==batchSize){
insert.executeBatch();
batchRow=0);
}
}
insert.executeBatch();

在中使用
reWriteBatchedInserts=true
将进一步提高性能

如果CSV文件与所需格式兼容,则最有效的方法是使用
CopyManager
API

参见或示例代码


如果您的输入文件与Postgres的copy命令不兼容,您需要自己编写INSERT。但您可以通过使用JDBC批处理来加速该过程:

大致如下:

PreparedStatement insert=connection.prepareStatement(“插入…”);
int batchSize=1000;
int batchRow=0;
//迭代文件中的行
而(…){
…分析行,提取列。。。
插入.setInt(1,…);
插入固定管柱(2,…);
插入.setXXX(…);
insert.addBatch();
batchRow++;
如果(batchRow==batchSize){
insert.executeBatch();
batchRow=0);
}
}
insert.executeBatch();

在中使用
reWriteBatchedInserts=true
将进一步提高性能

假设服务器可以直接访问文件,您可以尝试使用命令。如果您的CSV格式不正确,将其转录到COPY命令将处理的内容(例如,复制到服务器可以访问的位置时)可能会更快。

如果服务器可以直接访问文件,您可以尝试使用该命令。如果您的CSV格式不正确,则将其转录到COPY命令将处理的内容(例如,复制到服务器可以访问的位置时)可能会更快。

答案是可以。我认为您正在搜索名为“批量插入”的内容。谢谢你,@ZiemowitStolarczyk:)答案是可以的。我认为您正在搜索名为“批量插入”的内容。谢谢你,@ZiemowitStolarczyk:)非常感谢你的回答非常感谢您的回答。:)没关系,似乎Ziemowit Stolarczyk已经链接到一个想法几乎相同但解释得更好的答案=)没关系,似乎Ziemowit Stolarczyk已经链接到一个想法几乎相同但解释得更好的答案=)