Hope you find this article useful :
Many books about JDBC and most of JDBC-related sample code floating around seems to assume that JDBC is used directly, meaning that database connection is established by the DriverManager, and is actually released when myJDBCConnection.close() method is called. In this case, all resources associated with this database connection, such as ResultSet and Statement objects (and whatever is used on the database side to implement them), are released as well.
There is a problem with this approach. When moving to �Enterprise�-type applications, most JDBC connections are obtained from connection pools. When myConnection.close() is invoked on such a connection, it is not actually released. It is returned back to the connection pool to be re-used by other objects. In this case, all database resources associated with the connection may not be released. Thus, database cursors and other database-specific objects that are used to implement ResultSets and Statements are not freed.
This may result in applications running out of database resources, even though the JDBC connections themselves are properly closed.
The way to work around this issue is to close ResultSet and various Statement objects as soon as the code is done using them, or in the finally{} block.