2011-05-02 89 views
6

有很多關於Java對象的大小的Q & A,這很容易理解。但是我想知道PermGen空間中的Java類的大小。PermGen空間中的Java類的大小

我想知道這個的原因是因爲我在編寫代碼生成器,生成很多類。基本上,我爲數據庫中的每個表/視圖生成兩個類。現在我也想模擬外鍵關係。而不是維護一個複雜的,可串行化的對象結構(考慮一個具有由屬於其他外鍵的其他表的多個外鍵引用的唯一鍵的表),我傾向於根據UNIQUE KEY和一個類生成一個類每FOREIGN KEY

這裏是我的問題:

  1. 如何在類加載器和PermGen的空間的開銷將我這個創造?
  2. public班,static班和private成員班之間是否有區別?
  3. 您是否看到在源代碼中生成外鍵信息的更好方法?
+0

聽起來像是在燙髮空間填滿時獲取OutOfMemoryErrors的祕訣。 – duffymo 2011-05-02 18:26:59

+0

謝謝duffymo。這就是我問的原因。我很好奇具體的數字,雖然 – 2011-05-02 18:27:54

+0

沒有,因爲我不知道你產生什麼。我很好奇 - 當你有很多持久化解決方案(直接JDBC,Hibernate,iBatis,TopLink,JPA等)時,爲什麼你認爲這是必要的?你買的這些解決方案不是什麼? – duffymo 2011-05-02 18:30:45

回答

1

我發現了一個不同的解決方案,沒有浪費像生成一個類每個KEY一樣多的內存。我生成單個類,大致看起來像這樣:

public class References { 

    // First, initialise all unique keys 
    public static final UniqueKey<TAuthorRecord> SysPk_14655 = 
     createUniqueKey(TAuthor.T_AUTHOR, TAuthor.ID); 


    // Then initialise all foreign keys 
    public static final Reference<TBookRecord, TAuthorRecord> SysFk_14666 = 
     createReference(SysPk_14655, TBook.T_BOOK, TBook.AUTHOR_ID); 
    public static final Reference<TBookRecord, TAuthorRecord> SysFk_14667 = 
     createReference(SysPk_14655, TBook.T_BOOK, TBook.CO_AUTHOR_ID); 


    // Factory method for unique keys 
    protected static <R extends Record> UniqueKey<R> 
    createUniqueKey(Table<R> table, TableField<R, ?>... fields) { 

    // Factory method for foreign keys referencing unique keys 
    protected static <R extends Record, U extends Record> Reference<R, U> 
    createReference(UniqueKey<U> key, Table<R> table, TableField<R, ?>... fields) { 

} 

從所生成的表格類的實際表然後可以參考和使用上述密鑰。我按照BobG的建議查看了JPA註釋。但我沒有發現他們非常有用的描述:

  • 多場鍵(@IdClass需要一個類型作爲參數,我想避免這種類型)
  • 多字段引用(怎麼辦呢?)
  • 從一個表到另一個表使用不同的鍵的多個引用
  • 唯一鍵與主鍵共享許多屬性。

的一些評論中提到我爲什麼要建立這樣一個發電機,因爲有很多既定的框架。我正在爲http://www.jooq.org做這個。我覺得jOOQ正在填補今天數據庫抽象可能性的空白。

+0

我得承認,我的天作業(春/ Hibernate項目)我評價休眠每週至於是否真的救了我的任何時間或沒有。 (我當然更舒服SQL比休眠。)我通常最終得出的結論是休眠節省了我的時間時間,我本來可以在DAO層上的支出約20%。但是,對於複雜的查詢 - 諸如報表之類的東西 - 我會恢復爲直接的SQL並繞過大部分Hibernate。 – BobG 2011-05-03 18:55:25

+0

@BobG,那麼你應該給jOOQ了一槍。這將節省你周圍的相同的時間DAO層甚至更多,*和*您可以使用它進行復雜查詢太... – 2011-05-03 19:31:26