The problem does not seem to be of leaking connections, from what you have posted it seems like the Spring is not able to get connections while trying to start the transaction.
I don't think that the problem is with Spring not releasing connections, Spring aquires a connection on start of transaction releases it back on completion of transaction.
You are using DriverManagerDataSource, which actually does not pool connections, it creates connections on demand.
In case you are running in
J2EE container
you should look up datasource via JNDI or if you are not running application in container consider using Apache's Jakarta
Commons DBCP or C3P0 connection pool implementations.