Play Framework,Hibernate和插入太慢

Cla*_*ark 1 performance hibernate playframework

我有两个模型:User和Base.

用户模型:http: //pastebin.com/WdLzBkHJ

基本型号:http: //pastebin.com/tQrEUaSu

首先,我想在Base模型中考虑这种表示法:

@org.hibernate.annotations.Entity(dynamicInsert=true,dynamicUpdate=true)
Run Code Online (Sandbox Code Playgroud)

它不起作用(在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("'", "\'") + "')");
Run Code Online (Sandbox Code Playgroud)

代替

b.save();
Run Code Online (Sandbox Code Playgroud)

之后,在约10-20秒之后将70000个字符串插入DB完成.所以我无法理解问题出在哪里以及如何解决?

您还可以在上面的方法声明中看到此代码:

@NoTransaction
Run Code Online (Sandbox Code Playgroud)

如果我取消注释,那么我将收到此异常:

@ 689mbad1k请求POST/checker/uploadnewbase的内部服务器错误(500)

JPA错误发生JPA错误(JPA上下文未初始化.JPA实体管理器在应用程序中找到一个或多个使用@ javax.persistence.Entity批注注释的类时自动启动.):

play.exceptions.JPAException:未初始化JPA上下文.当在应用程序中找到使用@ javax.persistence.Entity批注注释的一个或多个类时,JPA实体管理器会自动启动.在play.db.jpa.JPA.get(JPA.java:22)在play.db.jpa.JPA.em(JPA.java:51)在play.db.jpa.JPQL.em(JPQL.java:16 )在play.db.jpa.JPQL.find(JPQL.java:44)在models.User.find(User.java)在controllers.Security.getUser(Security.java:30)在controllers.GlobalController.userStat(GlobalController的.java:21)在play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)在play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:476)在play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:471)在在Invocation.HTTP请求play.mvc.ActionInvoker.handleBefores(ActionInvoker.java:320)在play.mvc.ActionInvoker.invoke(ActionInvoker.java:140)(玩!)

但是在Play手册中我们可以看到:"如果你想阻止Play完全启动任何事务,你可以用@ play.db.jpa.NoTransaction注释该方法.

要防止所有方法的事务,可以使用@play.db.jpa.NoTransaction注释Controller类."

所以我描述了三个问题:

  1. 关于NoTransaction中的异常.
  2. 关于使用dynamicInsert = true.
  3. 关于改进Hibernate的性能,就像我将使用原始查询一样.

nie*_*els 5

问题是hibernate会话,必须清除.否则会出现内存和性能问题.您可以在http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html中找到一些信息.不幸的是我不知道如何获得HibernateSession.也许你可以获得EntityManager并使用它.但是我对Hibernate和Batch的体验非常令人沮丧,所以我建议你使用你的原始解决方案.

  • 您可以使用`Session session =(Session)JPA.em().getDelegate();`获取Play hibernate会话,然后使用`session.flush``和`session.clear()`,如文档中所述.回答.您也可以专门为您导入新会话. (2认同)