2010-02-10 57 views
7

我正在開發一個Java應用程序,該應用程序將查詢可能容納超過1,000,000條記錄的表。我嘗試了儘可能高效的一切,但我只能在平均水平上達到目標。每分鐘約5000條記錄,最多10,000條記錄。我曾嘗試對數據加載器進行反向工程,並且我的代碼似乎非常相似,但仍然沒有運氣。使用salesforce Java API查詢1,000,000條記錄並尋找最佳方法

是在這裏線程一個可行的解決方案?我已經嘗試過,但結果很少。

我一直在閱讀和應用每一個可能的東西似乎(壓縮請求/響應,線程等),但我無法實現像速度一樣的數據加載器。

要注意,似乎查詢更多的方法似乎是瓶頸。

有沒有人有任何代碼樣本或經驗,他們可以分享引導我在正確的方向?

由於

+0

我們進入了相同的要求,我相信你已經有了更好的解決方案。你能指點我的正確方向,代碼示例/示例會對我有很大的幫助。 – Sukhhhh 2012-01-03 09:26:09

回答

-1

延遲將是對這種類型的情況殺手 - 和溶液將或者多線程,或異步操作(使用NIO)。我會先開始並行運行10個工作線程,看看它有什麼不同(假設後端支持同時獲取)。

我沒有任何具體的代碼或任何我可以在這裏提供的內容,對不起 - 只是通過API調用經歷高延遲網絡的痛苦體驗。

+0

10個線程將使您直接進入併發請求限制,並使問題變得更糟,而不是更好。 – superfell 2010-06-08 03:52:38

4

使用Salesforce API時,批量大小限制可能會讓您減慢速度。當您使用query/queryMore方法時,最大批處理大小爲2000.但是,即使您可以在SOAP頭中指定2000作爲批處理大小,Salesforce也可能發送較小的批處理作爲響應。他們的批量大小決定基於服務器活動以及原始查詢的輸出。

我注意到,如果我提交一個查詢,包括任何「文本」字段,批量大小被限制在50

我的建議是,以確保您的查詢只拉你需要的數據。我知道很多Salesforce表最終都有許多自定義字段,可能不是每個集成都需要的字段。

在這個問題上

+0

您可以在調用/services/async/35.0/job/{job_id}/batch REST API時提供具有批量大小的示例頭文件嗎? – Hussain 2015-11-03 05:58:35

1

我們有我們的帳戶約14000條記錄Salesforce documentation對象,它需要相當長的時間把所有的記錄。我執行查詢需要大約一分鐘,但SF只返回不超過500個批次,即使我將batchsize設置爲2000.每個查詢更多的操作需要45秒到1分鐘。當您需要獲取批量數據時,此限制是相當令人沮喪的。

+0

你是如何向api提供批量大小的?使用標題?請分享該標題。 – Hussain 2015-11-03 06:00:01

5

我過去使用的一種方法是僅查詢您想要的ID(這使查詢顯着更快)。然後,您可以跨多個線程並行檢索()。

這看起來是這樣的:

[查詢線索] - >的BlockingQueue - > [線程池做檢索()] - > BlockingQueue的

第一個線程執行查詢()和queryMore()作爲儘可能快地寫入所有的ID到BlockingQueue中。就我所知,queryMore()不是你應該同時調用的東西,所以沒有辦法並行化這一步。所有的id都被寫入BlockingQueue。你可能希望將它們打包成幾百個捆綁包,以減少鎖爭用,如果這成爲一個問題。然後,線程池可以在ID上執行併發retrieve()調用,以獲取SObjects的所有字段,並將它們放入隊列中供其他應用程序處理。

我寫了一個使用SF API的Java庫,可能有用。 http://blog.teamlazerbeez.com/2011/03/03/a-new-java-salesforce-api-library/

1

利用Bulk-api從Java中查詢任意數量的記錄。我正在利用它,甚至在幾秒鐘內就可以非常有效地實現結果。返回的字符串以逗號分隔。即使您可以保持小於或等於10k的批次以使用CSV(使用open csv)或直接在String中獲取記錄。

讓我知道你是否需要代碼幫助。