What you have done is perfect and very good practice.
The reason I say its good practice… For example, if for some reason you are using a “primitive” type of database pooling and you call connection.close(), the connection will be returned to the pool and the ResultSet/Statement will never be closed and then you will run into many different new problems!
So you can’t always count on connection.close() to clean up.
I hope this helps 🙂