从Java批量复制到SQL Server的最有效方法是什么?

时间:2010-09-19 16:15:57

标签: java sql-server bulkinsert

我有数据从磁盘流式传输并由Java应用程序在内存中处理,最终需要复制到SQL Server中。数据可能相当大(因此是流式传输),并且可能需要插入多达100,000个行。最快的解决方案似乎是使用SQL Server的批量复制功能。但是,我还没有找到任何方法让Java程序能够轻松或快速地完成这项工作。

以下是我已经研究过的一些方法:

  • 在.NET中使用SqlBulkCopy类。这非常有效,因为您可以直接从数据源直接流式传输数据到SQL Server。这种方法的问题是你需要运行.NET。也许这可以使用Java to .NET桥来使用。虽然,我想知道运行时间之间编组数据的成本。

  • 使用BULK INSERT TSQL语句。这个问题是您需要在磁盘上创建格式正确的文件。我已经看到使用这个比JDBC的批量插入有一些小的性能提升。此外,这仅在本地有用。

  • 将文件写入磁盘并使用bcp命令行实用程序。仍然比JDBC批量插入快一点但不是那么多。我也失去了使用此方法进行交易的能力。

  • 使用C API。再次,非常有效,但你需要使用C.有一种方法可以通过JNI使用它。如果有一些免费的Java库可以做到这一点,我想知道它。

我正在寻找最快的解决方案。记忆不是问题。

谢谢!

3 个答案:

答案 0 :(得分:1)

  • 对于.NET的回答,我建议使用IKVM。然后您的Java代码将是.NET代码,您可以调用任何.NET代码。
  • BULK INSERT还要求可以从SQL Server访问批量文件。这只是一个本地选项。批处理更新的性能可能因不同的JDBC驱动程序而异。
  • 对于本机调用,我建议使用JNA(Java本机访问)。然后你不需要编写任何C代码。

答案 1 :(得分:0)

对我来说,最好的选择是使用DataDirect的商业SQL Server JDBC驱动程序,以及在Linux和Windows上运行的标准JDBC调用addBatch / executeBatch - https://blogs.datadirect.com/2012/05/how-to-bulk-insert-jdbc-batches-into-microsoft-sql-server-oracle-sybase.html

我看到加载时间从7小时提高到30分钟以下。

答案 2 :(得分:0)

从用于SQL Server的Microsoft JDBC驱动程序的4.2版开始,有一个名为com.microsoft.sqlserver.jdbc.SQLServerBulkCopy的类与.NET的SqlBulkCopy类相同。