使用多线程将数据从 Excel 文件复制到数据库
Copy data from Excel file to Database using Mutlithreading
我需要将大量数据从 excel(5,00,000) 行复制到数据库。我应该使用多线程的阻塞队列方法还是有任何其他方法可以更有效地利用多线程?
如今 500.000 行对于数据库来说并不是那么大。
我认为您首先应该优化数据库访问,如果您没有达到预期的性能,请采用更先进的技术。
您已经陈述 Java,想到了 2 个这样的优化:
- 使用准备好的语句而不是来自 JDBC 的语句(或者如果您在 JDBC 上使用任何抽象,请确保在幕后就是这种情况)。这将允许数据库不会每次都重新解析查询
使用批量操作。根据您的 RDBMS 设置,单独将速度提高一个数量级左右:
PreparedStatement pstmt = connection.prepareStatement(<YOUR_INSERT_SQL>);
for(...) { // chose batch size like 500 to 2000
pstmt.setXXX(<bind the parameters here>)
pstmt.addBatch(); // add to the batch
}
pstmt.executeBatch(); // does bunch of inserts at once
执行所有这些操作可能需要不到一分钟的时间,或者 1-2 分钟,但不是几个小时(当然取决于您插入数据的位置和网络质量,但通常这是一个例)。
如果还不够,当然可以并行访问,同时使用多个连接。但是同样,如果它是一次性操作,我也不会打扰,毕竟编写这个多线程代码会花费你更多的时间,而不是你获得的性能差异:)
如果您想使用多线程来更好地提高性能,您可以为每个 table 创建一个线程,然后尝试对 table 执行数据库操作。对于线程管理,您可以使用执行器服务、线程池执行器等。
我需要将大量数据从 excel(5,00,000) 行复制到数据库。我应该使用多线程的阻塞队列方法还是有任何其他方法可以更有效地利用多线程?
如今 500.000 行对于数据库来说并不是那么大。 我认为您首先应该优化数据库访问,如果您没有达到预期的性能,请采用更先进的技术。 您已经陈述 Java,想到了 2 个这样的优化:
- 使用准备好的语句而不是来自 JDBC 的语句(或者如果您在 JDBC 上使用任何抽象,请确保在幕后就是这种情况)。这将允许数据库不会每次都重新解析查询
使用批量操作。根据您的 RDBMS 设置,单独将速度提高一个数量级左右:
PreparedStatement pstmt = connection.prepareStatement(<YOUR_INSERT_SQL>); for(...) { // chose batch size like 500 to 2000 pstmt.setXXX(<bind the parameters here>) pstmt.addBatch(); // add to the batch } pstmt.executeBatch(); // does bunch of inserts at once
执行所有这些操作可能需要不到一分钟的时间,或者 1-2 分钟,但不是几个小时(当然取决于您插入数据的位置和网络质量,但通常这是一个例)。
如果还不够,当然可以并行访问,同时使用多个连接。但是同样,如果它是一次性操作,我也不会打扰,毕竟编写这个多线程代码会花费你更多的时间,而不是你获得的性能差异:)
如果您想使用多线程来更好地提高性能,您可以为每个 table 创建一个线程,然后尝试对 table 执行数据库操作。对于线程管理,您可以使用执行器服务、线程池执行器等。