2011-05-02 17 views
6

Hay un montón de Q & Una de aproximadamente el tamaño de un objeto Java, que es bastante sencillo de entender. Pero me pregunto sobre el tamaño de una clase Java en el espacio PermGen.tamaño de las clases de Java en el espacio PermGen

La razón por la que pregunto esto es porque estoy escribiendo un generador de código, lo que genera una gran cantidad de clases. Básicamente, estoy generando dos clases para cada tabla/vista en una base de datos. Ahora también quiero modelar relaciones de claves foráneas. En lugar de mantener una estructura de objetos compleja y serializable (piense en una tabla con una clave única a la que hacen referencia varias claves foráneas que pertenecen a otras tablas que tienen otras claves externas, etc.), preferiría generar una clase por UNIQUE KEY y una clase por FOREIGN KEY.

Aquí están mis preguntas:

  1. ¿Cuánto sobrecarga en el cargador de clases y el espacio PermGen voy a crear con esto?
  2. ¿Hay una diferencia entre clases, publicstatic clases y clases private miembros?
  3. ¿Ve una mejor manera de generar información de clave externa en el código fuente?
+0

suena como una receta para conseguir OutOfMemoryErrors cuando el espacio se llena la ondulación permanente. – duffymo

+0

Gracias duffymo. Es por eso que pregunto. Tengo curiosidad acerca de las cifras concretas, aunque –

+0

No tengo ninguna, ya que no sé nada de lo que está generando. Tengo curiosidad: ¿por qué crees que es necesario cuando hay tantas soluciones de persistencia disponibles para ti (directamente en JDBC, Hibernate, iBatis, TopLink, JPA, etc.)? ¿Cuál es su solución al comprar que estos no? – duffymo

Respuesta

1

Encontré una solución diferente, no desperdiciando tanta memoria como generar una clase por KEY. Genero una sola clase que más o menos se parece a esto:

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

} 

Las tablas reales de las clases de tabla generada a continuación, puede hacer referencia y utilizar las teclas de arriba. Analicé las anotaciones de JPA sugeridas por BobG en uno de sus comentarios. Pero no he encontrado muy útiles para describir:

  • teclas multi-campo (@IdClass necesita un tipo como parámetro, y quiero evitar ese tipo)
  • referencias Multi-campo (cómo hacerlo ?)
  • Múltiples referencias de una tabla a otra utilizando diferentes claves
  • Teclas únicas, que comparten muchas propiedades con la clave principal.

Algunos de los comentarios mencionaron por qué debería crear un generador de este tipo, porque hay muchos marcos establecidos. Estoy haciendo esto por http://www.jooq.org. Y siento que jOOQ está llenando un vacío en las posibilidades de abstracción de la base de datos de hoy.

+0

Admitiré que en mi época trabajo (Proyecto Spring/Hibernate) Evalúo a Hibernate semanalmente para ver si realmente me está ahorrando o no. (Ciertamente estoy más cómodo con SQL que con Hibernate). Por lo general, termino concluyendo que Hibernate me ahorra aproximadamente el 20% del tiempo que de lo contrario estaría gastando en la capa DAO. Sin embargo, para consultas complejas, como informes, vuelvo a SQL directo y paso por alto la mayor parte de Hibernate. – BobG

+0

@BobG, entonces debería darle una oportunidad a jOOQ. Le ahorrará la misma cantidad de tiempo en la capa DAO o incluso más, * y * puede usarlo para consultas complejas también ... –

Cuestiones relacionadas