informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Daftar isi
3.1. Metode 1: Batasan basis data
3.2. Metode 2: Gunakan kunci untuk membatasi benang
Persyaratan saat ini adalah: memproses data dan menyimpan data dalam database. Selama proses penyimpanan, terlebih dahulu akan ditanyakan apakah data telah disimpan dalam database. Karena data yang akan diproses terlalu besar, maka diperlukan kumpulan thread digunakan untuk pemrosesan simultan.
Saat menulis logika menggunakan metode di atas, akan ada masalah keamanan thread: penyisipan saat pemeriksaan (masalah inkonsistensi data kueri database), mengakibatkan penyisipan data berulang kali. Oleh karena itu, perlu dilakukan upaya untuk membatasi masalah duplikasi data.
Rancang bidang dalam database sebagai indeks unik. Bahkan jika catatan data terkait tidak ditemukan selama kueri (sebenarnya sudah ada dalam database), pengecualian kesalahan bidang duplikat akan dilaporkan selama penyisipan, menyebabkan penyisipan catatan data gagal. Untuk mencapai masalah deduplikasi.
Pilih strategi penguncian yang sesuai berdasarkan skenario bisnis aktual. Penguncian optimis cocok untuk skenario dengan konflik penulisan yang lebih sedikit, dan penguncian pesimis cocok untuk skenario dengan konflik penulisan yang lebih banyak.
Sinkronisasi thread: Gunakan mekanisme sinkronisasi sepertiReentrantLock
、synchronized
dll., untuk memastikan bahwa hanya satu thread yang dapat melakukan operasi kueri dan penyisipan secara bersamaan. Berikut ini menggunakan mekanisme sinkronisasi thread dan desain tampilan kode:
kode antarmuka 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);
- }
Buat kode kelas layanan:
- 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(); // 提交事务
- }
- }
- }
- });
- }
- }
Di atas hanyalah kasus kecil, skenario penggunaan sebenarnya bergantung pada kebutuhan Anda.Jelaskan kode di atas: menggunakanUserService.class
Sebagai objek kunci untuk memastikan bahwa hanya satu thread yang dapat melakukan operasi kueri dan penyisipan pada saat yang bersamaan. Hal ini menghindari masalah konkurensi, namun dapat menyebabkan hambatan kinerja, terutama dalam skenario konkurensi tinggi. Anda dapat mempertimbangkan untuk menggunakan kunci yang lebih terperinci atau kunci tingkat database (seperti kunci pesimistis) untuk mengoptimalkan kinerja.
Logika database operasi kumpulan thread dirancang sesuai dengan kebutuhan, tetapi ada masalah keamanan thread di seluruh proses. Oleh karena itu, dua solusi diperkenalkan secara singkat: ① Menetapkan bidang indeks unik di tabel database ② Menggunakan penguncian untuk memastikan sinkronisasi thread. Saat menggunakannya, sesuaikan dengan skenario sebenarnya. Prosesnya ditulis secara relatif luas dan hanya dua metode yang diperkenalkan. Jika ingin memahaminya secara mendalam, Anda perlu mempelajarinya lebih lanjut. Tentunya saya berharap dapat memberikan sedikit jawaban atas kebingungan Anda melalui sedikit tips dari saya.
Alasan kenapa kamu merasa ingin tidur saat belajar adalah karena disitulah mimpi dimulai.
ଘ(੭ˊᵕˋ)੭ (senang) ଘ(੭ˊᵕˋ)੭ (senang) ଘ(੭ˊᵕˋ)੭ (senang) ଘ(੭ˊᵕˋ)੭ (senang) ଘ(੭ˊᵕˋ)੭ (senang)
------Xiao Liu, yang tidak akan menonjol jika dia tidak menulis kode