Вместо потока вы можете использовать решение для кэширования.Результат запроса будет кэшироваться и возвращаться при каждом запросе. Если какая-либо из таблиц в запросе будет изменена, вы сделаете кеш недействительным, дождитесь следующего запроса, чтобы получить новые значения и загрузить их в кеш.Это решение соответствует требованиям 1 и 2. Что вы подразумеваете под «Его можно использовать во всех местах сервера»?
Если вы используете Hibernate, это легко сделать с помощью второго уровня кеш , предостережение в том, что вы должны гарантировать, что только ваше приложение изменяет базу данных (без внешних процессов).
Если вы не используете Hibernate, вы можете свернуть свое собственное решение с помощью Ehcache .Вам нужно будет изменить метод, который возвращает структуру, чтобы проверить кеш, прежде чем запрашивать БД.Методы, которые вносят изменения в соответствующие таблицы, должны быть модифицированы для аннулирования кэша.
Ehcache также имеет интеграцию с Spring , но я никогда не пробовал.