Personally I’d use a pool as this will take care of all of the resource management for you. If your connection requirements change then you can easily modify the pool configuration. With a pool in place you can open/close connections and prepared statements according to best-practice and leave the resource management to the pool.
Typically, when using a pool:
- closing a connection will actually just return it to the pool
- the act of preparing a statement will either retrieve a previously prepared statement from the Connection’s statement cache, or if one is not available, create a new statement and cache it for later use.
- the act of closing a PreparedStatement will actually just return it to the connection’s statement cache.
Furthermore – depending on the pool implementation – it may be able to notify you when there are resource leaks making it easier to identify these sorts of problems in your code.
Take a look at the source of an example implementation like DBCP – it’s quite interesting to see how they work.