我正在开发一个Java应用程序,它将查询可能包含1,000,000条记录的表。我尽我所能尽力而为,但我只能在平均上实现。一分钟约5,000条记录,一次最多10,000条记录。我试过逆向工程数据加载器,我的代码看起来非常相似,但仍然没有运气。
这里的线程是否可行?我试过这个,但结果很少。
我一直在阅读并应用了所有可能的东西(压缩请求/响应,线程等),但我无法实现数据加载速度。
要注意,似乎queryMore方法似乎是瓶颈。
是否有人可以分享任何代码示例或经验以引导我朝正确的方向发展?
由于
答案 0 :(得分:5)
我过去使用的一种方法是只查询您想要的ID(这使得查询速度明显加快)。然后,您可以跨多个线程并行化retrieve()。
看起来像这样:
[查询主题] - > BlockingQueue - > [thread pool doing retrieve()] - > BlockingQueue的
第一个线程尽可能快地执行query()和queryMore(),将所有ID写入BlockingQueue。如我所知,queryMore()不是你应该同时调用的东西,所以没有办法并行化这一步。所有ID都写入BlockingQueue。您可能希望将它们打包成几百个捆绑包以减少锁争用,如果这成为一个问题。然后,线程池可以对id执行并发的retrieve()调用,以获取SObject的所有字段,并将它们放入队列中,供应用程序的其余部分处理。
我编写了一个Java库,用于使用可能有用的SF API。 http://blog.teamlazerbeez.com/2011/03/03/a-new-java-salesforce-api-library/
答案 1 :(得分:4)
使用Salesforce API,批量大小限制可以真正减慢您的速度。当您使用query / queryMore方法时,最大批处理大小为2000.但是,即使您可以在SOAP标头中指定2000作为批处理大小,Salesforce可能会发送较小的批处理作为响应。它们的批量大小决定基于服务器活动以及原始查询的输出。
我注意到,如果我提交的查询包含任何“文本”字段,则批量大小限制为50。
我的建议是确保您的查询只提取您需要的数据。我知道很多Salesforce表最终会有很多自定义字段,这些字段可能不是每次集成都需要的。
关于此主题的答案 2 :(得分:1)
我们的Accounts对象中有大约14000条记录,获取所有记录需要相当长的时间。我执行一个大约一分钟的查询,但SF只返回不超过500的批次,即使我将batchsize设置为2000.每个查询更多的操作也需要45秒到一分钟。当您需要获取批量数据时,此限制非常令人沮丧。
答案 3 :(得分:1)
利用Bulk-api从Java查询任意数量的记录。我正在利用它,即使在几秒钟内你也能得到很好的效果。返回的字符串以逗号分隔。即使您可以维护小于或等于10k的批次,也可以使用CSV(使用open csv)或直接在String中获取记录。
如果您需要代码帮助,请告诉我。
答案 4 :(得分:-1)
我没有任何具体的代码或我在这里可以提供的任何内容,抱歉 - 只是通过高延迟网络进行API调用的痛苦经历。