From Jon Skeet's answer to What is the benefit of Connection and Statement Pooling?:
Creating a network connection to a database server is (relatively)
expensive. Likewise asking the server to prepare a SQL statement is
(relatively) expensive.
Using a connection/statement pool, you can reuse existing
connections/prepared statements, avoiding the cost of initiating a
connection, parsing SQL etc.
And the following, from Kent Boogaart's answer:
I am not familiar with c3p0, but the benefits of pooling connections
and statements include:
Performance. Connecting to the database is expensive and slow. Pooled connections can be left physically connected to the database,
and shared amongst the various components that need database access.
That way the connection cost is paid for once and amortized across all
the consuming components.
Diagnostics. If you have one sub-system responsible for connecting to the database, it becomes easier to diagnose and analyze database
connection usage.
Maintainability. Again, if you have one sub-system responsible for handing out database connections, your code will be easier to maintain
than if each component connected to the database itself.