Problém je ve způsobu načítání dat v getStuff() . Při každé návštěvě getStuff() získáte novou sadu ResultSet ale nezavřeš to.
To porušuje očekávání Statement třídy (viz zde - https://docs. oracle.com/javase/7/docs/api/java/sql/Statement.html
):
Ve výchozím nastavení může být současně otevřen pouze jeden objekt ResultSet na objekt Statement. Pokud je tedy čtení jednoho objektu ResultSet proloženo čtením jiného objektu, každý musí být generován jinými objekty Statement. Všechny metody provádění v rozhraní příkazu implicitně zavírají aktuální objekt ResultSet příkazu, pokud existuje otevřený.
Co dělá věci ještě horší, je rs z volacího kódu. Je také odvozen z statement pole, ale není uzavřeno.
Sečteno a podtrženo:máte několik ResultSet týkající se stejného Statement objekt současně otevřen.