Play Framework,Hibernate和插入太慢

时间:2011-11-02 20:58:50

标签: performance hibernate playframework

我有两个模型:User和Base。

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

基础模型: http://pastebin.com/tQrEUaSu

首先,我想在Base模型中注意这个表示法:

@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();

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

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

@NoTransaction

如果我取消注释,那么我会收到这个例外:

@ 689mbad1k 请求POST / checker / uploadnewbase

的内部服务器错误(500)

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

play.exceptions.JPAException:未初始化JPA上下文。当在应用程序中找到使用@ javax.persistence.Entity批注注释的一个或多个类时,JPA实体管理器会自动启动。     at play.db.jpa.JPA.get(JPA.java:22)     at play.db.jpa.JPA.em(JPA.java:51)     at play.db.jpa.JPQL.em(JPQL.java:16)     at 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)     at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)     at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:476)     at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:471)     at play.mvc.ActionInvoker.handleBefores(ActionInvoker.java:320)     at play.mvc.ActionInvoker.invoke(ActionInvoker.java:140)     在Invocation.HTTP请求(播放!)

但在Play手册中我们可以看到: “如果你想阻止Play开始任何交易,你可以用@ play.db.jpa.NoTransaction注释方法。

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

所以我描述了三个问题:

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

1 个答案:

答案 0 :(得分:5)

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