我有两个模型: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类。“
所以我描述了三个问题:
答案 0 :(得分:5)
问题是hibernate会话,必须清除。否则会出现内存和性能问题。您可以在http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html中找到一些信息。不幸的是我不知道如何获得HibernateSession。也许你可以获得EntityManager并使用它。但是我对Hibernate和Batch的体验非常令人沮丧,所以我建议使用你的原始解决方案。