2012-12-03 10 views
12

मैं इस जेपीएकॉन्टेनर + हाइबरनेट को काम कर रहा हूं और इसे लोड करने में काफी समय लगता है। उदाहरण के लिए SQLContainer लोडिंग 60ms और जेपीए कंटेनर लोडिंग 1.30 के साथ एक ही पृष्ठ के साथ पृष्ठ।वाडिन जेपीए कॉन्टैनेर

कंसोल में जेपीएकॉन्टेनर के साथ मैं कई SQL क्वेरी देखता हूं - प्रत्येक इकाई - क्वेरी के लिए; इकाई व्यक्ति के पास अन्य तालिकाओं के लिंक नहीं होते हैं; 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

जेपीएकॉन्टेनर से लड़ना बंद करो, इसके पीछे बहुत अधिक अमूर्त परतें हैं।

enter image description here

SQLContainer काफी अच्छा, तेजी से और स्थिर है। मैं यह नहीं कह रहा हूं कि SQLContainer JPAContainer के लिए एक प्रतिस्थापन है, लेकिन वास्तविक मूल्य बहुत अधिक प्रतीत होता है। प्रयोज्यता परिप्रेक्ष्य प्रतिक्रिया से एक बहुत ही महत्वपूर्ण कारक है, इसलिए सेकंड के साथ शुरूआत करना बेहतर नहीं है, दृढ़ता परत पर खर्च किया गया है।

वैसे भी

, कई विकल्प उपलब्ध है यदि आप वास्तव में JPAContainer साथ जारी रखना चाहते हैं:

उपयोग CachingLocalEntityProvider

सामान्य नि: धीमी गति से पहुँच - तो उपयोग कैश

डेटाबेस राउंड-ट्रिप की संख्या कम होनी चाहिए, कैशिंगलोकेल एंटीटीप्रोवाइडर का उपयोग इसके बजाय किया जाना चाहिए। यह इकाइयों और क्वेरी परिणामों के स्थानीय कैश को बनाए रखता है और इसलिए डेटाबेस दौर-ट्रिप धीमे होने पर स्थानीय EntityProvider से तेज करना चाहिए। हालांकि, इसे LocalEntityProvider की तुलना में अधिक स्मृति की भी आवश्यकता है।

उपयोग पेजिंग (PagedTable)

यह बहुत, प्रश्नों की संख्या को कम क्योंकि पृष्ठों आलसी लोड कर रहे हैं होगा।

PagedTable एक घटक है कि Vaadin कोर तालिका के रूप में एक ही मामले में व्यवहार करती है, सिवाय इसके कि इसे अधिक प्रविष्टियों को दिखाने के लिए स्क्रॉल बजाय एकाधिक पृष्ठों किया है।

enter image description here

उपयोग JPAContainer फिल्टर

सभी छानने प्रश्नों के साथ डेटाबेस के स्तर पर किया जाता है, कंटेनर में नहीं। फ़िल्टरिंग कार्यान्वयन जेपीए 2.0 मानदंड एपीआई पारदर्शी रूप से उपयोग करता है। फ़िल्टरिंग डेटाबेस-स्तर पर फ़िल्टरिंग के रूप में, फ़िल्टर करने योग्य API का उपयोग करने वाले कस्टम फ़िल्टर काम नहीं करते हैं।

कृपया यह भी जाँचें: JPAContainer Usage and Performance questions

+0

ध्यान दें कि वाडिन के जेपीए कंटेनर में वर्तमान में एक * मुफ्त लाइसेंस * है। –

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

जेपीएकॉन्टेनर आसान है लेकिन इसके मुद्दे हैं। न केवल प्रदर्शन, बल्कि वास्तुकला की समस्याएं भी। जब तक आप अपनी सुंदर स्वचालित फॉर्म पीढ़ी पर निर्भर न हों, तो बस इसके बारे में भूल जाएं।

मेरे सुझाव:

  1. एक सेवा परत (EJB, स्प्रिंग डेटा स्रोत, या सिर्फ एक कस्टम सहायक वर्ग) जो पीछे आप अपने यूआई कोड से EntityManager और अन्य जेपीए सामान छिपाने बनाएँ।
  2. छोटे से मध्यम आकार के टेबल के लिए, बस सामान को स्मृति में लोड करें। सरल और आश्चर्यजनक रूप से कुशल, विशेष रूप से the Viritin add-on से ListContainer जैसे स्मृति कंटेनर में अच्छी तरह से प्रदर्शन करने के साथ।
  3. वास्तव में बड़ी टेबल जहां स्मृति उपयोग समस्या हो सकती है, LazyList सहायक का उपयोग अपनी सेवा परत के माध्यम से डेटा की आलसी लोडिंग को लागू करने के लिए करें। इस विषय को मेरे हालिया blog entry about देखें।