Hi Charu,

Since the driver uses Guava futures, you can use some of the methods in
Futures
<https://google.github.io/guava/releases/19.0/api/docs/com/google/common/util/concurrent/Futures.html>
to
add listeners, callbacks and transformers that are invoked when the future
completes without blocking the calling thread like getUninterruptibly
does.  For example, the following registers a callback whose onSuccess or
onFailure method is called based on the success of the query.

Futures.addCallback(future, new FutureCallback<ResultSet>() {
    public void onSuccess(ResultSet result) {
        // process result
    }

    public void onFailure(Throwable t) {
        // log exception
    }
});

You can read more about using the driver's async features here
<http://docs.datastax.com/en/developer/java-driver/3.3/manual/async/>.

Since executeAsync does not block, you'll want to be careful of is not
submitting too many requests at a time as this can degrade performance and
may explain what you are observing.  One simple (although somewhat crude)
way of handling this is to use a Semaphore with a fixed number of permits.
You would acquire a Semaphore permit before you execute a query, and then
release a permit in a callback on completion of the request.  This would
cause your calling thread to block whenever you run out of permits, and
then continue when a query completes and releases a permit.

The upcoming version (4.0) of the java driver uses
CompletionStage/CompletableFuture (java 8 futures), although we'll probably
provide a guava extension as well for those who still want to use
ListenableFuture.

Thanks,
Andy


On Mon, Oct 2, 2017 at 6:44 PM Charulata Sharma (charshar) <
chars...@cisco.com> wrote:

> Hi ,
>
>
>
>
>
> We are observing some performance issues when executing a large number of
> read/write queries.
>
> We use executeAsync query for most of our read and write requests and then
> future.getUninterruptibly() methods before returning to the client
> application.
>
>
>
>
>
> Code snippet is:  (In the bind portion we have some GSON object
> conversions.
>
>
>
>      List<ResultSetFuture> futures = *new* ArrayList<>();
>
>
>
>       BoundStatement bind ;
>
>       For(loop condition) {
>
>         bind =PreparedStatement.bind(….) //The PreparedStatement is
> prepared outside the loop.
>
>        resultSetFuture = *SESSION*.executeAsync(bind);
>
>
>      futures.add(resultSetFu ture);
>
>   }
>
>
>
> *for*(ResultSetFuture future: futures){
>
>    future.getUninterruptibly();
>
> }
>
>
>
>
>
> Reading through the documents , I found that although the queries are
> executed in an async fashion, the future. getUninterruptibly(), is a
> blocking call.
>
> I am trying to implement a callable future, but wanted to know from the
> community if there is any better way of doing this and if changing to
> callable future will help.
>
>
>
>
>
> Thanks,
>
> Charu
>

Reply via email to