2010-09-19 36 views
8

Tôi có dữ liệu được truyền từ đĩa và được xử lý trong bộ nhớ bằng ứng dụng Java và cuối cùng cần được sao chép vào SQL Server. Dữ liệu có thể khá lớn (do đó phát trực tuyến) và có thể yêu cầu lên đến 100.000 hàng để chèn vào. Giải pháp nhanh nhất có vẻ là sử dụng tính năng sao chép số lượng lớn của SQL Server. Tuy nhiên, tôi đã không tìm thấy bất kỳ cách nào cho các chương trình Java để làm điều này một cách dễ dàng hoặc gần đủ nhanh.Cách hiệu quả nhất để sao chép số lượng lớn vào SQL Server từ Java là gì?

Dưới đây là một số cách mà tôi đã điều tra:

  • Sử dụng lớp SqlBulkCopy trong .NET. Điều này rất hiệu quả vì bạn có thể truyền dữ liệu ngay từ nguồn dữ liệu và thẳng đến SQL Server. Vấn đề với cách tiếp cận này là bạn cần phải chạy .NET. Có lẽ điều này có thể được sử dụng bằng cách sử dụng một Java để. NET cầu. Mặc dù, tôi tự hỏi về chi phí của dữ liệu marshalling giữa runtimes.

  • Sử dụng câu lệnh TSUL INSERT TSQL. Vấn đề với điều này là bạn cần tạo một tệp được định dạng đúng trên đĩa. Tôi đã nhìn thấy một số lợi ích hiệu suất nhỏ hơn chèn hàng loạt của JDBC bằng cách sử dụng này. Ngoài ra, điều này chỉ hữu ích tại địa phương.

  • Ghi tệp vào đĩa và sử dụng tiện ích dòng lệnh bcp. Vẫn còn nhanh hơn một chút so với chèn hàng loạt JDBC nhưng không nhiều. Tôi cũng mất khả năng sử dụng giao dịch với phương thức này.

  • Sử dụng C API. Một lần nữa, rất hiệu quả, nhưng bạn cần phải sử dụng C. Sẽ có một cách để sử dụng điều này thông qua JNI. Nếu có một số thư viện Java miễn phí ngoài kia thực hiện điều này, tôi muốn biết về nó.

Tôi đang tìm giải pháp nhanh nhất. Bộ nhớ không phải là một vấn đề.

Cảm ơn!

+0

Khi bạn nói rằng Nguồn dữ liệu là Java - bạn có thể xây dựng được không? Dữ liệu có trong bộ nhớ của một ứng dụng/applet Java không? – InSane

+0

Cảm ơn bạn đã trả lời Trong Sane. Tôi đã đặt câu hỏi chi tiết hơn một chút. –

Trả lời

1
  • Đối với câu trả lời .NET tôi khuyên dùng IKVM. Sau đó, mã Java của bạn sẽ là mã .NET và bạn có thể gọi bất kỳ mã .NET nào.
  • BULK INSERT cũng yêu cầu tệp hàng loạt có thể truy cập được từ SQL Server. Đây chỉ là một tùy chọn cục bộ. Hiệu suất từ ​​Cập nhật hàng loạt có thể khác nhau giữa các trình điều khiển JDBC khác nhau.
  • Đối với các cuộc gọi tự nhiên, tôi khuyên bạn nên sử dụng JNA (truy cập gốc Java). Sau đó, bạn không cần viết bất kỳ mã C nào.
+0

Câu trả lời này có một số thông tin hữu ích nếu tôi từng đi với một trong các giải pháp đó. Thật tuyệt vời nếu có ai đó đã viết một thư viện miễn phí tuyệt vời bao bọc API C thành giao diện đẹp hơn. Tôi có thể tự mình làm điều này. –

0

Kể từ phiên bản 4.2 của trình điều khiển Microsoft JDBC cho SQL Server, có một lớp có tên là com.microsoft.sqlserver.jdbc.SQLServerBulkCopy tương tự như lớp học SqlBulkCopy của .NET.

Các vấn đề liên quan