Play Framework, Hibernate и слишком медленный в диссертации - PullRequest
1 голос
/ 03 ноября 2011

У меня есть две модели: пользовательская и базовая.

Модель пользователя: http://pastebin.com/WdLzBkHJ

Базовая модель: http://pastebin.com/tQrEUaSu

Сначала я хочу обратить ваше внимание на обозначение базовой модели:

@org.hibernate.annotations.Entity(dynamicInsert=true,dynamicUpdate=true)

Не работает (в SQL Debug показано, что Hibernate генерировал запросы с использованием ненужных столбцов, которые в MySQL настроены как обнуляемые). Подскажите пожалуйста почему? Что я делаю не так?

И есть основная проблема (метод, при котором пользователь загружает базу и строку в этой базе, вставляет в таблицу MySQL после анализа): http://pastebin.com/yG3Mapze

Диссертация очень медленная. У меня есть файл с 70000 строк в строке, и я не могу ждать, пока Hibernate вставит эту строку в БД. Максимум я ждал 30 минут, и это был не конец. Если я буду использовать необработанные запросы, подобные этому:

DB.execute("INSERT INTO bases (user_id,email,password) VALUES (1,'" + email.replaceAll("'", "\'") + "','" + password.replaceAll("'", "\'") + "')");

вместо

b.save();

После этого выполнение 70000 строк в БД завершается через ~ 10-20 секунд. Так я не могу понять, где проблема и как ее исправить?

Также вы можете увидеть этот код выше объявления метода:

@NoTransaction

Если я раскомментирую это, то получу это исключение:

@ 689mbad1k Внутренняя ошибка сервера (500) для запроса POST / checker / uploadnewbase

Ошибка JPA Произошла ошибка JPA (контекст JPA не инициализирован. JPA Entity Manager автоматически запускается, когда в приложении обнаруживается один или несколько классов, аннотированных аннотацией @ javax.persistence.Entity.):

play.exceptions.JPAException: контекст JPA не инициализирован. JPA Entity Manager автоматически запускается, когда в приложении обнаруживается один или несколько классов, аннотированных аннотацией @ javax.persistence.Entity. на play.db.jpa.JPA.get (JPA.java:22) в play.db.jpa.JPA.em (JPA.java:51) на play.db.jpa.JPQL.em (JPQL.java:16) at play.db.jpa.JPQL.find (JPQL.java:44) в models.User.find (User.java) at controllers.Security.getUser (Security.java:30) at controllers.GlobalController.userStat (GlobalController.java:21) на play.mvc.ActionInvoker.invoke (ActionInvoker.java:502) at play.mvc.ActionInvoker.invokeControllerMethod (ActionInvoker.java:476) at play.mvc.ActionInvoker.invokeControllerMethod (ActionInvoker.java:471) на play.mvc.ActionInvoker.handleBefores (ActionInvoker.java:320) на play.mvc.ActionInvoker.invoke (ActionInvoker.java:140) по запросу Invocation.HTTP (Играть!)

Но в руководстве по игре видно, что: «Если вы хотите запретить Play запускать какую-либо транзакцию вообще, вы можете аннотировать метод с помощью @ play.db.jpa.NoTransaction.

Чтобы предотвратить транзакции для всех методов, вы можете аннотировать класс Controller с помощью @ play.db.jpa.NoTransaction. "

Итак, у меня есть три проблемы, которые я описал:

  1. Об исключении в NoTransaction.
  2. Об использовании dynamicInsert = true.
  3. Об улучшении производительности в Hibernate, например, если я буду использовать необработанные запросы.

1 Ответ

5 голосов
/ 03 ноября 2011

Проблема в сеансе гибернации, который необходимо очистить.В противном случае вы получите проблемы с памятью и производительностью.Вы можете найти некоторую информацию в http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html. К сожалению, я не знаю, как получить HibernateSession.Возможно, вы можете получить EntityManager и работать с ним.Но мой опыт работы с Hibernate и Batch действительно разочаровывает, поэтому я бы порекомендовал использовать ваше raw-решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...