У меня есть две модели: пользовательская и базовая.
Модель пользователя:
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. "
Итак, у меня есть три проблемы, которые я описал:
- Об исключении в NoTransaction.
- Об использовании dynamicInsert = true.
- Об улучшении производительности в Hibernate, например, если я буду использовать необработанные запросы.