我有数据从磁盘流式传输并由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库可以做到这一点,我想知道它。
我正在寻找最快的解决方案。记忆不是问题。
谢谢!
答案 0 :(得分:1)
答案 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
类相同。