Bom dia, João. Tudo bem contigo?
João, eu percebi que da maneira como foi implementado o controller da aplicação de exemplo a conexão nunca pode ser fechada.
Pelo que andei consultando na Internet (confesso que não baixei o código do C3P0 para me certificar), a Connection devolvida pelo pool na verdade é um wrapper e o seu método close permite ao pool realizar a liberação da conexão para que outra thread a possa utilizar.
Grande abraço e bom trabalho.