Проблемът е в начина, по който извличате данни в getStuff() . Всеки път, когато посещавате getStuff() получавате нов ResultSet но не го затваряш.
Това нарушава очакванията на Statement клас (вижте тук - https://docs. oracle.com/javase/7/docs/api/java/sql/Statement.html
):
По подразбиране само един обект ResultSet на обект на Statement може да бъде отворен едновременно. Следователно, ако четенето на един обект ResultSet се преплита с четенето на друг, всеки трябва да е генериран от различни обекти на Statement. Всички методи за изпълнение в интерфейса на оператора имплицитно затварят текущия обект ResultSet на инструкция, ако съществува отворен.
Това, което прави нещата още по-лоши, е rs от кода за повикване. Той също така се извлича извън statement поле, но не е затворено.
В крайна сметка:имате няколко ResultSet отнасящи се до същия Statement обект едновременно отворен.