मैं ORM के रूप में हाइबरनेट का उपयोग करते हुए स्प्रिंग बूट में विकसित एक निगरानी उपकरण पर काम कर रहा हूं।

मुझे अपनी तालिका में प्रत्येक पंक्ति (पहले से ही भेजे गए संदेशों की पंक्तियों) की तुलना करने की आवश्यकता है और देखें कि क्या MailId (अद्वितीय) को एक प्रतिक्रिया मिली है (स्थिति: OPENED, BOUNCED, DELIVERED...) हां या नहीं।

मुझे नेटवर्क फ़ोल्डर से सीएसवी फाइलों को पढ़कर फीडबैक मिलता है। CSV पार्सिंग और फ़ाइलों को पढ़ना बहुत तेज़ है, लेकिन मेरे डेटाबेस का अद्यतन बहुत धीमा है। मेरा एल्गोरिदम बहुत कुशल नहीं है क्योंकि मैं एक सूची को लूप करता हूं जिसमें सौ हजारों ऑब्जेक्ट हो सकते हैं और मेरी तालिका में देख सकते हैं।

यह वह तरीका है जो "लक्ष्य" ऑब्जेक्ट (तालिका डेटाबेस में पंक्ति) को अपडेट करके मेरी तालिका में अद्यतन करता है

@Override
public void updateTargetObjectFoo() throws CSVProcessingException, FileNotFoundException {             
    // Here I make a call to performProcessing method which reads files on a folder and parse them to JavaObjects and I map them in a feedBackList of type Foo
    List<Foo> feedBackList = performProcessing(env.getProperty("foo_in"), EXPECTED_HEADER_FIELDS_STATUS, Foo.class, ".LETTERS.STATUS.");
    for (Foo foo: feedBackList) {                        
        //findByKey does a simple Select in mySql where MailId = foo.getMailId()
        Foo persistedFoo = fooDao.findByKey(foo.getMailId());
        if (persistedFoo != null) {
            persistedFoo.setStatus(foo.getStatus());
            persistedFoo.setDnsCode(foo.getDnsCode());             
            persistedFoo.setReturnDate(foo.getReturnDate());
            persistedFoo.setReturnTime(foo.getReturnTime());   
            //The save account here does an MySql UPDATE on the table
            fooDao.saveAccount(foo);
        }
    }
}

क्या होगा यदि मैं जावा पक्ष में इस चयन/तुलना और अद्यतन कार्रवाई को प्राप्त करता हूं? फिर डेटाबेस में पूरी सूची को दोबारा अपडेट करें?

क्या यह तेज होगा?

मदद के लिए आप सबका शुक्रिया।

0
algorithmic 1 मई 2017, 17:14
"तेज़ तरीका", मैंने अब तक वास्तविक जीवन परियोजनाओं में देखा है, ओआरएम को बायपास करना और एसक्यूएल भेजना है। वास्तव में, मैंने ऐसे प्रोजेक्ट देखे हैं जहाँ हर डेटाबेस ऑपरेशन वास्तव में ORM को दरकिनार करते हुए किया गया था ...
 – 
Holger
2 मई 2017, 13:48

1 उत्तर

सबसे बढ़िया उत्तर

हाइबरनेट बैच प्रोसेसिंग के लिए विशेष रूप से उपयुक्त नहीं है। जेडीबीसी बैच प्रोसेसिंग करने के लिए आप स्प्रिंग के जेडीबीसी टेम्पलेट का उपयोग करने से बेहतर हो सकते हैं।

हालांकि, अगर आपको हाइबरनेट के माध्यम से ऐसा करना है, तो यह मदद कर सकता है: https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/batch/Batching.html

2
GreyBeardedGeek 1 मई 2017, 17:51
नमस्ते, आपके उत्तर और मार्गदर्शन के लिए बहुत बहुत धन्यवाद। मैं इस परियोजना में हाइबरनेट का उपयोग करने के लिए प्रतिबंधित नहीं हूं। मुझे संचालन को अब की तुलना में तेज़ बनाने के लिए एक समाधान खोजना होगा। मैंने स्प्रिंग जेडीबीसी टेम्पलेट के बारे में खोज की। क्या आपके पास कोई विचार है कि मैं इसे बुद्धिमानी से कैसे कार्यान्वित कर सकता हूं? यह जानकर कि मुझे एक मुख्य ऑपरेशन करना होगा (10-100 हजार बार): जावा ऑब्जेक्ट की सूची के आधार पर मेरी डेटाबेस तालिका की प्रत्येक पंक्ति को अपडेट करें
 – 
algorithmic
2 मई 2017, 12:32
वेब पर बहुत सारे दस्तावेज और उदाहरण हैं। ये रहा एक:
 – 
GreyBeardedGeek
2 मई 2017, 14:38
हाय फिर से, आपके उत्तर के लिए धन्यवाद। मैं जेडीसीबी टेम्पलेट को लागू करने के लिए अपने डीएओ को थोड़ा सा पुनर्विकास कर रहा हूं। मैं आपको प्रदर्शन में किसी भी बदलाव के बारे में अपडेट रखूंगा। आपका दिन शुभ हो
 – 
algorithmic
3 मई 2017, 11:37
आपके मार्गदर्शन के लिए धन्यवाद। स्प्रिंग के JDBC टेम्प्लेट का उपयोग करने से ऑपरेशन का समय 4 तेज हो गया है!
 – 
algorithmic
4 मई 2017, 23:38