Лучшая практика в большинстве случаев - сеанс за запрос.То есть откройте сеанс в начале обработки запроса и закройте его в конце.Это можно сделать, например, в сервлете Filter
.
Один сеанс для всего приложения - это плохо, поскольку он накапливает много сущностей в своем кэше 1-го уровня, что является утечкой памяти.Это может также привести к недетерминированным результатам, когда несколько клиентов используют его одновременно.
Однако ваш код не использует один сеанс для всего приложения - он использует концепцию «текущего сеанса», которая открываетсеанс и сохраняет его в контексте (например, ThreadLocal
).Но если вы не закроете его, он останется там навсегда.Кроме того, это вызовет те же проблемы, что и описанные выше, поскольку потоки повторно используются в веб-приложении, и новый запрос в какой-то момент получит старый незакрытый сеанс.