मैं है कोड के निम्नलिखित लाइनों:(Iterable <S> संस्थाओं) कितनी बार डाटाबेस स्प्रिंग आंकड़े जेपीए के बचाने में मारा जाता है
@Transactional
public interface UserRepository extends UserBaseRepository<User> {
}
@NoRepositoryBean
public interface UserBaseRepository<T extends User> extends CrudRepository<T, Long> {
public T findByEmail(String email);
}
यह ठीक चलाता है:
@RequestMapping(value="/persons",method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<List<Person>> saveUsers(@RequestBody List<Person> persons) {
persons = (List<Person>) userRepository.save(persons);
return new ResponseEntity<List<Person>>(persons, HttpStatus.OK);
}
और यहाँ भंडार है । कोड चलाने के दौरान मैं निम्नलिखित लॉग देखता हूं।
Hibernate: insert into user (email, firstname, lastname, user_type) values (?, ?, ?, 'Person')
Hibernate: insert into user (email, firstname, lastname, user_type) values (?, ?, ?, 'Person')
Hibernate: insert into user (email, firstname, lastname, user_type) values (?, ?, ?, 'Person')
Hibernate: insert into user (email, firstname, lastname, user_type) values (?, ?, ?, 'Person')
ऐसा लगता है कि, डेटाबेस 4 बार मारा जाता है। मैंने सहेजने (कार्यान्वयन योग्य ई) विधि के कार्यान्वयन को देखा है, जहां प्रत्येक इकाई को बचाने के लिए लूप चलाया जाता है। तो, मेरे सवालों का है:
- डीबी 4 बार मारा जाता है?
- यदि ऐसा है, तो क्या यह 1 डीबी हिट (स्प्रिंग डेटा जेपीए का उपयोग करके) में किया जा सकता है? ऐसा करने से, क्या बड़ी संख्या में रिकॉर्ड डालने के मामले में यह प्रदर्शन को बढ़ावा देगा?
हां, आप 4 बार डीबी मार रहे हैं। यदि आप हाईलोड अनुप्रयोगों के साथ काम कर रहे हैं, तो अच्छा विचार हाइबरनेट बैच का उपयोग करना होगा या ... मल्टीथ्रेडिंग का उपयोग करके अपना बैच ऑपरेशन करें। – Reborn
यह निर्भर करता है कि आप डेटाबेस से टकराने 4 बार से क्या मतलब है - आप शायद एक कनेक्शन है, जहां वास्तविक लागत की संभावना कनेक्शन – farrellmr
@farrellmr पैदा कर रही है पर 4 आवेषण है है: मैं भी यही लगता है। तो, प्रदर्शन बिंदु से जेडीबीसी के तैयार स्टेटमेंट के एडबैच() और executebatch() से रिकॉर्ड अधिक सम्मिलित करने का उपरोक्त समाधान है? –