ניתוחי נתונים של MongoDB באביב

1. סקירה כללית

החל משחרור 4.0, MongoDB תומך בעסקאות ACID מרובות מסמכים. וגם Spring Data Lovelace מספק כעת תמיכה בעסקאות הילידים של MongoDB.

במדריך זה נדון בתמיכת Spring Data MongoDB לעסקאות סינכרוניות ותגובות.

אנו נסתכל גם על Spring Data TransactionTemplate לתמיכה בעסקאות שאינן מקוריות.

לקבלת היכרות עם מודול Spring Data זה, עיין במחקר ההיכרות שלנו.

2. הגדר את MongoDB 4.0

ראשית, נצטרך להתקין את MongoDB האחרונה כדי לנסות את התמיכה החדשה בעסקאות מקומיות.

כדי להתחיל, עלינו להוריד את הגרסה האחרונה ממרכז ההורדות של MongoDB.

לאחר מכן נתחיל מונגוד שירות באמצעות שורת הפקודה:

mongod --replSet rs0

לבסוף, יזם את קבוצת העתקים - אם עדיין לא:

mongo --eval "rs.initiate ()"

שים לב ש- MongoDB תומך כרגע בעסקאות באמצעות מערך העתק.

3. תצורת Maven

לאחר מכן, עלינו להוסיף את התלות הבאות שלנו pom.xml:

 org.springframework.data spring-data-mongodb 3.0.3.RELEASE 

המהדורה האחרונה של הספרייה נמצאת במאגר המרכזי

4. תצורת MongoDB

עכשיו, בואו נסתכל על התצורה שלנו:

@Configuration @EnableMongoRepositories (basePackages = "com.baeldung.repository") מעמד ציבורי MongoConfig מרחיב את AbstractMongoClientConfiguration {@Bean MongoTransactionManager transactionManager (MongoDatabaseFactory dbFactory) {להחזיר MongoTransactionFanager חדש (dbFactory); } מחרוזת מוגנת @Override getDatabaseName () {להחזיר "מבחן"; } @Override ציבור MongoClient mongoClient () {final ConnectionString connectionString = ConnectionString חדש ("mongodb: // localhost: 27017 / test"); סופי MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); החזירו את MongoClients.create (mongoClientSettings); }}

ציין זאת אנחנו צריכים להירשם MongoTransactionManager בתצורה שלנו כדי לאפשר עסקאות MongoDB מקוריות מכיוון שהן מושבתות כברירת מחדל.

5. עסקאות סינכרוניות

לאחר שסיימנו את התצורה, כל שעלינו לעשות בכדי להשתמש בעסקאות ילידי MongoDB - הוא לעשות זאת ביאור השיטה שלנו עם @ Transactional.

כל מה שנמצא בשיטה המסומנת יבוצע בעסקה אחת:

@Test @Transactional public void whenPerformMongoTransaction_thenSuccess () {userRepository.save (משתמש חדש ("ג'ון", 30)); userRepository.save (משתמש חדש ("רינגו", 35)); שאילתת שאילתות = שאילתה חדשה (). AddCriteria (Criteria.where ("שם"). הוא ("ג'ון")); משתמשים ברשימה = mongoTemplate.find (שאילתה, User.class); assertThat (users.size (), הוא (1)); }

שים לב שאנחנו לא יכולים להשתמש listCollections פקודה בתוך עסקה מרובת מסמכים - לדוגמא:

@Test (צפוי = MongoTransactionException.class) @Transactional public void whenListCollectionDuringMongoTransaction_thenException () {if (mongoTemplate.collectionExists (User.class)) {mongoTemplate.save (משתמש חדש ("ג'ון", 30)); mongoTemplate.save (משתמש חדש ("רינגו", 35)); }}

דוגמה זו זורקת א MongoTransactionException כפי שהשתמשנו ב- collectionExists () שיטה.

6. TransactionTemplate

ראינו כיצד Spring Data תומכים בעסקה חדשה של MongoDB. בנוסף, נתוני האביב מספקים גם את האפשרות הלא-ילידית.

אנו יכולים לבצע עסקאות שאינן מקוריות באמצעות Spring Data TransactionTemplate:

@Test הציבור בטל givenTransactionTemplate_whenPerformTransaction_thenSuccess () {mongoTemplate.setSessionSynchronization (SessionSynchronization.ALWAYS); TransactionTemplate transactionTemplate = חדש TransactionTemplate (mongoTransactionManager); transactionTemplate.execute (חדש TransactionCallbackWithoutResult () {@Override מוגן ריק doInTransactionWithoutResult (מצב TransactionStatus) {mongoTemplate.insert (משתמש חדש ("קים", 20)); mongoTemplate.insert (משתמש חדש ("ג'ק", 45));} ;}); שאילתת שאילתות = שאילתה חדשה (). AddCriteria (Criteria.where ("שם"). הוא ("Jack")); משתמשים ברשימה = mongoTemplate.find (שאילתה, User.class); assertThat (users.size (), הוא (1)); }

אנחנו צריכים להגדיר SessionSynchronization ל תמיד להשתמש בעסקאות Spring Data שאינן מקוריות.

7. עסקאות תגובתיות

לבסוף, נסתכל על Spring Data תמיכה בעסקאות תגובתיות של MongoDB.

נצטרך להוסיף עוד כמה תלות ב- pom.xml לעבוד עם MongoDB תגובתי:

 org.mongodb mongodb-driver-reactivestreams 4.1.0 org.mongodb mongodb-driver-sync 4.0.5 io.projectreactor reactor-test 3.2.0. שחרור מבחן 

התוספות של mongodb-driver-reactivestream, mongodb-driver-sync ותלות במבחן הכור זמינות ב- Maven Central.

וכמובן, עלינו להגדיר את MongoDB התגובה שלנו:

@Configuration @EnableReactiveMongoRepositories (basePackages = "com.baeldung.reactive.repository") מעמד ציבורי MongoReactiveConfig מרחיב AbstractReactiveMongoConfiguration {@Override ציבור MongoClient reactiveMongoClient () {להחזיר MongoClients.c; } מחרוזת מוגנת @Override getDatabaseName () {להחזיר "תגובתי"; }}

כדי להשתמש בעסקאות ב- MongoDB תגובתי, עלינו להשתמש ב- inTransaction () שיטה ב פעולות מונגו תגובתי:

@Autowired פרטי ReactiveMongoOperations reactiveOps; @ מבחן ציבורי בטל כאשר ביצוע ביצוע Transaction_thenSuccess () {משתמש משתמש 1 = משתמש חדש ("ג'יין", 23); משתמש משתמש 2 = משתמש חדש ("ג'ון", 34); reactiveOps.inTransaction () .execute (action -> action.insert (user1) .then (action.insert (user2))); }

מידע נוסף על מאגרים תגובתי ב- Spring Data זמין כאן.

8. מסקנה

במחקר זה למדנו כיצד להשתמש בעסקאות יליד ולא יליד MongoDB באמצעות Spring Data.

קוד המקור המלא של הדוגמאות זמין באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found