If Oracle it your database, This might help:
even after resultset.close(), statement.close(),resultset = null and statement=null, all cursors were not being closed in the DB. A service call in to oracle seemed to imply that there were some bugs in their
jdbc implementations - any Statement you created would internally spawn cursors in the db (from their drivers) that weren't getting closed. apparently this has been fixed in the 8.1.7 release, classes12.zip. I still found that we needed to set our open_cursors (in init.ora, on the db server) to a fairly high number (i think default is 40 or something), and do a forced conn.rollback() every time we returned the Connection interface object back to our connection pool.
another way to clean up the cursors is to close the connection. But this process is too time consuming for our implementation.
seemed to help... but not totally solve
Jamie