2010-02-10 7 views
7

Sto sviluppando un'applicazione Java che interrogherà tabelle che possono contenere oltre 1.000.000 di record. Ho provato tutto il possibile per essere il più efficiente possibile, ma sono in grado di ottenere solo su AVG. circa 5.000 registrazioni al minuto e un massimo di 10.000 in un punto. Ho provato a decodificare il caricatore di dati e il mio codice sembra essere molto simile ma ancora senza fortuna.Interrogazione di oltre 1.000.000 di record utilizzando l'API di Salesforce Java e ricerca dell'approccio migliore

È una soluzione praticabile qui? Ho provato questo, ma con risultati molto minimi.

Ho letto e applicato tutte le cose possibili (comprime richieste/risposte, thread, ecc.) Ma non riesco a raggiungere il caricatore di dati come velocità.

Per notare, sembra che il metodo queryMore sembra essere il collo della bottiglia.

Qualcuno ha qualche esempio di codice o esperienze che possono condividere per guidarmi nella giusta direzione?

Grazie

+0

Siamo arrivati ​​allo stesso requisito, credo che avresti già una soluzione migliore. Puoi indicarmi la giusta direzione e anche gli esempi di codice/esempi mi aiuterebbero molto. – Sukhhhh

risposta

-1

latenza sta per essere un killer per questo tipo di situazione - e la soluzione sarà o multi-thread, o operazioni asincrone (utilizzando NIO). Vorrei iniziare eseguendo 10 thread di lavoro in parallelo e vedere che differenza fa (supponendo che il back-end supporti i get simultanei).

Non ho alcun codice concreto o qualcosa che posso fornire qui, mi dispiace, solo un'esperienza dolorosa con le chiamate API che vanno su reti ad alta latenza.

+0

10 thread ti portano dritto nei limiti delle richieste simultanee e peggiorano il problema, non meglio. – superfell

4

Con l'API Salesforce, il limite della dimensione del batch è ciò che può rallentare davvero. Quando si utilizzano i metodi query/queryMore, la dimensione massima del batch è 2000. Tuttavia, anche se è possibile specificare 2000 come dimensione batch nell'intestazione SOAP, Salesforce potrebbe inviare gruppi di dimensioni inferiori in risposta. La loro decisione sulla dimensione del batch si basa sull'attività del server e sull'output della query originale.

ho notato che se presento una query che include qualsiasi "testo" campi, la dimensione del lotto è limitata a 50.

Il mio suggerimento sarebbe quello di assicurarsi che le vostre domande sono tirando solo i dati di cui avete bisogno . So che molte tabelle Salesforce finiscono con un sacco di campi personalizzati che potrebbero non essere necessari per ogni integrazione.

Salesforce documentation su questo argomento

+0

Puoi dare un esempio di intestazione con dimensione batch mentre chiami /services/async/35.0/job/{job_id}/batch API REST? – Hussain

1

Abbiamo circa 14000 record nei nostri conti oggetto e ci vuole un po 'di tempo per ottenere tutti i record. Eseguo una query che richiede circa un minuto ma SF restituisce solo batch di non più di 500 anche se ho impostato batchsize su 2000. Ogni query richiede più operazioni da 45 secondi a un minuto. Questa limitazione è abbastanza frustrante quando è necessario ottenere dati di massa.

+0

Come hai fornito la dimensione del batch all'api? Usando l'intestazione? Si prega di condividere quell'intestazione. – Hussain

5

Un approccio che ho utilizzato in passato consiste nel richiedere solo gli ID desiderati (il che rende le query notevolmente più veloci). È quindi possibile parallelizzare i retrieves() su più thread.

che assomigli a questo:

[thread di query] -> BlockingQueue -> [pool di thread facendo recuperare()] -> BlockingQueue

Il primo thread fa query() e queryMore() come veloce come può, scrivendo tutti gli ID che ottiene nel BlockingQueue. queryMore() non è qualcosa che dovresti chiamare contemporaneamente, per quanto ne so, quindi non c'è modo di parallelizzare questo passaggio.Tutti gli ID sono scritti in un BlockingQueue. Potresti desiderare di impacchettarli in pacchetti di poche centinaia per ridurre la contesa della serratura se questo diventa un problema. Un pool di thread può quindi effettuare chiamate di richiamo() simultanee sugli ID per ottenere tutti i campi per SObjects e inserirli in una coda per il resto della tua app da gestire.

Ho scritto una libreria Java per utilizzare l'API SF che potrebbe essere utile. http://blog.teamlazerbeez.com/2011/03/03/a-new-java-salesforce-api-library/

1

Fare uso di Bulk-api per interrogare qualsiasi numero di record da Java. Sto facendo uso di esso ed esegue in modo molto efficace anche in pochi secondi si ottiene il risultato. La stringa restituita è separata da virgola. Persino è possibile mantenere batch inferiori o uguali a 10k per ottenere i record sia in formato CSV (utilizzando csv aperto) o direttamente in stringa.

Fammi sapere se è necessaria la guida del codice.