τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Πίνακας περιεχομένων
3.1 Μέθοδος 1: Περιορισμοί βάσεων δεδομένων
3.2 Μέθοδος 2: Χρησιμοποιήστε κλειδαριές για να περιορίσετε τα νήματα
Οι τρέχουσες απαιτήσεις είναι: επεξεργασία δεδομένων και αποθήκευση δεδομένων στη βάση δεδομένων, θα ρωτήσει πρώτα εάν τα δεδομένα έχουν αποθηκευτεί στη βάση δεδομένων, επειδή τα δεδομένα προς επεξεργασία είναι πολύ μεγάλα χρησιμοποιείται για ταυτόχρονη επεξεργασία.
Κατά τη σύνταξη λογικής χρησιμοποιώντας τις παραπάνω μεθόδους, θα υπάρχουν ζητήματα ασφάλειας νημάτων: εισαγωγή κατά τον έλεγχο (πρόβλημα ασυνέπειας δεδομένων ερωτήματος βάσης δεδομένων), με αποτέλεσμα την επανειλημμένη εισαγωγή δεδομένων. Ως εκ τούτου, είναι απαραίτητο να υιοθετηθούν μέσα για τον περιορισμό του προβλήματος της επικάλυψης δεδομένων.
Σχεδιάστε ένα πεδίο στη βάση δεδομένων ως μοναδικό ευρετήριο Ακόμα κι αν η αντίστοιχη εγγραφή δεδομένων δεν βρεθεί κατά τη διάρκεια του ερωτήματος (στην πραγματικότητα υπάρχει ήδη στη βάση δεδομένων), θα αναφερθεί μια εξαίρεση διπλού σφάλματος πεδίου κατά την εισαγωγή, με αποτέλεσμα να αποτύχει η εισαγωγή της εγγραφής δεδομένων. Για να επιτευχθεί το πρόβλημα της αποδιπλασιασμού.
Επιλέξτε μια κατάλληλη στρατηγική κλειδώματος με βάση τα πραγματικά επιχειρηματικά σενάρια. Το αισιόδοξο κλείδωμα είναι κατάλληλο για σενάρια με λιγότερες διενέξεις εγγραφής και το απαισιόδοξο κλείδωμα είναι κατάλληλο για σενάρια με περισσότερες διενέξεις εγγραφής.
Συγχρονισμός νημάτων: Χρησιμοποιήστε μηχανισμούς συγχρονισμού όπως π.χReentrantLock
、synchronized
κ.λπ., για να διασφαλιστεί ότι μόνο ένα νήμα μπορεί να εκτελεί λειτουργίες ερωτήματος και εισαγωγής ταυτόχρονα. Το παρακάτω χρησιμοποιεί τον μηχανισμό συγχρονισμού νημάτων και τη σχεδίαση εμφάνισης κώδικα:
Κωδικός διεπαφής mybatis:
- import org.apache.ibatis.annotations.*;
-
- public interface UserMapper {
- @Select("SELECT COUNT(*) FROM user WHERE username = #{username}")
- int countByUsername(@Param("username") String username);
-
- @Insert("INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email})")
- @Options(useGeneratedKeys = true, keyProperty = "id")
- int insertUser(User user);
- }
Δημιουργία κωδικού κατηγορίας υπηρεσίας:
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
-
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
-
- public class UserService {
- private final ExecutorService executorService;
- private final SqlSessionFactory sqlSessionFactory;
-
- public UserService(SqlSessionFactory sqlSessionFactory) {
- this.sqlSessionFactory = sqlSessionFactory;
- // 创建固定大小的线程池
- this.executorService = Executors.newFixedThreadPool(10);
- }
-
- public void addUser(User user) {
- executorService.submit(() -> {
- try (SqlSession session = sqlSessionFactory.openSession()) {
- UserMapper userMapper = session.getMapper(UserMapper.class);
-
- synchronized (UserService.class) {
- // 在同步块内执行查询和插入操作
- if (userMapper.countByUsername(user.getUsername()) == 0) {
- userMapper.insertUser(user);
- session.commit(); // 提交事务
- }
- }
- }
- });
- }
- }
Τα παραπάνω είναι απλώς μια μικρή περίπτωση, το πραγματικό σενάριο χρήσης εξαρτάται από τις ανάγκες σας.Εξηγήστε τον παραπάνω κώδικα: χρησιμοποιώνταςUserService.class
Ως αντικείμενο κλειδώματος για να διασφαλιστεί ότι μόνο ένα νήμα μπορεί να εκτελέσει λειτουργίες ερωτήματος και εισαγωγής ταυτόχρονα. Αυτό αποφεύγει ζητήματα ταυτόχρονης χρήσης, αλλά μπορεί να προκαλέσει συμφόρηση απόδοσης, ειδικά σε σενάρια υψηλού συγχρονισμού. Μπορείτε να εξετάσετε το ενδεχόμενο να χρησιμοποιήσετε πιο λεπτομερείς κλειδαριές ή κλειδαριές σε επίπεδο βάσης δεδομένων (όπως απαισιόδοξες κλειδαριές) για να βελτιστοποιήσετε την απόδοση.
Η λογική της βάσης δεδομένων λειτουργίας νήμα έχει σχεδιαστεί σύμφωνα με τις απαιτήσεις, αλλά υπάρχουν ζητήματα ασφάλειας νημάτων σε όλη τη διαδικασία, επομένως, εισάγονται εν συντομία δύο λύσεις: ① Ρύθμιση μοναδικών πεδίων ευρετηρίου στον πίνακα βάσης δεδομένων ② Χρήση κλειδώματος για τη διασφάλιση του συγχρονισμού νημάτων. Όταν το χρησιμοποιείτε, προσαρμόστε το σύμφωνα με το πραγματικό σενάριο. Η διαδικασία είναι γραμμένη με έναν σχετικά ευρύ τρόπο και εισάγονται μόνο δύο μέθοδοι. Φυσικά, ελπίζω να μπορώ να σας δώσω μια μικρή απάντηση στη σύγχυσή σας μέσα από τις μικρές μου συμβουλές.
Ο λόγος για τον οποίο σας αρέσει να κοιμάστε όταν μελετάτε είναι επειδή εκεί ξεκινούν τα όνειρα.
ଘ(੭ˊᵕˋ)੭ (ευτυχισμένος) ଘ(੭ˊᵕˋ)੭ (ευτυχισμένος) ଘ(੭ˊᵕˋ)੭ (ευτυχισμένος) ଘ(੭ˊᵕˋ)੭ (੭ˊᵕˋ)੭ (ευτυχισμένος)
------ Xiao Liu, ο οποίος δεν θα είναι εξαιρετικός αν δεν γράψει κώδικα