6

Javaオブジェクトのサイズに関するQ&Aはたくさんありますが、これは非常に簡単に理解できます。しかし、PermGenスペースのJavaクラスのサイズについて疑問に思っています。

これについて疑問に思う理由は、私がコードジェネレーターを作成していて、多くのクラスを生成しているためです。基本的に、データベース内のすべてのテーブル/ビューに対して2つのクラスを生成しています。ここで、外部キーの関係もモデル化したいと思います。複雑でシリアル化可能なオブジェクト構造を維持するのではなく(一意のキーを持つテーブルが、他の外部キーを持つ他のテーブルに属する複数の外部キーによって参照されるなど)、1つのクラスごとUNIQUE KEYに1つのクラスを生成することをお勧めします。 FOREIGN KEY

これが私の質問です:

  1. これを使用して、クラスローダーとPermGenスペースにどのくらいのオーバーヘッドを作成しますか?
  2. publicクラス、staticクラス、privateメンバークラスに違いはありますか?
  3. ソースコードで外部キー情報を生成するためのより良い方法がわかりますか?
4

1 に答える 1

2

ごとに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のコメントの1つで提案されているように、JPAアノテーションを調べました。しかし、私はそれらを説明するのに非常に役立つとは思いませんでした:

  • マルチフィールドキー(@IdClassパラメーターとしてタイプが必要であり、そのタイプは避けたい)
  • マルチフィールド参照(それを行う方法は?)
  • 異なるキーを使用した、あるテーブルから別のテーブルへの複数の参照
  • 主キーと多くのプロパティを共有する一意のキー。

確立されたフレームワークがたくさんあるので、なぜそのようなジェネレーターを作成する必要があるのか​​についてのコメントがいくつかありました。私はhttp://www.jooq.orgのためにこれを行っています。そして、jOOQは今日のデータベース抽象化の可能性のギャップを埋めていると感じています。

于 2011-05-03T06:05:54.277 に答える