Pada dasarnya, artikel di Internet hanya memiliki beberapa sumber data atau hanya sumber data dinamis, sementara proyek terbaru perlu menggunakan dua metode secara bersamaan. Mari kita catat metode konfigurasi untuk referensi Anda.
Skenario Aplikasi
Proyek ini perlu menghubungkan dua database A dan B yang berbeda pada saat yang sama, dan keduanya adalah arsitektur master-slave, satu perpustakaan menulis dan beberapa perpustakaan baca.
Beberapa sumber data
Pertama, Anda harus menonaktifkan konfigurasi DataSourceAutocOconfiguration yang dilengkapi dengan Spring Boot, karena akan membaca Spring.Datasource.* Properti dari file application.properties dan secara otomatis mengkonfigurasi sumber data tunggal. Cukup tambahkan atribut Kecualikan ke anotasi @springbootApplication:
@SpringbootApplication (exclude = {DataSourCeautoconfiguration.class}) kelas publik titanWebApplication {public static void main (string [] args) {springApplication.run (titanWebApplication.class, args); }}Kemudian konfigurasikan informasi koneksi sumber multi-data di application.properties:
# Perpustakaan Titan spring.datasource.titan-master.url = jdbc: mysql: // xxxx: port/titan? karakterencoding = utf-8spring.datasource.titan-master.u sername = spring.datasource.titan-master.password = spring.datasource.titan-master.driver-class-name = com.mysql.jdbc.driver# Konfigurasi Pool Koneksi# Omit# Perpustakaan Lainnya spring.datasource.db2.url = jdbc: mysql: // xxxx: port/titan2? karakterenCoding = utf-8spring.datasource.db2.username = spring.dataSource.db2.password = spring.datasource.db2.driver.driver.driver
Karena kami telah menonaktifkan konfigurasi sumber data otomatis, kami perlu secara manual membuat sumber data ini pada langkah berikutnya:
@Configurationpublic class DataSourceConfig { @Bean(name = "titanMasterDS") @ConfigurationProperties(prefix = "spring.datasource.titan-master") // Prefix of the corresponding property in application.properteis public DataSource dataSource1() { return DataSourceBuilder.create().build(); } @Bean (name = "ds2") @configurationproperties (prefix = "spring.datasource.db2") // awalan properti yang sesuai di application.properteis public dataSource (); }}Selanjutnya, Anda perlu mengonfigurasi dua mybatis sqlsessionFactory untuk menggunakan sumber data yang berbeda:
@Configuration @mapperscan (BasePackages = {"titan.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory1") kelas publik mybatisdbaconfig {@autowired @qualifier ("titanmasterds") data data pribadi; @Bean Public SQLSessionFactory SQLSessionFactory1 () melempar Exception {sqlSessionFactoryBean factoryBean = SQLSessionFactoryBean baru (); FactoryBean.SetDataSource (DS1); // Gunakan sumber data Titan untuk terhubung ke Titan Library Return factoryBean.getObject (); } @Bean Public SQLSessionTemplate SQLSessionTemplate1 () melempar Exception {SQLSessionTemplate Template = SQLSessionTemplate baru (SQLSessionFactory1 ()); // Gunakan pabrik yang dikonfigurasi di atas untuk mengembalikan template; }}Setelah konfigurasi di atas, antarmuka mapper di bawah titan.mapper akan menggunakan sumber data Titan. Demikian pula, Anda dapat menggunakan SQLSessionFactory kedua:
@Configuration @mapperscan (BasePackages = {"Other.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory2") kelas publik mybatisdbbconfig {@autowired @qualifier ("ds2") private dataSource ds2; @Bean Public SQLSessionFactory SQLSessionFactory2 () melempar Exception {sqlSessionFactoryBean factorybean = SQLSessionFactoryBean baru (); FactoryBean.SetDataSource (DS2); return factorybean.getObject (); } @Bean Public SQLSessionTemplate SQLSessionTemplate2 () melempar Exception {SQLSessionTemplate Template = SQLSessionTemplate baru (SQLSessionFactory2 ()); Template Kembalikan; }}Setelah menyelesaikan konfigurasi ini, misalkan ada 2 mapper titan.mapper.usermapper dan lainnya.mapper.rolemapper. Saat menggunakan yang pertama, perpustakaan Titan akan terhubung secara otomatis, dan yang terakhir akan terhubung ke pustaka DS2.
Sumber Data Dinamis
Tujuan asli menggunakan sumber data dinamis adalah untuk dapat memisahkan baca dan menulis di lapisan aplikasi, yaitu, untuk mengontrol metode kueri yang berbeda dalam kode program untuk terhubung ke perpustakaan yang berbeda. Selain metode ini, middleware basis data juga merupakan pilihan yang baik. Keuntungannya adalah bahwa cluster database hanya terpapar ke perpustakaan tunggal untuk aplikasi dan tidak perlu mengubah logika kode dari sumber data.
Kami mewujudkan pengalihan sumber data dinamis melalui anotasi khusus + AOP.
Pertama -tama tentukan contextholder untuk menyimpan nama sumber data yang digunakan oleh utas saat ini:
DataSourCeContExtholder kelas publik {logger final static public Log = loggerFactory.getLogger (DataSourCeContExtholder.class); / *** Sumber Data Default*/ String Akhir Statis Public Default_DS = "Titan-master"; Threadlocal final private statis <string> contextholder = threadlocal baru <> (); // Atur nama sumber data public static void setDB (string dBType) {log.debug ("Switch ke {} sumber data", dBType); contextholder.set (dbtype); } // Dapatkan nama sumber data string statis publik getDb () {return (contextholder.get ()); } // Hapus nama sumber data public static void clearDb () {contextholder.remove (); }}Kemudian sesuaikan implementasi antarmuka javax.sql.datasource. Di sini Anda hanya perlu mewarisi kelas induk AbstractroutingDataSource yang telah diterapkan Spring untuk kami terlebih dahulu:
Public Class DynamicDataSource memperluas abstractroutingDataSource {private static final logger log = loggerFactory.getLogger (DynamicDataSource.class); @Override Protected Object DetectionecurrentLookUpkey () {LOG.DEBUG ("Sumber data adalah {}", DataSourCeContExTholder.getdb ()); return DataSourCeContExtholder.getDb (); }}Buat Sumber Data Dinamis:
/ *** Sumber Data Dinamis: Peralihan Dinamis antara Sumber Data yang Berbeda Melalui AOP* @Return*/ @bean (name = "DynamicDS1") DataSource public DataSource () {DynamicDataSource DynamicDataSource = new DynamicDataSource (); // sumber data default DynamicDataSource.setDefaultTargetDataSource (DataSource1 ()); // Konfigurasikan peta sumber multi-data <objek, objek> dsmap = hashmap baru (5); dsmap.put ("titan-master", DataSource1 ()); dsmap.put ("DS2", DataSource2 ()); DynamicDataSource.SetTargetDataSources (DSMAP); Return DynamicDataSource; }Annotation @DS khusus digunakan untuk menentukan sumber data mana yang digunakan metode saat pengkodean:
@Retention (retentionpolicy.runtime) @Target ({elementType.method}) public @interface ds {string value () default "titan-master";}Tulis bagian AOP untuk mengimplementasikan logika switching:
@Aspek@componentPublic kelas DynamicDataSourCeaspect {@Before ("@annotation (ds)") public void beforeswitchds (point joinpoint) {// Dapatkan kelas akses kelas saat ini <?> ClassName = point.getTarget (). GetClass (); // Dapatkan Metode Akses Metode String MethodName = point.getSignature (). GetName (); // Dapatkan jenis parameter dari kelas metode [] argclass = ((Methodyignature) point.getSignature ()). GetParameterTypes (); String DataSource = DataSourCeContExtholder.Default_DS; coba {// objek metode yang diakses adalah metode metode = className.getMethod (MethodName, argclass); // Tentukan apakah ada anotasi @DS yang ada jika (Method.isannotationPresent (ds.class)) {ds annotation = method.getannotation (ds.class); // ambil nama sumber data dalam anotasi dataSource = annotation.value (); }} catch (Exception e) {e.printstacktrace (); } // sakelar sumber data DataSourCeContExtholder.setDb (DataSource); } @After (" @annotation (DS)") public void afterswitchds (point joinpoint) {DataSourCeContExtholder.cleardb (); }}Setelah menyelesaikan konfigurasi di atas, menentukan DynamicDataSource dalam konfigurasi SQLSessionFactory sebelumnya untuk menggunakan DynamicDataSource untuk dengan senang hati mengalihkan sumber data di Layanan:
@Autowired private useramodelmapper useramapper; @Ds ("titan-master") public string ds1 () {return useramapper.selectByprimaryKey (1) .getName (); } @Ds ("ds2") public string ds2 () {return useramapper.selectByprimarykey (1) .getName (); }Meringkaskan
Di atas adalah Spring Boot + MyBatis Multi-Data Source dan metode konfigurasi sumber data dinamis yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!