2012-12-03 21 views
12

Bu JPAContainer + Hazırda Bekletme çalışıyorum ve yüklenmesi uzun zaman alıyor. Örneğin SQLContainer 60ms yükleme ve JPA Konteynır yükleme 1.30 ile aynı sayfa.Vaadin JpaContainer

Konsolda JPAContainer ile her bir varlık için birçok SQL sorgusu görüyorum - sorgu; Varlık Kişisinin diğer tablolara bağlantıları yoktur; jpacontainer ile

Kodu: SQLContainer ile

JPAContainer<Person> container = JPAContainerFactory.make(Person.class, 
      "persistence-unit"); 
table.setContainerDataSource(container); 

Kodu:

JDBCConnectionPool pool = null; 
    try { 
     pool = new SimpleJDBCConnectionPool("org.postgresql.Driver", 
       "jdbc:postgresql://127.0.0.1:5432/postgres", "postgres", 
       "pwd"); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    TableQuery tq = new TableQuery("Person", pool); 
    SQLContainer sqlContainer = null; 
    try { 
     sqlContainer = new SQLContainer(tq); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
table.setContainerDataSource(sqlContainer); 

Benim persistence.xml dosyası: Neyi yanlış yapıyorum

<persistence-unit name="persistence-unit" transaction-type="RESOURCE_LOCAL"> 

    <jta-data-source>java:jboss/datasources/mfc-frontendDS</jta-data-source> 

    <properties> 
    <!-- Properties for Hibernate --> 
    <property name="hibernate.archive.autodetection" value="class"/> 
    <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> 
    <property name="hibernate.show_sql" value="true"/> 
    <property name="hibernate.format_sql" value="true"/> 
    <property name="hibernate.use_sql_comments" value="true"/> 
    <property name="hibernate.hbm2ddl.auto" value="update"/> 
    <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/> 
    <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" /> 
    </properties> 

?

cevap

6

JPAContainer ile mücadeleyi durdurun, arkasında çok fazla soyutlama katmanı var.

enter image description here

SQLContainer, yeterince iyi, hızlı ve kararlı. SQLContainer'ın JPAContainer'ın yerini aldığını söylemiyorum ama gerçek fiyat çok yüksek görünüyor. Kullanılabilirlik perspektifinden yanıt verilebilirlik çok önemli bir faktördür, bu yüzden kalıcılık katmanı için harcanan saniye ile başlamamak daha iyidir. Kullanım önbellek

ise - yavaş erişimi:

Kullanım CachingLocalEntityProvider Başparmak

Kural: Eğer gerçekten JPAContainer ile devam etmek istiyorsanız birkaç seçenek vardır neyse

, veritabanı gidiş-dönüşlerinin sayısı azaltılmalıdır, bunun yerine CachingLocalEntityProvider kullanılmalıdır. Veritabanı gidiş-dönüşleri yavaşsa, yerel önbellekleri ve sorgu sonuçlarını korur ve dolayısıyla LocalEntityProvider'dan daha hızlı gerçekleştirmelidir. Ancak, LocalEntityProvider'dan daha fazla bellek gerektirir. sayfalar yüklenen tembel oldukları için

Kullanım sayfalama (PagedTable)

büyük ölçüde, sorgu sayısını azaltacaktır.

PagedTable daha girişleri göstermek için kaydırma birden fazla sayfa yerine sahip olması dışında, Vaadin çekirdek Tablo aynı konuda davranan bir bileşenidir.

enter image description here

Kullanım JPAContainer

Tüm filtreleme değil kapta, sorgu ile veritabanı düzeyinde yapılır filtreler. Filtreleme uygulaması, JPA 2.0 Kriteri API'sini şeffaf bir şekilde kullanır. Filtreleme veritabanı düzeyinde yapıldığından, Filtrelenebilir API'yi kullanan özel filtreler çalışmaz.

da kontrol edin: JPAContainer Usage and Performance questions

+0

Vaadin'in JPA konteynerinin * ücretsiz bir lisans * olduğunu unutmayın. –

1

benim çözüm

geçersiz, JPAContainerX içinde JPAContainer uzatmak getItemIds sonra

@Override 
public List<?> getItemIds(int startIndex, int numberOfItems) { 
    return doGetEntityProvider().getAllEntityIdentifiers(this,getAppliedFiltersAsConjunction(), getSortByList()).subList(startIndex, startIndex+numberOfItems);; 
} 

JPAContainerX<T> container = new JPAContainerX<T>(c); 

    EntityManager entityManager = JPAContainerFactory.createEntityManagerForPersistenceUnit(IntrastudyUI.PERSISTENCE_UNIT); 

    CachingMutableLocalEntityProvider<T> entityProvider = new CachingMutableLocalEntityProvider<T>(c , entityManager); 

    container.setEntityProvider(entityProvider); 
0

JPAContainer kullanışlı, ancak sorunları var. Sadece performans değil, mimari problemler de. Oldukça güzel otomatik form nesline bağlı olmadıkça, bunu unutun.

Benim önerim:

  1. Eğer UI kodundan EntityManager ve diğer JPA şeyler gizlemek arkasında bir hizmet katmanı (EJB, Bahar Veri kaynağı, ya da sadece özel bir yardımcı sınıf) oluşturun.
  2. Küçük ve orta ölçekli tablolar için, nesneleri yalnızca belleğe yükleyin. Basit ve şaşırtıcı derecede verimli, özellikle the Viritin add-on dan ListContainer gibi iyi bir Bellek Kabı ile performans.
  3. Bellek kullanımının sorun yaşayabileceği gerçekten büyük tablolar için, hizmet katmanınız aracılığıyla verilerin yavaş yüklenmesi için LazyList yardımcı programını kullanın. Son blog entry about konuya göz atın.
İlgili konular