2011-05-02 29 views
6

Bir Java nesnesinin boyutuyla ilgili anlaşılması oldukça kolay olan Q & A'nın bir sürü var. Ama PermGen uzayında bir Java sınıfının büyüklüğünü merak ediyorum.PermGen uzayında Java sınıf boyutu

Bunun hakkında şaşmamın nedeni, kod jeneratörü yazmanın çok fazla sayıda ders oluşturmasıdır. Esasen, bir veritabanındaki her tablo/görünüm için iki sınıf oluşturuyorum. Şimdi de yabancı anahtar ilişkilerini modellemek istiyorum. Karmaşık, seri hale getirilebilir bir nesne yapısını (diğer yabancı anahtarlara sahip diğer tablolara ait birkaç yabancı anahtarın referans aldığı bir anahtarın bulunduğu bir tabloyu düşünün) yerine, UNIQUE KEY ve bir sınıf başına bir sınıf oluşturmayı tercih ediyorum FOREIGN KEY.

İşte sorularım şunlardır:

  1. Ne kadar havai sınıf yükleyicisi ve PermGen alanı Bununla yaratacak?
  2. public sınıfları, static sınıfları ve private üye sınıfları arasında bir fark var mı?
  3. Kaynak kodda yabancı anahtar bilgisi oluşturmanın daha iyi bir yolu görüyor musunuz?
+0

Alan boşluğu dolduğunda OutOfMemoryErrors almak için bir tarif gibi geliyor. – duffymo

+0

Teşekkürler duffymo. Bu yüzden soruyorum. Somut rakamları merak ediyorum, ancak –

+0

Herhangi bir şey yok, çünkü ne ürettiğiniz hakkında hiçbir şey bilmiyorum. Merak ediyorum - neden bu kadar çok ısrarlı çözüm bulunduğunun (düz JDBC, Hibernate, iBatis, TopLink, JPA vb.) Gerekli olduğunu düşünüyorsunuz? Sizin çözümünüzün bunları almamın nedeni nedir? – duffymo

cevap

1

Farklı bir çözüm buldum, her bir KEY başına bir sınıf oluşturmak kadar fazla bellek harcamamak. Daha sonra referans ve yukarıdaki tuşlarını kullanarak üretilen tablo sınıflarından

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) { 

} 

gerçek tablolar: kabaca şöyle tek bir sınıf üretir. Yorumlarından birinde BobG tarafından önerilen JPA ek açıklamalarına baktım. Ama onları çok faydalı tanımlamak için bulamadık:

  • Çoklu alan tuşları (@IdClass parametre olarak bir tür ihtiyacı var ve ben bu tür kaçınmak istiyorum)
  • Çoklu alan başvurularını (bunu nasıl ?)
  • Farklı anahtarlar kullanarak bir tablodan başka bir tablona birden fazla başvuru
  • Birincil anahtarla birçok özelliği paylaşan benzersiz anahtarlar.

Bazı yorumlar, neden böyle bir jeneratörü oluşturmam gerektiğini belirtti, çünkü birçok yerleşik çerçeve var. Bunu http://www.jooq.org için yapıyorum. Ve jOOQ'nun günümüzün veri tabanı soyutlama olasılıklarındaki boşluğu doldurduğunu hissediyorum.

+0

Bunu benim günümde kabul ediyorum iş (İlkbahar/Hazırda Bekletme projesi) Hazırda bekletme durumlarını haftalık olarak, her zaman gerçekten kurtarıp kurtarmayacağımı değerlendiririm. (Ben kesinlikle SQL ile hazırda bekletmeden daha rahatım.) Genelde, hazırda bekletmenin, DAO katmanına harcayacağım zaman zamanın% 20'sini kurtardığı sonucuna varıyorum. Bununla birlikte, karmaşık sorgular için - raporlama gibi şeyler - düz SQL'e dönüp Hazırda bekletme işlemlerinin çoğunu iptal ediyorum. – BobG

+0

@BobG, o zaman jOOQ'ya bir şans vermelisiniz. Size DAO katmanında aynı miktarda zaman kazandıracak veya daha da fazlası, * ve * karmaşık sorgulamalar için de kullanabilirsiniz ... –