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

8
我有一些从磁盘流式传输并由Java应用程序在内存中进行处理的数据,最终需要复制到SQL Server中。数据可能相当大(因此需要流媒体),并且可能需要插入多达数十万行。最快的解决方案似乎是使用SQL Server的批量复制功能。但是,我还没有找到任何Java程序可以轻松或几乎快速完成此操作的方法。
以下是我已经调查过的一些方法:
  • 使用.NET中的SqlBulkCopy类。这非常高效,因为您可以直接从数据源流式传输数据并将其发送到SQL Server。这种方法的问题在于您需要运行.NET。也许可以使用Java到.NET桥来使用此功能。不过,我想知道在运行时之间传递数据的成本。

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

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

  • 使用C API。同样,非常高效,但您需要使用C。可以通过JNI使用此功能。如果有一些免费的Java库可以做到这一点,我想知道它们。

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

谢谢!


当您说数据源是Java时,能否详细说明一下?数据是否在Java应用程序/小程序的内存中? - Jagmag
感谢您的回复,In Sane。我已经将问题详细说明了一下。 - Tristan St-Cyr
3个回答

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

如果我选择其中一种解决方案,这个答案提供了一些有用的信息。如果有人已经编写了一个很好的免费库,将C API封装成更好的接口,那就太棒了。也许最终我会自己动手做这件事。 - Tristan St-Cyr

0

0
自从Microsoft JDBC驱动程序的版本4.2以来,就有一个名为com.microsoft.sqlserver.jdbc.SQLServerBulkCopy的类,它与.NET的SqlBulkCopy类相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接