7

我正在开发一个 Java 应用程序,它将查询可能包含超过 1,000,000 条记录的表。我已经尽我所能尽可能提高效率,但我只能达到平均水平。每分钟大约 5,000 条记录,一次最多记录 10,000 条。我已经尝试对数据加载器进行逆向工程,我的代码似乎非常相似,但仍然没有运气。

线程在这里是一个可行的解决方案吗?我已经尝试过了,但结果非常少。

我一直在阅读并应用了所有可能的东西(压缩请求/响应、线程等),但我无法实现像速度这样的数据加载器。

需要注意的是,queryMore 方法似乎是瓶颈。

有没有人可以分享任何代码示例或经验来引导我朝着正确的方向前进?

谢谢

4

5 回答 5

5

我过去使用的一种方法是仅查询您想要的 ID(这使查询速度显着加快)。然后,您可以跨多个线程并行化 retrieves()。

看起来像这样:

[查询线程] -> BlockingQueue -> [执行retrieve()的线程池] -> BlockingQueue

第一个线程尽可能快地执行 query() 和 queryMore(),将它进入的所有 id 写入 BlockingQueue。queryMore() 不是你应该同时调用的东西,据我所知,所以没有办法并行化这一步。所有 id 都写入 BlockingQueue。如果这成为一个问题,您可能希望将它们打包成几百个包以减少锁争用。然后,线程池可以对 id 执行并发检索()调用,以获取 SObject 的所有字段,并将它们放入队列中以供应用程序的其余部分处理。

我编写了一个 Java 库来使用可能有用的 SF API。http://blog.teamlazerbeez.com/2011/03/03/a-new-java-salesforce-api-library/

于 2011-03-03T17:30:25.183 回答
4

使用 Salesforce API,批量大小限制会真正减慢您的速度。当您使用 query/queryMore 方法时,最大批处理大小为 2000。但是,即使您可以在 SOAP 标头中指定 2000 作为批处理大小,Salesforce 也可能会发送较小的批处理作为响应。他们的批量大小决定基于服务器活动以及原始查询的输出。

我注意到,如果我提交包含任何“文本”字段的查询,批量大小限制为 50。

我的建议是确保您的查询只提取您需要的数据。我知道很多 Salesforce 表格最终都有很多自定义字段,每次集成都可能不需要这些字段。

有关此主题的Salesforce 文档

于 2010-02-11T17:36:12.700 回答
1

利用 Bulk-api 从 Java 中查询任意数量的记录。我正在使用它,即使在几秒钟内你就能得到结果,而且效果非常好。返回的字符串以逗号分隔。即使您可以维护小于或等于 10k 的批次,以 CSV(使用 open csv)或直接在 String 中获取记录。

如果您需要代码帮助,请告诉我。

于 2013-06-03T18:19:41.800 回答
1

我们的 Accounts 对象中有大约 14000 条记录,获取所有记录需要相当长的时间。我执行一个大约需要一分钟的查询,但即使我将批量大小设置为 2000,SF 也只返回不超过 500 的批次。每个查询更多操作也需要 45 秒到一分钟。当您需要获取批量数据时,此限制非常令人沮丧。

于 2010-04-22T19:17:38.923 回答
-1

延迟将成为这种情况的杀手 - 解决方案将是多线程或异步操作(使用 NIO)。我将从并行运行 10 个工作线程开始,看看它有什么不同(假设后端支持同时获取)。

抱歉,我没有任何具体的代码或我可以在这里提供的任何东西 - 只是通过高延迟网络进行 API 调用的痛苦经历。

于 2010-02-11T05:15:51.353 回答