If you are using the VoltDB java client library, you do not necessarily need to use connection pooling. A "Client" object (org.voltdb.client.Client) is thread-safe and can be shared by all of the threads of a java application within the same JVM. There is an example of this in the "voter" example app (see examples/voter/src/voter/SyncBenchmark.java).
There are several advantages to the native java client library over the JDBC driver. It supports both synchronous and asynchronous database calls, and allows you to switch between these naturally within the same application. It also can enable you to offload more processing to the database because if you need to retrieve data from multiple tables the native driver can return an array of VoltTable objects, each representing the results from a different table. To get the same results with JDBC would require multiple round-trips.
If you prefer to use the JDBC driver, it is a wrapper around our java client library that implements the relevant portions of the JDBC interface, so it is also thread-safe so one Connection (java.sql.Connection) object can be shared by all the threads on a JVM. There is also an example of this in the "voter" example app (see examples/voter/src/voter/JDBCBenchmark.java). One difference with typical JDBC drivers is that when the connection is established, the JDBC url can contain a comma-separated list of servers (see https://github.com/VoltDB/voltdb/blob/master/examples/voter/src/voter/JDBCBenchmark.java#L191