Spring AOP, konfigurasi master-slave MySQL menyadari pemisahan baca dan tulis. Selanjutnya, catat proses konfigurasi Anda sendiri dan masalah yang dihadapi untuk memfasilitasi operasi berikutnya. Saya juga berharap dapat membantu beberapa teman.
1. Gunakan mekanisme intersepsi AOP pegas untuk mewujudkan pemilihan dinamis sumber data.
impor java.lang.annotation.elementType; impor java.lang.annotation.target; impor java.lang.annotation.Retention; impor java.lang.annotation.RetentionPolicy; /** * Runtime * Kompiler akan merekam komentar dalam file kelas, dan VM akan mempertahankan komentar saat runtime, sehingga dapat dibaca secara reflektif. * @Author YangGuang * */ @retention (retentionpolicy.runtime) @target (elementType.method) public @interface dataSource {string value (); } 3. Gunakan Spring's AbstractroutingDataSource untuk menyelesaikan masalah beberapa sumber data
impor org.springframework.jdbc.datasource.lookup.abstractroutingDataSource; Public Class ChoosedataSource memperluas AbstractroutingDataSource {@Override Protected Object DetectionecurrentLookUpkey () {return handleDataSource.getDataSource (); }} 4. Gunakan Threadlocal untuk menyelesaikan masalah keamanan utas
Public Class HandleDataSource {Public Static Final Threadlocal <String> holder = new ThreadLocal <String> (); public static void putDataSource (String DataSource) {holder.set (DataSource); } public static string getDataSource () {return holder.get (); }}5. Tentukan kelas facet sumber data, diakses melalui AOP, dan dikonfigurasi dalam file konfigurasi pegas, jadi tidak ada anotasi AOP yang digunakan.
impor java.lang.reflect.method; impor org.aspectj.lang.joinpoint; impor org.aspectj.lang.annotation.aspect; impor org.aspectj.lang.annotation.Before; impor org.aspectj.lang.annotation.pointcut; impor org.aspectj.lang.reflect.methodsignature; impor org.springframework.stereotype.component; //@aspek //@komponen kelas publik DataSourCeaspect {//@pointcut ("Eksekusi (*com.apc.cms.service.*.*(..))") public void pointcut () {}; // @before (value = "pointcut ()") public void Sebelum (point goinpoint) {objek target = point.getTarget (); System.out.println (target.toString ()); Metode String = point.getSignature (). GetName (); System.out.println (Metode); Kelas <?> [] Classz = target.getClass (). GetInterfaces (); Class <?> [] ParameterTypes = ((Methodyignature) point.getSignature ()) .getMethod (). GetParameterTypes (); coba {Method m = classz [0] .getMethod (metode, parameterTypes); System.out.println (m.getName ()); if (m! = null && m.isAnnotationPresent (DataSource.class)) {DataSource data = m.getAnnotation (DataSource.class); HandleDataSource.putDataSource (data.Value ()); }} catch (Exception e) {e.printstacktrace (); }}}6. Konfigurasikan ApplicationContext.xml
<!-Sumber Data Perpustakaan Utama-> <bean id = "writedataSource" dash-method = "tutup"> <nama properti = "driverclass" value = "com.mysql.jdbc.driver"/> <nama properti = "jdbcurl" value = "jdbc: mysql: //172.22.22.14. name="username" value="root"/> <property name="password" value="root"/> <property name="partitionCount" value="4"/> <property name="releaseHelperThreads" value="3"/> <property name="acquireIncrement" value="2"/> <property name="maxConnectionsPerPartition" value="40"/> <property name="minConnectionsPerPartition" value = "20"/> <name properti = "idlemaxageInconds" value = "60"/> <name properti = "idleConnectionTesteDiodInconds" value = "60"/> <name properti = "poolvailabilityThreshold" value = "5"/> </bean> <!-dari sumber data library-"" "" name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://172.22.14.7:3306/cpp?autoReconnect=true"/> <property name="username" value="root"/> <property name="password" value="root"/> <property name = "PartitionCount" value = "4"/> <properti name = "releaseHelperthreads" value = "3"/> <name properti = "accquireIncrement" value = "2"/> <name properti = "maxConnectionPartition" value = "40"/> <nama properti = "minconnectionSperPartition" value = "20"/20 "/20" <nama properti = "idleConnectionTestPerIodInconds" value = "60"/> <name properti = "poolvailabilityThreshold" value = "5"/> </tagel> <!-Manajer Transaksi, Manajemen Transaksi-> <bean id = "TransactionManager"> <povect name = "DataSource" DataSource "/Datasource" <Context: Annotation-Config /> <!-Pemindaian komponen enale (berhati-hatilah bahwa ini tidak memungkinkan pemindaian mapper!)-> <Context: Component-Scan Base-package = "com.apc.cms.persistence.rdbms" /> <konteks: component-scan basis-paket = "com. Ekspresi = "org.springframework.steretype.component" /> </context: component-scan> <konteks: komponen-scan-package = "com.apc.cms.auth" /> <!-Mengaktifkan demarkasi transaksi dengan anotasi-> <tx-"distrik annotasi /<!-definisi sqlsorpory" sqlsorpory = "BEAN" DISTRIVED /BEANTFICRICORY "DISTRIVENT" <nama properti = "DataSource" ref = "DataSource" /> <properti name = "typealiSespackage" value = "com.apc.cms.model.domain" /> </ bean> <!-scan for pemetaan dan biarkan mereka autowired-> <bean> <properti nama = "basepage" value = "com.m value =" com.m.m.m.m.m.m.pers. " name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean> <bean id="dataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <!-- write --> <entry key="write" value-ref="writeDataSource"/> <!-- read --> <entry key="read" value-ref = "readDataSource"/> </pap> </property> <properti name = "defaultTargetDataSource" ref = "writedatasource"/> </ bean> <!-mengaktifkan fungsi proxy autopproxy autopproxy autopproxy autopproxy a. id = "DataSourCeaspect"/> <aop: config> <aop: aspek id = "c" ref = "DataSourCeaspect"> <aop: pointcut id = "tx" ekspresi = "eksekusi (*com.apc.cms.service ..*.*(..))"/<aop: sebelum pointcut-cms. <!-Konfigurasikan anotasi database AOP->
7. Gunakan anotasi untuk secara dinamis memilih sumber data, dan membaca perpustakaan dan menulis perpustakaan masing -masing.
@DataSource ("tulis") pembaruan public void (pengguna pengguna) {userMapper.update (pengguna); } @DataSource ("baca") dokumen publik getDocbyId (ID panjang) {return documentmapper.getById (id); } Operasi Penulisan Tes: Anda dapat memodifikasi data melalui aplikasi dan memodifikasi data perpustakaan utama. Anda akan menemukan bahwa data di Perpustakaan Slave telah diperbarui secara serempak, sehingga semua operasi penulisan yang ditentukan ditulis di perpustakaan.
Operasi Pembacaan Tes: Ubah data basis data slave di latar belakang, periksa apakah data dalam database utama belum dimodifikasi, menyegarkan pada halaman aplikasi, dan menemukan bahwa data dalam database slave dibaca, yang berarti bahwa pemisahan baca dan tulis tidak apa -apa.
Ringkasan masalah yang ditemui:
Pertanyaan 1: Proyek ini adalah proyek Maven, dan mekanisme AOP pegas digunakan. Selain paket toples inti musim semi, paket toples yang perlu digunakan adalah Aspectj.jar, AspectJweaver.jar, dan aopalliance.jar. Periksa pom dalam proyek dan temukan bahwa paket ketergantungan tidak ada. Karena repositori lokal tidak memiliki stoples ini, cari perpustakaan Maven Central yang dapat memberikan pengunduhan paket JAR, konfigurasikan di Maven, dan secara otomatis memperbarui:
<repository> <d> nexus </dent> <name> nexus </name> <rerl> http://repository.sonatype.org/content/groups/public/ </rrrer> <bayout> default </prayout> </repository>
Guci yang bergantung pada mengkonfigurasi proyek terutama kehilangan keduanya.
<dependency> <groupId> aspekj </groupid> <RaintifactId> aspekjrt </t Artifactid> <version> 1.5.4 </version> </dependency> <dependency> <roupid> aspekj </groupid> <ArTifactId> aspekjweaver </arttifactid> </Versi> 1.5.4 </LT; LT; LT; LT; LT;
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.