Is my Java Hibernate application using Prepared Statement Pooling?

In H2 prepared statements are cached on connection level. With hibernate.c3p0.max_size=200 there is a chance that you have so many open connections that each time the user performs operation he will get a different H2 connection.

Local in-memory H2 has a minimal connection cost comparing to other RDBMS. Try removing C3P0 and test with a single H2 connection. This should confirm that prepared statements are cached by JDBC driver.

In most situations less connections is better. In your case, with a single user and multiple threads, it's unlikely that your machine has 200 CPUs to take full advantage of hibernate.c3p0.max_size=200.