Feder AOP, die MySQL-Master-Slave-Konfiguration realisiert Lesen und Schreiben von Trennung. Nehmen Sie anschließend Ihren eigenen Konfigurationsprozess und Ihre eigenen Probleme auf, um den nächsten Vorgang zu erleichtern. Ich hoffe auch, einigen Freunden zu helfen.
1. Verwenden Sie den Feder -AOP -Interception -Mechanismus, um die dynamische Auswahl von Datenquellen zu realisieren.
Import Java.lang.Annotation.Elementtype; importieren java.lang.annotation.target; importieren java.lang.annotation.retention; Import Java.lang.annotation.RetentionPolicy; /** * Laufzeit * Der Compiler zeichnet die Kommentare in der Klassendatei auf, und die VM behält die Kommentare zur Laufzeit bei, sodass sie reflektierend gelesen werden kann. * @author yangguang * */ @retention (retentionPolicy.Runtime) @target (elementtype.method) public @Interface DataSource {String value (); } 3.. Verwenden Sie Spring's AbstractroutingDataSource von Spring, um das Problem mehrerer Datenquellen zu lösen
import org.springframework.jdbc.datasource.lookup.abstractingDataSource; öffentliche Klasse Choosedatasource erweitert AbstractroutingDataSource {@Override Protected Object DeterminecurrentLookupkey () {return handledatasource.getDataSource (); }} 4. Verwenden Sie ThreadLocal, um Fadensicherheitsprobleme zu lösen
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. Definieren Sie eine Datenquellen -Facettenklasse, auf die über AOP zugegriffen wird und in der Federkonfigurationsdatei konfiguriert ist, sodass keine AOP -Annotation verwendet wird.
import Java.lang.reflect.Method; import org.aspespectj.lang.joinpoint; import org.aspespectj.lang.annotation.aspep; import org.aspespectj.lang.annotation.before; import org.aspespectj.lang.annotation.pointcut; import org.aspespectj.lang.reflect.methodsignature; import org.springframework.stereotype.comPonent; //@Aspekt //@component public class dataSourceEtspekte {//@pointcut ("Ausführung (*com.apc.cms.service.*.*(..)") public void pointCut () {}; // @before (value = "pointCut ()") public void vor (joinpoint point) {Object target = point.gettarget (); System.out.println (target.toString ()); String method = point.getSignature (). GetName (); System.out.println (Methode); Class <?> [] Classz = target.getClass (). GetInterfaces (); Klasse <?> [] ParameterTypes = ((methodeInt) point.getSignature ()) .getMethod (). GetParameterTypes (); try {method m = classz [0] .GetMethod (Methode, Parameterypes); System.out.println (M.GetName ()); if (m! = null && m.isannotationPresent (dataSource.class)) {dataSource data = M.Getannotation (DataSource.class); HandledataSource.putDataSource (data.Value ()); }} catch (Ausnahme e) {e.printstacktrace (); }}}6. Konfigurieren Sie applicationContext.xml
<!-Hauptbibliotheksdatenquelle-> <bean id = "Wititedatasource" Destroy-method = "Close"> <Eigenschaft name = "driverClass" value = "com.mysql.jdbc.driver"/> <Eigenschaft name = "jdbcurl" value = "jdbc: mysql: //172.22.14.14.6: 3306/cpp? name = "userername" value = "root"/> <Eigenschaft name = "password" value = "root"/> <Eigenschaft name = "partitionCount" value = "4"/> <Eigenschaft name = "ReleaseHelperThreads" value = "3"/> <Eigenschaft name = "accoderIncrement" value = "2"/> <Eigenschaftsname = MaxConNectionScherneePartition ". name = "minconnectionSperPartition" value = "20"/> <Eigenschaft name = "idlemaxageInseconds" value = "60"/> <Eigenschaft name = " zerstören-method = "close"> <Eigenschaft name = "DriverClass" value = "com.mysql.jdbc.driver value = "root"/> <Eigenschaft name = "partitionCount" value = "4"/> <Eigenschaft name = "ReleaseHelperThreads" value = "3"/> <Eigenschaft name = "AccireIncrement" value = "2"/> <Eigenschaft Name = "MaxConnectionPartition" Value = "40"/> <Eigenschaftsname = "minconnectionSperctition name = "idlemaxageInseconds" value = "60"/> <Eigenschaft name = "idleconnectionTestPeriodIneSconds" value = "60"/> <Property name = "poolAvailabilityThreshold" value = "5"/> </bean> <!-Transaktionsmanager, Transaktionsmanagement-> <bean id = "transactionManager"> </> <"> <"> <"> <"> <"> <"> <"> < </bean> <!-- Annotation-loading--> <context:annotation-config /> <!--enale component scanning (beware that this does not enable mapper scanning!)--> <context:component-scan base-package="com.apc.cms.persistence.rdbms" /> <context:component-scan base-package="com.apc.cms.service"> <Kontext: Include-filter type = "Annotation" Expression = "org.springFramework.steretype.comPonent" /> < /context: component-scan> <context: component-scan base-package = "com.apc.cms.Auth" /<!-Transaktions-Transaktions-Demarcation mit Annotation-> <Tx: Annotation-> <Tx: Annotation-<tx: Annotation-<tx: Annotation-<tx: Annotation-<Tx: Annotation-<tx: <tx: Annotation-<tx: Annotation-<tx: tex. -> <bean id = " value = "com.apc.cms.Persistence" /> <Eigenschaft name = "sqlSessionFactory" ref = " Value-ref = "WititedataSource"/> <!-read-> <Eintrags Key = "lesen" value-ref = "readDataSource"/> </map> </property> <Property name = "defaultTargetDataSource" Ref = "Wititedatasource"/> </> </bean> <! Proxy-Target-Class = "True"/> <!-Datenbankannotation AOP-> <bean id = "dataSourceAsspect"/> <AOP: config> <aoP: Aspekt id = "c" ref = "dataSourceSect"> <AOP: pointcut id = "tx" expression = "com.apc.cms pointcut-ref = "tx" methode = "vor"/> </aoP: Aspekt> </aop: config> <!-Konfigurieren Sie die Datenbankannotation AOP->
7. Verwenden Sie Annotationen, um die Datenquelle dynamisch auszuwählen, die Bibliothek und schreiben Sie die Bibliothek.
@DataSource ("write") public void Update (Benutzerbenutzer) {UsMapper.Update (Benutzer); } @DataSource ("read") öffentliches Dokument getDoCById (Long ID) {return documentMapper.getbyid (id); } TEST -Schreibvorgang: Sie können die Daten über die Anwendung ändern und die Hauptbibliotheksdaten ändern. Sie werden feststellen, dass die Daten in der Sklavenbibliothek synchron aktualisiert wurden, sodass die definierten Schreibvorgänge in der Bibliothek geschrieben sind.
Operation zum Testen von Testen: Ändern Sie die SLAVE -Datenbankdaten im Hintergrund, prüfen Sie, ob die Daten in der Hauptdatenbank nicht geändert wurden, auf der Anwendungsseite aktualisieren und feststellen, dass die Daten in der SLAVE -Datenbank gelesen werden, was bedeutet, dass die Lese- und Schreibtrennung in Ordnung ist.
Zusammenfassung der aufgetretenen Probleme:
Frage 1: Das Projekt ist ein Maven -Projekt, und der Frühlings -AOP -Mechanismus wird verwendet. Zusätzlich zu den Kern -Jar -Paketen des Frühlings sind die JAR -Pakete, die verwendet werden müssen, Aspektjar, Aspektjweaver.jar und Aopalliance.jar. Überprüfen Sie das POM im Projekt und stellen Sie fest, dass das Abhängigkeitspaket fehlt. Da das lokale Repository diese Gläser nicht hat, suchen Sie nach der Maven Central Library, in der das JAR -Paket heruntergeladen, in Maven konfiguriert und automatisch aktualisiert wird:
<Repository> <ID> Nexus </id> <name> Nexus </name> <URL> http://repository.sonatype.org/content/groups/public/ </url> <layout> stammt aus </layout> </repository>
Die Gläser, die für die Konfiguration des Projekts abhängig sind, fehlen hauptsächlich diese beiden.
<De vorhöhe> <gruppe> Aspekte </GroupId> <artifactID> Aspektjrt </artifactId> <version> 1.5.4 </Version> </abhängig> <Deponcise> <GroupId> AspektJ </Groupid> <artifactid> Aspekt> Abhängigkeit> </artifactID> <version> 1.5.4 </Version> lt;
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.