2012-12-03 14 views
12

私はこのJPAContainer + Hibernateを使用していますが、ロードに時間がかかります。たとえば、SQLContainerをロードするページ(60ms)とJPAコンテナのロード済みページ(1.30s)と同じページ。Vaadin JpaContainer

コンソールにJPAContainerをインストールすると、各エンティティのクエリごとに多くのSQLクエリが表示されます。 Entity Personには他のテーブルへのリンクはありません。 jpacontainerと

コード:SQLContainerと

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

コード:

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

マイpersistence.xmlファイル:私は間違って何をやっている

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

答えて

6

JPAContainerとの戦いをやめようとすると、あまりにも多くの抽象層がその背後にあります。

enter image description here

SQLContainerは、十分に高速で安定しています。私はSQLContainerがJPAContainerの代わりであると言っているわけではありませんが、実際の価格は高すぎるようです。ユーザビリティの観点から、応答性は非常に重要な要素です。したがって、秒ので始まらない方がよいでしょう。あなたが本当にJPAContainerを続行したい場合はとにかく

、利用可能ないくつかのオプションがあります。

利用CachingLocalEntityProvider親指の

ルール:アクセスが遅い - 場合はキャッシュ

を使用するには、データベースのラウンドトリップ回数を減らす必要があります。代わりに CachingLocalEntityProviderを使用する必要があります。エンティティとクエリ結果のローカルキャッシュ を保持しているため、データベースのラウンドトリップが遅い場合はLocalEntityProviderよりも速く を実行する必要があります。 ただし、LocalEntityProviderよりも多くのメモリが必要です。

使用ページング(PagedTable

ページがロードされた怠惰なので、それは非常に、クエリの数を削減します。

PagedTableは、複数のエントリを表示するためにスクロール代わり の複数のページを持っていることを除いて、 Vaadinコアテーブルと同じ問題に動作構成要素です。

enter image description here

使用JPAContainerフィルタ

すべてのフィルタリングは、容器内のクエリ、ないとデータベース・レベルで行われます。 フィルタリングの実装では、JPA 2.0 Criteria APIが透過的に使用されます。 フィルタリングはデータベースレベルで行われるため、Filterable APIを使用するカスタムフィルタは機能しません。

もチェックしてください:JPAContainer Usage and Performance questions

+0

VaadinのJPAコンテナには現在、無料のライセンス*があります。 –

1

私の解決策

オーバーライドし、JPAContainerXでJPAContainerを拡張getItemIdsその後、

@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は便利ですが、問題があります。パフォーマンスだけでなく、建築上の問題も同様に起こります。あなたがかなり良い自動フォーム生成に依存しない限り、ただそれを忘れてしまいます。

私の提案:

  1. あなたのUIコードからのEntityManagerや他のJPAのものを隠してその背後サービス層(EJB、春データソース、または単にカスタムヘルパークラス)を作成します。
  2. 小規模から中規模のテーブルの場合は、メモリに読み込むだけです。シンプルで驚くほど効率的です。特に、ListContainer(the Viritin add-on)のようなメモリコンテナで十分に機能します。
  3. メモリ使用量が問題になる大きなテーブルの場合は、LazyListヘルパーを使用して、サービスレイヤを介してデータの遅延読み込みを実装します。私の最近のblog entry aboutをチェックしてください。