Я запускаю веб-приложение Spring + Hibernate на Tomcat 7.0.35 (Spring 3.1, Hibernate 3.6.1, JPA 2.0).Запрос Критерии Hibernate заставляет Tomcat не реагировать после нескольких запросов.
У этого приложения есть страница, которая получает данные из базы данных с помощью критериев Hibernate (я знаю, что мне не нужно). Уровень обслуживания просто вызывает уровень данных. Вот код:
Criteria criteria = sessionFactory.openSession().createCriteria(Article.class);
criteria.addOrder(Order.desc("updatedTime"));
criteria.add(Restrictions.eq("account", acc));
criteria.add(Restrictions.eq("draft", true));
criteria.setMaxResults(1);
Article s = (Article) criteria.uniqueResult();
return s;
Tomcat может служить лишь несколько запросов с этой страницы, а затем она становится не реагирует. Я вижу, что браузер продолжает ждать ответа сервера (в строке состояния Firefox отображается «Ожидание хоста».)
Я не вижу сообщений об ошибках, таких как OutOfMemory и т. Д. Кажется, что браузер ждет навсегда.
Если изменить его JPA следующим образом:
@NamedQuery(name = "Article.getMostRecentDraftArticle", query = "select x from Article x where x.account = :account and x.draft = 1 order by x.updatedTime desc"),
.....
Query q = getSession().getNamedQuery("Article.getMostRecentDraftArticle");
q.setParameter("account", acc);
q.setMaxResults(1);
List list = q.list();
if (list.size() == 0)
return null;
else
return (Article) list.get(0);
Тогда все работает правильно.
Что может пойти не так с моим использованием API критериев Hibernate?
Спасибо за любой ввод!
Cheers.
Пробовал это решение, добавив sessionFactory.openSession(). Close(); перед возвращением. Но это не работает. – curious1
Вам нужно вызвать 'close' в том же экземпляре. Вызов 'openSession' снова создаст другой экземпляр. – artbristol
@arbristol, спасибо за ваше упоминание о том же сеансе. Это сработало!!! – curious1