2010-02-10 63 views
7

Tôi đang phát triển một ứng dụng Java sẽ truy vấn các bảng có thể chứa hơn 1.000.000 bản ghi. Tôi đã thử tất cả mọi thứ tôi có thể để có hiệu quả nhất có thể nhưng tôi chỉ có thể đạt được trên trung bình. khoảng 5.000 bản ghi một phút và tối đa 10.000 bản ghi tại một thời điểm. Tôi đã thử kỹ thuật đảo ngược trình tải dữ liệu và mã của tôi có vẻ rất giống nhưng vẫn không có may mắn.Truy vấn trên 1.000.000 bản ghi bằng API Java của Salesforce và tìm cách tiếp cận tốt nhất

Có phải là một giải pháp khả thi ở đây không? Tôi đã thử điều này nhưng với kết quả rất tối thiểu.

Tôi đã đọc và đã áp dụng mọi thứ có thể có vẻ như (nén yêu cầu/phản hồi, chủ đề, v.v.) nhưng tôi không thể đạt được trình tải dữ liệu như tốc độ.

Để lưu ý, có vẻ như phương thức queryMore dường như là cổ chai.

Có ai có bất kỳ mẫu mã hoặc trải nghiệm nào họ có thể chia sẻ để chỉ đạo tôi đi đúng hướng không?

Cảm ơn

+0

Chúng tôi đã đưa ra yêu cầu tương tự, tôi tin rằng bạn đã có giải pháp tốt hơn. Bạn có thể chỉ cho tôi hướng đi đúng đắn và các mẫu/ví dụ mã sẽ giúp tôi rất nhiều. – Sukhhhh

Trả lời

-1

trễ sẽ là một kẻ giết người đối với loại tình huống - và các giải pháp sẽ là một trong hai multi-thread, hoặc hoạt động không đồng bộ (sử dụng NIO). Tôi sẽ bắt đầu bằng cách chạy 10 luồng công nhân song song và xem sự khác biệt của nó làm gì (giả sử rằng hỗ trợ back-end đồng thời được nhận).

Tôi không có bất kỳ mã cụ thể nào hoặc bất kỳ thứ gì tôi có thể cung cấp ở đây, xin lỗi - chỉ trải nghiệm đau đớn với các cuộc gọi API đi qua các mạng có độ trễ cao.

+0

10 chủ đề sẽ đưa bạn thẳng vào các giới hạn yêu cầu đồng thời và làm cho vấn đề tồi tệ hơn, không tốt hơn. – superfell

4

Với API Salesforce, giới hạn kích thước lô là những gì thực sự có thể làm chậm bạn xuống. Khi bạn sử dụng truy vấn/truy vấnCác phương pháp khác, kích thước lô tối đa là 2000. Tuy nhiên, mặc dù bạn có thể chỉ định 2000 là kích thước lô trong tiêu đề SOAP của bạn, Salesforce có thể gửi các lô nhỏ hơn để phản hồi. Quyết định kích thước hàng loạt của họ dựa trên hoạt động của máy chủ cũng như đầu ra của truy vấn ban đầu của bạn.

tôi đã nhận thấy rằng nếu tôi gửi một truy vấn mà bao gồm bất kỳ "text" lĩnh vực, quy mô hàng loạt được giới hạn 50.

Đề nghị của tôi sẽ là để đảm bảo các truy vấn của bạn chỉ kéo dữ liệu mà bạn cần . Tôi biết rất nhiều bảng Salesforce kết thúc với rất nhiều trường tùy chỉnh có thể không cần thiết cho mọi tích hợp.

Salesforce documentation về chủ đề này

+0

Bạn có thể cung cấp tiêu đề mẫu có kích thước hàng loạt trong khi gọi /services/async/35.0/job/{job_id}/batch REST API không? – Hussain

1

Hiện có khoảng 14000 bản ghi trong tài khoản của chúng tôi phản đối và phải mất khá nhiều thời gian để có được tất cả các hồ sơ. Tôi thực hiện một truy vấn mà mất khoảng một phút nhưng SF chỉ trả về lô không quá 500 ngay cả khi tôi đặt batchsize đến 2000. Mỗi truy vấn hoạt động thêm mất từ ​​45 giây đến một phút cũng có. Giới hạn này khá bực bội khi bạn cần lấy dữ liệu hàng loạt.

+0

Bạn đã cung cấp kích thước hàng loạt cho api như thế nào? Sử dụng tiêu đề? Vui lòng chia sẻ tiêu đề đó. – Hussain

5

Cách tiếp cận mà tôi đã sử dụng trong quá khứ là chỉ truy vấn các ID mà bạn muốn (giúp truy vấn nhanh hơn đáng kể). Sau đó bạn có thể song song việc truy xuất() trên một số luồng.

Đó trông giống như sau:

[truy vấn thread] -> BlockingQueue -> [bơi thread làm lấy()] -> BlockingQueue

Các chủ đề đầu tiên thực hiện truy vấn() và queryMore() như nhanh như nó có thể, viết tất cả các id nó được vào BlockingQueue. queryMore() không phải là một cái gì đó bạn nên gọi đồng thời, theo như tôi biết, vì vậy không có cách nào để song song bước này.Tất cả các id được viết vào một BlockingQueue. Bạn có thể gói chúng thành các bó vài trăm để giảm tranh chấp khóa nếu điều đó trở thành vấn đề. Sau đó, một nhóm luồng có thể thực hiện các lệnh gọi lấy lại() trên các id để nhận tất cả các trường cho các SObject và đặt chúng trong hàng đợi cho phần còn lại của ứng dụng của bạn để xử lý.

Tôi đã viết một thư viện Java để sử dụng API SF có thể hữu ích. http://blog.teamlazerbeez.com/2011/03/03/a-new-java-salesforce-api-library/

1

Sử dụng Bulk-api để truy vấn bất kỳ số lượng bản ghi nào từ Java. Tôi đang sử dụng nó và thực hiện rất hiệu quả ngay cả trong vài giây bạn nhận được kết quả. Chuỗi được trả về được phân tách bằng dấu phẩy. Thậm chí bạn có thể duy trì các lô nhỏ hơn hoặc bằng 10k để lấy các bản ghi trong CSV (sử dụng csv mở) hoặc trực tiếp trong chuỗi.

Hãy cho tôi biết nếu bạn yêu cầu trợ giúp mã.

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