Bo nie masz gwarancji, że różne zasoby otwarte w bazie danych zostaną zamknięte. Np ResultSet jest obsługiwany przez jeden kursor w bazie danych. Zamknięcie samego połączenia teoretycznie powinno zamknąć też wszystkie zasoby, jednak nie zawsze się to dzieje i ponoć Oracle miało z tym problemy. Dlatego bezpieczniej jest zamykać wszystkie statementy a potem connection. Co może się stać jeśli tego nie zrobisz? Np:
java.sql.SQLException: - ORA-01000: maximum open cursors exceeded
W przypadku gdy otwierałbyś wiele statementów i ich nie zamykał.
PS niektórzy sugerują nawet zamykanie ResultSetów tak szybko jak nie będa nam już potrzebnemimo, że zamknięcie Statementu niejawnie zamknie też ResultSet - umożliwia to garbage collectorowi zwolnienie pamięci, bo skompilkowane zapytania mogą dużo zajmować.