2013-04-04 23 views
0

我有兩個實體,parentchild,其中有OneToMany relationship。父級有子類的@Owned註釋。沒有關係。 (從子到父)實體組,JPA和每秒一次寫入限制(應用程序引擎)

@Entity 
public class Parent { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Owned 
    @OneToMany(fetch = FetchType.LAZY) 
    private Set<Child> children; 

    ......... 

} 


@Entity 
public class Child { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Key id; 

    public String value; 

    ......... 

    public int hashCode() { 
     ... based on this.value ... 
    } 

    public boolean equals(Object o) { 
     ... based on this.value ... 
    } 

} 

問題1:此安裝類似,其中家長是祖先的實體組?下面的兩個語句做回一個平等的關鍵:

- child.getId().qv.getId().getParent() 
- KeyFactory.createKey("Parent", parent.getId()) 

問題2:如果下面的代碼要花10秒鐘來執行?它運行在大約223毫秒:

for(int i = 0; i < 10; i++) { 
    em.getTransaction().begin(); 

    parent = em.find(Parent.class, parentId); 

    child = new Child("value" + i); 
    parent.addChild(child) 

    em.merge(parent) 

    em.getTransaction().commit(); 
} 

爲什麼我覺得應該需要10秒的原因是因爲這種說法在谷歌App Engine文檔的:

「然而,速率您可以寫入相同的實體組,限制爲每秒寫入實體組。「

https://developers.google.com/appengine/docs/java/gettingstarted/usingdatastore

感謝

回答

0

Q1:家長的確看起來像祖先。問題12:爲什麼需要10秒鐘?我看不出任何暗示這必須是這種情況的東西。所以我對此的回答是否定的。

+0

謝謝你的回答。 因爲這個原因需要10秒鐘: 「但是,您可以寫入同一個實體組的速率限制爲每秒寫入實體組1次。」 在https://developers.google.com/appengine/docs/java/gettingstarted/usingdatastore – nanotvi 2013-04-04 15:04:03

2

您是在本地開發服務器上運行還是在生產? 本地開發服務器並不完全模仿生產的性能特徵。

該限制作爲指導。你可能獲得比爆發更好的性能。但是,如果您嘗試顯着較長的高寫入時間,則會收到異常。

數據存儲寫入的性能限制不會減慢您的代碼執行速度。當事務性寫入失敗時,他們會拋出異常。確保你有一些異常處理程序來檢查是否發生這種情況。

+0

我在本地和生產服務器上運行此代碼。在生產服務器中,事務花費了大約1秒和500毫秒。 我想我明白你的觀點。文檔明確指出它僅限於每秒一次寫入,這很奇怪。 我注意到的一件事是,如果我在事務上下文中運行此代碼,它不會顯着慢於沒有。事實上,它有時更快。這是正常的,還是因爲它只是一個模擬? – nanotvi 2013-04-04 16:25:11

+0

我懷疑如果你運行循環1000次而不是10次,你會看到事務失敗的例外。正如我所提到的,事務上下文不會顯着影響性能,但是如果事務失敗,它將引發異常。 – dragonx 2013-04-04 17:38:05

相關問題