2011-11-02 47 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