2011-11-02 50 views
1

我有两种模式:用户和基地。播放框架,休眠和太慢的插入

用户模式: 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

Insertation是很慢的。我有每行70000字符串的文件,我不能等到Hibernate将此字符串插入数据库。最多我等了30分钟,那不是结束。 如果我将使用原始查询,如认为:

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

代替

b.save(); 

70000个字符串是insertation到DB后完成后〜10-20秒。 所以我不明白问题在哪里以及如何解决?

还可以看到这个代码上面的方法声明:

@NoTransaction 

如果我取消它,然后我免费获赠此异常:

@ 689mbad1k 内部服务器错误(500),请求POST /检查器/ uploadnewbase

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

play.exceptions.JPAException:JPA上下文未初始化。如果在应用程序中找到使用@ javax.persistence.Entity批注注释的一个或多个类,则JPA实体管理器将自动启动。 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 controllers.Security.getUser(Security.java:30) at(在玩家数据库中的models.User.find(User.java) )play.db.jpa.JPQL.find(JPQL.java:44) at 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(ActionInv oker.java:140) Invocation.HTTP Request(Play!)

但播放手册中我们可以看到: “如果你想阻止播放从根本上开始的任何交易,您可以用@ play.db.jpa.NoTransaction注释方法

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

所以我有我所描述的三个问题:

  1. 关于在NoTransaction例外。
  2. 关于使用dynamicInsert = true。
  3. 关于提高Hibernate的性能,就像我会使用原始查询一样。

回答

5

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

+0

是的,谢谢我已经阅读了jboss.org上的批处理,结果令我感到沮丧。插入太慢。所以我正在使用这个循环的原始解决方案。但是我无法理解Hibernate做什么,除了设置模型属性以及为什么插入如此缓慢。 – purple

+0

顺便说一下,你不知道解决方案的动态插入和异常后NoTransaction? – purple

+1

@purple:我不是一个hibernate专家,但据我所知,有很多元信息必须在背景中处理,这些元信息的指数增加。关于你的问题:我不知道。 – niels