# Concurrent Execution API The DataStax Node.js driver provides a set of [utilities for concurrent query execution](/api/module.concurrent/), to facilitate executing multiple queries in parallel while controlling the concurrency level. The concurrent execution API can useful when, for example, you want to insert a large group of rows from an `Array` or a `Stream` and evaluate failures, if any, at the end. ## Usage samples ### Using a fixed query and an Array of arrays as parameters When an `Array` of arrays is provided, one query per each item in the `Array` will be executed, using each item as parameters. ```javascript const query = 'INSERT INTO table1 (id, value) VALUES (?, ?)'; const parameters = [[1, 'a'], [2, 'b'], [3, 'c'], ]; // ... const result = await executeConcurrent(client, query, parameters); ``` You can visit the [code examples in the driver repository][examples] to check out a working example. ### Using a fixed query and a readable stream When a `Stream` instance is provided the driver will read from the input stream and execute one query per item emitted. The driver will throttle reads of the input stream based on the concurrency level configured and the amount of current in-flight requests. The `Stream` instance should be a readable, in object mode, and emit `Array` instances. Per each item emitted, one query will be executed. ```javascript const stream = csvStream.pipe(transformLineToArrayStream); const result = await executeConcurrent(client, query, stream); ``` ### Using a different queries ```javascript const queryAndParameters = [ { query: 'INSERT INTO videos (id, name, user_id) VALUES (?, ?, ?)', params: [ id, name, userId ] }, { query: 'INSERT INTO user_videos (user_id, id, name) VALUES (?, ?, ?)', params: [ userId, id, name ] }, { query: 'INSERT INTO latest_videos (id, name, user_id) VALUES (?, ?, ?)', params: [ id, name, userId ] }, ]; const result = await executeConcurrent(client, queryAndParameters); ``` ### Execute all queries and deal with execution errors at the end When setting `raiseOnFirstError` to `false`, the driver will continue to execute the queries even when one or more errors are encountered. The returned `Promise` will be resolved and you can inspect the property `errors` to obtain each individual error information. ```javascript const result = await executeConcurrent(client, query, parameters, { raiseOnFirstError: false }); for (let err of result.errors) { // ... } ``` ### Defining concurrency level Use the `concurrencyLevel` option property to set the maximum amount of requests that can be executed simultaneously. It defaults to `100`. ```javascript const result = await executeConcurrent(client, query, parameters, { concurrencyLevel: 200 }); ``` Note that increasing the amount of simultaneous requests will result in further queueing at the driver level and the server nodes level. You should find the optimal to get high throughput and low latency, based on your cluster size and hardware specifications. Using a higher concurrency level setting than optimal might result in query timeouts. ### Collecting all the ResultSet instances of each individual execution In the case you want the driver to collect each individual `ResultSet` instance, you can use the `collectResults` flag. ```javascript const result = await executeConcurrent(client, query, parameters, { collectResults: true }); for (let rs of result.resultItems) { // ... } ``` [examples]: https://github.com/datastax/nodejs-driver/tree/master/examples