2010-08-08 37 views
5

Cách tốt nhất/hiệu quả nhất để chèn 1000 hàng vào một bảng (cơ sở dữ liệu jdbc/connector-mysql) là gì? (nó là một bộ đệm và cần phải được đổ vào cơ sở dữ liệu mỗi khi nó đầy)Chèn nhiều SQL hiệu quả

1- Một câu lệnh SQL được tạo/đồng bộ tự động?

2- for (int i = 0; i<1000; i++) { con.prepareStatement(s.get(i)); } con.commit();

3- Quy trình lưu trữ?

4- Chèn dữ liệu hàng loạt qua tệp?

5- (giải pháp của bạn)

Trả lời

2

The LOAD DATA INFILE statement có lẽ là cách tốt nhất để thực hiện. (# 4 từ danh sách các tùy chọn ở trên) Mặc dù nó có thể mất nhiều mã hơn để hoàn thành nhiệm vụ của bạn vì bạn cần tạo tệp trung gian, đưa nó vào máy chủ và sau đó gọi LOAD DATA để đưa nó vào db của bạn.

trang MySql Trợ giúp trích dẫn:

tải tuyên bố DATA INFILE đọc hàng từ một file văn bản vào một bảng tại một tốc độ rất cao.

+0

Sử dụng phương pháp này một cách thận trọng. Tôi đã thấy các hệ thống đã thực hiện điều này trong quá khứ và chi phí tạo tệp trung gian và vận chuyển nó đến máy chủ đã vượt quá lợi ích hiệu suất của việc sử dụng thao tác tải tệp nhanh. –

+0

Có vẻ rất nguy hiểm vì chúng tôi có hai máy chủ ứng dụng đồng thời truy cập vào cùng một cơ sở dữ liệu. Tôi thực sự sợ câu trả lời đó. Cảm ơn tất cả vì đã trả lời của bạn. –

0

Bạn có thể sử dụng chèn hàng loạt JDBC.

PreparedStatement ps = cn.prepareStatement("INSERT INTO...."); 

for (int i = 0; i < 1000; i++) { 
    ps.setString(1, "value-" + i); // Set values 
    ps.addBatch();     // Add this to the batch 
    ps.clearParameters();   // Reset the parameters 
} 

ps.executeBatch(); 

Tuy nhiên MySQL không hỗ trợ chức năng batch chèn natively, vì vậy để có được hiệu suất hợp lý, bạn sẽ cần phải thêm rewriteBatchedStatements=true để cấu hình mysql jdbc của bạn.

Ngoài ra còn có cú pháp chèn lô hàng cụ thể của MySQL mà bạn có thể sử dụng nếu bạn muốn tạo một chuỗi SQL lớn. Tôi sẽ thử cả hai và kiểm tra hiệu suất.

INSERT INTO x (a,b) 
    VALUES ('1', 'one'), 
      ('2', 'two'), 
      ('3', 'three'); 

Hãy cẩn thận với cả hai cách tiếp cận vì bạn có thể vượt quá kích thước gói tối đa cho một yêu cầu. Bạn có thể cần phải đặt kích thước lô khác với số lượng mục nhập trong bộ đệm của bạn. Ví dụ. bạn có thể cần chia 1000 mục trên 10 lô 100.

0

Lưu ý rằng JDBC tự động cam kết sau mỗi câu lệnh, trừ khi bạn rõ ràng không cho phép. Làm như vậy và chạy X chèn trước khi chạy cam kết, nên cải thiện hiệu suất của bạn khá một chút.

+0

tôi quên viết rằng tôi đã sử dụng c3p0. vì vậy tôi phải cam kết vào cuối. –

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