DGraph Java Client Thread Pooling

I am using DGraphClient in Java. I have too many concurrent mutations and queries coming in at the same time.
Do I need to a pool of DGrpahClient object or it is handled inside DGrphClient itself.

How does gRPC internally manage the concurrent Transactions? Please explain.

import io.dgraph.DgraphClient;
import io.dgraph.DgraphGrpc;
import io.dgraph.DgraphGrpc.DgraphStub;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

public class DgraphExample {
    public static void main(String[] args) {
        // Create a gRPC channel
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 9080).usePlaintext().build();
        DgraphStub stub = DgraphGrpc.newStub(channel);
        DgraphClient dgraphClient = new DgraphClient(stub);

        // Create a thread pool for concurrent operations
        int threadPoolSize = 10;
        ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);

        // Submit tasks to the thread pool
        for (int i = 0; i < 100; i++) {
            executorService.submit(() -> performOperation(dgraphClient));
        }

        // Shutdown the thread pool
        executorService.shutdown();
    }

    private static void performOperation(DgraphClient dgraphClient) {
        try {
            // Create a new transaction
            io.dgraph.Transaction txn = dgraphClient.newTransaction();

            // Perform a mutation or query
            String query = "{\n" +
                    "  q(func: has(name)) {\n" +
                    "    name\n" +
                    "  }\n" +
                    "}";
            io.dgraph.Response response = txn.query(query);

            // Commit the transaction
            txn.commit();

            // Process the response
            System.out.println("Response: " + response.getJson().toStringUtf8());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}