1. अवलोकन
4.0 रिलीज से शुरू होकर, MongoDB बहु-दस्तावेज़ ACID लेनदेन का समर्थन करता है। और, स्प्रिंग डेटा लवलेस अब इन मूल MongoDB लेनदेन के लिए समर्थन प्रदान करता है ।
इस ट्यूटोरियल में, हम समकालिक और प्रतिक्रियाशील लेनदेन के लिए स्प्रिंग डेटा MongoDB समर्थन पर चर्चा करेंगे।
हम स्प्रिंग डेटा पर भी एक नज़र डालेंगे TransactionTemplate गैर-देशी लेनदेन समर्थन के लिए।
इस स्प्रिंग डेटा मॉड्यूल के परिचय के लिए, हमारे परिचयात्मक लेखन पर एक नज़र डालें।
2. सेटअप MongoDB 4.0
सबसे पहले, हमें नए मूल लेनदेन समर्थन को आज़माने के लिए नवीनतम MongoDB सेटअप करना होगा।
आरंभ करने के लिए, हमें MongoDB डाउनलोड केंद्र से नवीनतम संस्करण डाउनलोड करना होगा।
इसके बाद, हम mongod शुरू करेंगे कमांड लाइन का उपयोग कर सेवा:
mongod --replSet rs0
अंत में, प्रतिकृति सेट शुरू करें - यदि पहले से नहीं है:
mongo --eval "rs.initiate()"
ध्यान दें कि MongoDB वर्तमान में प्रतिकृति सेट पर लेनदेन का समर्थन करता है।
3. मावेन विन्यास
इसके बाद, हमें अपने pom.xml . में निम्नलिखित निर्भरताओं को जोड़ना होगा :
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>3.0.3.RELEASE</version>
</dependency>
पुस्तकालय का नवीनतम विमोचन केंद्रीय भंडार पर पाया जा सकता है
4. MongoDB कॉन्फ़िगरेशन
अब, हमारे विन्यास पर एक नजर डालते हैं:
@Configuration
@EnableMongoRepositories(basePackages = "com.baeldung.repository")
public class MongoConfig extends AbstractMongoClientConfiguration{
@Bean
MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
@Override
protected String getDatabaseName() {
return "test";
}
@Override
public MongoClient mongoClient() {
final ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/test");
final MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
.applyConnectionString(connectionString)
.build();
return MongoClients.create(mongoClientSettings);
}
}
ध्यान दें कि हमें MongoTransactionManager को पंजीकृत करने की आवश्यकता है हमारे कॉन्फ़िगरेशन में मूल MongoDB लेनदेन को सक्षम करने के लिए क्योंकि वे डिफ़ॉल्ट रूप से अक्षम हैं।
5. तुल्यकालिक लेन-देन
कॉन्फ़िगरेशन समाप्त करने के बाद, हमें केवल मूल MongoDB लेनदेन का उपयोग करने की आवश्यकता है - हमारी पद्धति को के साथ एनोटेट करना है @लेन-देन संबंधी .
एनोटेट विधि के अंदर सब कुछ एक लेनदेन में निष्पादित किया जाएगा:
@Test
@Transactional
public void whenPerformMongoTransaction_thenSuccess() {
userRepository.save(new User("John", 30));
userRepository.save(new User("Ringo", 35));
Query query = new Query().addCriteria(Criteria.where("name").is("John"));
List<User> users = mongoTemplate.find(query, User.class);
assertThat(users.size(), is(1));
}
ध्यान दें कि हम सूची संग्रह का उपयोग नहीं कर सकते हैं एक बहु-दस्तावेज़ लेनदेन के अंदर कमांड - उदाहरण के लिए:
@Test(expected = MongoTransactionException.class)
@Transactional
public void whenListCollectionDuringMongoTransaction_thenException() {
if (mongoTemplate.collectionExists(User.class)) {
mongoTemplate.save(new User("John", 30));
mongoTemplate.save(new User("Ringo", 35));
}
}
यह उदाहरण एक MongoTransactionException फेंकता है जैसा कि हमने CollectionExists() . का उपयोग किया है विधि।
6. लेनदेनटेम्पलेट
हमने देखा कि कैसे स्प्रिंग डेटा नए MongoDB देशी लेनदेन का समर्थन करता है। इसके अतिरिक्त, स्प्रिंग डेटा गैर-देशी विकल्प भी प्रदान करता है।
हम स्प्रिंग डेटा TransactionTemplate का उपयोग करके गैर-देशी लेनदेन कर सकते हैं :
@Test
public void givenTransactionTemplate_whenPerformTransaction_thenSuccess() {
mongoTemplate.setSessionSynchronization(SessionSynchronization.ALWAYS);
TransactionTemplate transactionTemplate = new TransactionTemplate(mongoTransactionManager);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
mongoTemplate.insert(new User("Kim", 20));
mongoTemplate.insert(new User("Jack", 45));
};
});
Query query = new Query().addCriteria(Criteria.where("name").is("Jack"));
List<User> users = mongoTemplate.find(query, User.class);
assertThat(users.size(), is(1));
}
हमें सत्र सिंक्रनाइज़ेशन . सेट करने की आवश्यकता है करने के लिए हमेशा गैर-देशी स्प्रिंग डेटा लेनदेन का उपयोग करने के लिए।
7. प्रतिक्रियाशील लेनदेन
अंत में, हम MongoDB प्रतिक्रियाशील लेनदेन के लिए स्प्रिंग डेटा समर्थन पर एक नज़र डालेंगे ।
हमें pom.xml . में कुछ और निर्भरताएँ जोड़नी होंगी प्रतिक्रियाशील MongoDB के साथ काम करने के लिए:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-reactivestreams</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.0.5</version>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<version>3.2.0.RELEASE</version>
<scope>test</scope>
</dependency>
मोंगोडब-ड्राइवर-रिएक्टिवस्ट्रीम, मोंगोडब-ड्राइवर-सिंक और रिएक्टर-टेस्ट निर्भरता मावेन सेंट्रल पर उपलब्ध हैं।
और निश्चित रूप से, हमें अपने प्रतिक्रियाशील MongoDB को कॉन्फ़िगर करने की आवश्यकता है:
@Configuration
@EnableReactiveMongoRepositories(basePackages
= "com.baeldung.reactive.repository")
public class MongoReactiveConfig
extends AbstractReactiveMongoConfiguration {
@Override
public MongoClient reactiveMongoClient() {
return MongoClients.create();
}
@Override
protected String getDatabaseName() {
return "reactive";
}
}
प्रतिक्रियाशील MongoDB में लेनदेन का उपयोग करने के लिए, हमें inTransaction() . का उपयोग करने की आवश्यकता है ReactiveMongoOperations . में विधि :
@Autowired
private ReactiveMongoOperations reactiveOps;
@Test
public void whenPerformTransaction_thenSuccess() {
User user1 = new User("Jane", 23);
User user2 = new User("John", 34);
reactiveOps.inTransaction()
.execute(action -> action.insert(user1)
.then(action.insert(user2)));
}
स्प्रिंग डेटा में प्रतिक्रियाशील रिपॉजिटरी के बारे में अधिक जानकारी यहाँ उपलब्ध है।