2012-09-26 12 views
6

मैं WebSphere अनुप्रयोग सर्वर 7 उपयोग कर रहा हूँ buildin OpenJPA 1.2.3 और एक Oracle डाटाबेस के साथ है।प्रदर्शन OpenJPA क्वेरी (3000+ रिकॉर्ड) धीमी गति से

@NamedNativeQuery(name=Contract.GIVE_ALL_CONTRACTS, 
     query="SELECT number, name \n" + 
      "FROM contracts \n" + 
      "WHERE startdate <= ?1 \n" + 
      "AND enddate > ?1", 
      resultSetMapping = Contract.GIVE_ALL_CONTRACTS_MAPPING) 
    @SqlResultSetMapping(name = Contract.GIVE_ALL_CONTRACTS_MAPPING, 
     entities = { @EntityResult(entityClass = Contract.class, fields = { 
      @FieldResult(name = "number", column = "number"), 
      @FieldResult(name = "name", column = "name") 
     }) 
    }) 
    @Entity 
    public class Contract { 
     public static final String GIVE_ALL_CONTRACTS = "Contract.giveAllContracts"; 
     public static final String GIVE_ALL_CONTRACTS_MAPPING = "Contract.giveAllContractsMapping"; 

     @Id 
     private Integer number; 
     private String name; 

     public Integer getNumber() { 
     return number; 
     } 
     public String getName() { 
     return name; 
     } 
    } 

और निम्नलिखित कोड ठेके को पुनः प्राप्त करने:

Query query = entityManager.createNamedQuery(Contract.GIVE_ALL_CONTRACTS); 
query.setParameter(1, referenceDate); 

List contracts = query.getResultList(); 
entityManager.clear(); 

return contracts; 

लिया गया अनुबंध एक वेब सेवा करने के लिए पारित कर रहे हैं मैं निम्नलिखित इकाई है।

निष्पादित ओरेकल डेवलपर में इस क्वेरी 3608 के रिकॉर्ड के लिए चारों ओर 0,35 सेकंड लेता है। query.getResultList() में कॉल करने के लिए लगभग 4 सेकंड लगते हैं।

संस्था की constuctor में एक लकड़हारा के साथ

, यह लॉग 10-20 के बारे में वही टाइमस्टैम्प के साथ बनाई गई संस्थाओं देखते हैं कि। फिर 0,015 सेकंड यह कुछ और करता है। मुझे ओपनजेपीए सामान लगता है।

वहाँ OpenJPA तेजी लाने के लिए कोई तरीका है? या एकमात्र समाधान कैशिंग है?

+1

मैं आपको प्रोफाइलर का उपयोग करने का सुझाव देता हूं। – user1516873

उत्तर

3

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

मैं आप कैसे large results sets कार्रवाई करने के लिए पर OpenJPA प्रलेखन के माध्यम से स्किम सुझाव देना चाहेंगे।

+1

openjpa.FetchBatchSize वास्तव में महत्वपूर्ण है। ओरेकल में यह (केवल होता है?) केवल 10. –

+0

मैंने निम्नलिखित कोड जोड़ा है: 'OpenJPAQuery kq = OpenJPAPersistence.cast (क्वेरी); जेडीबीसीफ़ेटचप्लान fetch = (जेडीबीसीफ़ेचप्लान) kq.getFetchPlan(); fetch.setFetchBatchSize (100); fetch.setResultSetType (ResultSetType.SCROLL_INSENSITIVE); fetch.setFetchDirection (FetchDirection.FORWARD); fetch.setLRSSizeAlgorithm (LRSSizeAlgorithm.LAST); 'जब मैं webservice पर कॉल करता हूं तो यह परिणाम +/- 600ms में देता है। यह वास्तव में तेज़ है! इस महान टिप के लिए धन्यवाद –

+0

आप भी उपयोग कर सकते हैं: 'query.setHint (" openjpa.FetchPlan.FetchBatchSize "," 100 "); query.setHint ("openjpa.FetchPlan.ResultSetType", "SCROLL_INSENSITIVE"); query.setHint ("openjpa.FetchPlan.LRSSizeAlgorithm", "अंतिम"); ' –

0

मैं तुम्हें VisualVM डाउनलोड करने और इसमें शामिल संकुल के लिए एक रूपरेखा की स्थापना की सलाह देते हैं। VisualVM विभिन्न विधियों में बिताए गए समय को दिखा सकता है जो आपके मामले में सैद्धांतिक रूप से 0.35sec तक होगा। आप अपने कोड, ओपनजेपीए और नेटवर्क आईओ के बीच कुल समय के वितरण का विश्लेषण करने में सक्षम होंगे। यह आपको बाधा की पहचान करने में मदद करेगा।

+0

जब तक यह नेटवर्क ओवरहेड न हो। यह शायद कौन सा है। –

+0

@ नतन कॉक्स नेटवर्क पूरी तरह से देखा जा सकता है, केवल profava संकुल में java.io. * शामिल करें। डेटाबेस संचार को io.read सामान के प्रकार के रूप में देखा जाएगा या इसलिए, मुझे सटीक विधि नाम याद नहीं है। – jabal

संबंधित मुद्दे