Κοινή χρήση τεχνολογίας

Υπάρχουν ζητήματα ασφάλειας νημάτων στη βάση δεδομένων λειτουργίας thread pool

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Πίνακας περιεχομένων

1. Εισαγωγή

2. Ερώτηση

3. Λύση

3.1 Μέθοδος 1: Περιορισμοί βάσεων δεδομένων

3.2 Μέθοδος 2: Χρησιμοποιήστε κλειδαριές για να περιορίσετε τα νήματα

4. Περίληψη


1. Εισαγωγή

Οι τρέχουσες απαιτήσεις είναι: επεξεργασία δεδομένων και αποθήκευση δεδομένων στη βάση δεδομένων, θα ρωτήσει πρώτα εάν τα δεδομένα έχουν αποθηκευτεί στη βάση δεδομένων, επειδή τα δεδομένα προς επεξεργασία είναι πολύ μεγάλα χρησιμοποιείται για ταυτόχρονη επεξεργασία.

2. Ερώτηση

Κατά τη σύνταξη λογικής χρησιμοποιώντας τις παραπάνω μεθόδους, θα υπάρχουν ζητήματα ασφάλειας νημάτων: εισαγωγή κατά τον έλεγχο (πρόβλημα ασυνέπειας δεδομένων ερωτήματος βάσης δεδομένων), με αποτέλεσμα την επανειλημμένη εισαγωγή δεδομένων. Ως εκ τούτου, είναι απαραίτητο να υιοθετηθούν μέσα για τον περιορισμό του προβλήματος της επικάλυψης δεδομένων.

3. Λύση

3.1 Μέθοδος 1: Περιορισμοί βάσεων δεδομένων

Σχεδιάστε ένα πεδίο στη βάση δεδομένων ως μοναδικό ευρετήριο Ακόμα κι αν η αντίστοιχη εγγραφή δεδομένων δεν βρεθεί κατά τη διάρκεια του ερωτήματος (στην πραγματικότητα υπάρχει ήδη στη βάση δεδομένων), θα αναφερθεί μια εξαίρεση διπλού σφάλματος πεδίου κατά την εισαγωγή, με αποτέλεσμα να αποτύχει η εισαγωγή της εγγραφής δεδομένων. Για να επιτευχθεί το πρόβλημα της αποδιπλασιασμού.

3.2 Μέθοδος 2: Χρησιμοποιήστε κλειδαριές για να περιορίσετε τα νήματα

Επιλέξτε μια κατάλληλη στρατηγική κλειδώματος με βάση τα πραγματικά επιχειρηματικά σενάρια. Το αισιόδοξο κλείδωμα είναι κατάλληλο για σενάρια με λιγότερες διενέξεις εγγραφής και το απαισιόδοξο κλείδωμα είναι κατάλληλο για σενάρια με περισσότερες διενέξεις εγγραφής.

Συγχρονισμός νημάτων: Χρησιμοποιήστε μηχανισμούς συγχρονισμού όπως π.χReentrantLocksynchronized κ.λπ., για να διασφαλιστεί ότι μόνο ένα νήμα μπορεί να εκτελεί λειτουργίες ερωτήματος και εισαγωγής ταυτόχρονα. Το παρακάτω χρησιμοποιεί τον μηχανισμό συγχρονισμού νημάτων και τη σχεδίαση εμφάνισης κώδικα:

Κωδικός διεπαφής mybatis:

  1. import org.apache.ibatis.annotations.*;
  2. public interface UserMapper {
  3. @Select("SELECT COUNT(*) FROM user WHERE username = #{username}")
  4. int countByUsername(@Param("username") String username);
  5. @Insert("INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email})")
  6. @Options(useGeneratedKeys = true, keyProperty = "id")
  7. int insertUser(User user);
  8. }

Δημιουργία κωδικού κατηγορίας υπηρεσίας:

  1. import org.apache.ibatis.session.SqlSession;
  2. import org.apache.ibatis.session.SqlSessionFactory;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. public class UserService {
  6. private final ExecutorService executorService;
  7. private final SqlSessionFactory sqlSessionFactory;
  8. public UserService(SqlSessionFactory sqlSessionFactory) {
  9. this.sqlSessionFactory = sqlSessionFactory;
  10. // 创建固定大小的线程池
  11. this.executorService = Executors.newFixedThreadPool(10);
  12. }
  13. public void addUser(User user) {
  14. executorService.submit(() -> {
  15. try (SqlSession session = sqlSessionFactory.openSession()) {
  16. UserMapper userMapper = session.getMapper(UserMapper.class);
  17. synchronized (UserService.class) {
  18. // 在同步块内执行查询和插入操作
  19. if (userMapper.countByUsername(user.getUsername()) == 0) {
  20. userMapper.insertUser(user);
  21. session.commit(); // 提交事务
  22. }
  23. }
  24. }
  25. });
  26. }
  27. }

Τα παραπάνω είναι απλώς μια μικρή περίπτωση, το πραγματικό σενάριο χρήσης εξαρτάται από τις ανάγκες σας.Εξηγήστε τον παραπάνω κώδικα: χρησιμοποιώνταςUserService.class Ως αντικείμενο κλειδώματος για να διασφαλιστεί ότι μόνο ένα νήμα μπορεί να εκτελέσει λειτουργίες ερωτήματος και εισαγωγής ταυτόχρονα. Αυτό αποφεύγει ζητήματα ταυτόχρονης χρήσης, αλλά μπορεί να προκαλέσει συμφόρηση απόδοσης, ειδικά σε σενάρια υψηλού συγχρονισμού. Μπορείτε να εξετάσετε το ενδεχόμενο να χρησιμοποιήσετε πιο λεπτομερείς κλειδαριές ή κλειδαριές σε επίπεδο βάσης δεδομένων (όπως απαισιόδοξες κλειδαριές) για να βελτιστοποιήσετε την απόδοση.

4. Περίληψη

Η λογική της βάσης δεδομένων λειτουργίας νήμα έχει σχεδιαστεί σύμφωνα με τις απαιτήσεις, αλλά υπάρχουν ζητήματα ασφάλειας νημάτων σε όλη τη διαδικασία, επομένως, εισάγονται εν συντομία δύο λύσεις: ① Ρύθμιση μοναδικών πεδίων ευρετηρίου στον πίνακα βάσης δεδομένων ② Χρήση κλειδώματος για τη διασφάλιση του συγχρονισμού νημάτων. Όταν το χρησιμοποιείτε, προσαρμόστε το σύμφωνα με το πραγματικό σενάριο. Η διαδικασία είναι γραμμένη με έναν σχετικά ευρύ τρόπο και εισάγονται μόνο δύο μέθοδοι. Φυσικά, ελπίζω να μπορώ να σας δώσω μια μικρή απάντηση στη σύγχυσή σας μέσα από τις μικρές μου συμβουλές.


Ο λόγος για τον οποίο σας αρέσει να κοιμάστε όταν μελετάτε είναι επειδή εκεί ξεκινούν τα όνειρα.
ଘ(੭ˊᵕˋ)੭ (ευτυχισμένος) ଘ(੭ˊᵕˋ)੭ (ευτυχισμένος) ଘ(੭ˊᵕˋ)੭ (ευτυχισμένος) ଘ(੭ˊᵕˋ)੭ (੭ˊᵕˋ)੭ (ευτυχισμένος)
------ Xiao Liu, ο οποίος δεν θα είναι εξαιρετικός αν δεν γράψει κώδικα