Hi Wayne,
I'll do my best to explain the internals of HikariCP in this respect. When you call getConnection(), HikariCP will not return until (1) a Connection becomes available in the pool, or (2) the connectionTimeout is reached. If connectionTimeout is 0 (infinite), getConnection() will not return until a Connection becomes available in the pool.
Let's say that inside of getConnection() HikariCP finds an available Connection in the bag collection, HikariCP will then try to validate that the Connection is alive before returning it to you. This is where the validationTimeout applies. If the Connection cannot be validated as "alive" within validationTimeout milliseconds, HikariCP will consider that Connection "dead" and will close it then eject it from the pool. The thread in getConnection() will then try to obtain another Connection from the bag collection. They may repeat many times, until connectionTimeout is reached or a valid Connection is found. Again, if connectionTimeout is infinite, the thread will keep waiting for Connections from the bag collection (either new ones or ones returned by other threads) and keep testing them until it finds a good one.
Hope this clarifies the internal pool behavior.
-Brett