1. Vorwort
Die Lesen- und Schreibstrategie von Datenbanken in einer verteilten Umgebung ist eine Schlüssellösung, um den Engpass der Datenbank -Lese- und Schreibleistung zu lösen, und maximiert auch die Geschwindigkeit und Parallelität der Lesen (Lesedaten) in Anwendungen.
Beim Trennen von Datenbank lesen und schreiben müssen wir zunächst den Datenbankmaster und den Sklaven konfigurieren. Das einfachste ist ein Master und ein Sklave (für große Website -Systeme wird es natürlich sehr kompliziert sein. Hier analysieren wir nur die einfachste Situation). Durch die Master-Slave-Konfiguration verwaltet die Master-Slave-Datenbank die gleichen Daten. Wir greifen bei der Ausführung von Lesevorgängen und auf den Master -Datenbankmaster auf den Slave -Datenbank -Slave zu, wenn sie Schreibvorgänge ausführen. Dies verringert den Druck auf einen Server.
Bei der Durchführung einer Fallanalyse von Lese- und Schreibtrennung. Konfigurieren Sie zunächst die Master-Slave-Replikation der Datenbank und geben Sie eine detaillierte Erläuterung der synchronen Installation und Konfiguration des MySQL5.6-Datenbank-Master-Slave (Master/Slave) an.
Natürlich ist es nur eine einfache Möglichkeit zu sehen, wie Sie Code verwenden, um die Trennung der Datenbank lesen und zu schreiben, und es müssen nicht die Master- und Slave -Datenbank konfiguriert werden. Es erfordert nur zwei Maschinen mit derselben Datenbank.
2. zwei Möglichkeiten, Lesen- und Schreibtrennung zu erreichen
Insbesondere in der Entwicklung gibt es zwei allgemeine Möglichkeiten, Lesen- und Schreibtrennung zu erreichen:
1. Die erste Methode ist die am häufigsten verwendete Methode, bei der zwei Datenbankverbindungen definiert werden. Einer ist MasterDataSource und der andere ist Slavedatasource. Bei der Aktualisierung der Daten lesen wir die MasterDataSource und beim Abfragen der Daten die Sklavenatasource. Diese Methode ist sehr einfach, daher werde ich nicht auf Details eingehen.
2. Die zweite Methode zum Umschalten der dynamischen Datenquellen besteht darin, die Datenquelle dynamisch in das Programm einzubeziehen, wenn das Programm ausgeführt wird, um die Masterbibliothek oder die Slave -Bibliothek zu lesen. Die verwendeten Haupttechnologien sind: Annotation, Frühlings -AOP, Reflexion.
Die Implementierungsmethode wird nachstehend ausführlich beschrieben.
3. AOP erkennt den Fall der Master-Sklaven-Datenbank von Lese- und Schreiben von Trennungen
1. Projektcodeadresse
Die aktuelle Projektadresse dieser Demo: Demo
2. Projektstruktur
In der obigen Abbildung sind die anderen zusätzlich zum markierten Code hauptsächlich Konfigurationscode und Geschäftscode.
3. Spezifische Analyse
Dieses Projekt ist eine Demo des SSM -Frameworks, des Frühlings, der Spring MVC und der MyBatis. Die spezifischen Konfigurationsdateien werden nicht zu viel eingeführt.
(1) UserContoller simuliert das Lesen und Schreiben von Daten
/*** Erstellt von Xuliugen am 2016/5/4. */@Controller@requestMapping (value = "/user", produziert = {"application/json; charset = utf-8"}) öffentliche Klasse UserController {@Inject private iUSerService Userservice; //http://localhost:8080/user/select.do @responsebody @RequestMapping (value = "/Select.do", method = RequestMethod.get) public String select () {user user = userService.selectUserById (123); return user.toString (); } //http://localhost:8080/user/add.do @responsebody @RequestMapping (value = "/add.do", method = RequestMethod.get) Public String add () {boolean isok = userservice.adduser (neuer Benutzer ("333", "444"); return isok == true? "Shibai": "Chenggong"; }}Simulieren Sie das Lesen und Schreiben von Daten und rufen Sie IuserService an.
(2) Spring-db.xml Lesen und Schreiben Sie die Datenquellenkonfiguration
<? xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.spingframework.org/schema/beans http://www.springframe.org/schema/beans-ban- http://www.springframework.org/schema/aop http://www.springFramework.org/schema/aop/spring-aop.xsd "> <bean id =" Statfilter "Lazy-init =" True ". value="true"/> </bean> <!-- Database Connection--> <bean id="readDataSource" destroy-method="close" init-method="init" lazy-init="true"> <property name="driverClassName" value="${driver}"/> <property name="url" value="${url1}"/> <property name="username" value="root"/> <property name="password" value="${password}"/> <!-- Omit some content--> </bean> <bean id="writeDataSource" destroy-method="close" init-method="init" lazy-init="true"> <property name="driverClassName" value="${driver}"/> <property name="url" value = "$ {url}"/> <Eigenschaft name = "userername" value = "root"/> <Eigenschaft name = "password" value = "$ {password}"/> <!-Ausrücken Sie einige Inhalte aus-> </bean> <!-Dynamisch zugewiesene Les- und Schreibdatenquellen-> <Bean idaSources = "dataSources" lazy-init = "true"> "tacedaTaSources" -Init "-Init" -Init "-Init"> "tazipa"> "tazicy". key-type = "java.lang.String" value-type = "javax.sql.dataSource"> <!-write-> <Eintragsschlüssel = "Schreiben" value-ref = "Writedatasource"/> <!-Read-> <Eintragstaste "read" ref = ref = ref = " name = "defaultTargetDataSource" ref = "wititedataSource"/> <Eigenschaft name = "methodeType"> <map key-type </map> </property> </bean> </beans>In der obigen Konfiguration werden ReadDataSource und WititedataSource konfiguriert, aber nur DataSource wird an SQLSessionFactoryBean zur Verwaltung übergeben, und die Verwendung von: com.xuliugen.choosedb.demo.aspep.chosedataSource Dies wird für die Datenbankauswahl verwendet.
<property name="methodType"> <map key-type="java.lang.String"> <!-- read --> <entry key="read" value=",get,select,count,list,query"/> <!-- write --> <entry key="write" value=",add,create,update,delete,remove,"/> </map></property>
Die datenbankspezifischen Präfix -Schlüsselwörter sind konfiguriert. Der spezifische Code von ChooStataSource lautet wie folgt:
(3) Choosedatasource
/*** Die Datenquelle abrufen, die zum wechselnden Datenquellen dynamisch wechselt*/öffentliche Klasse ChoosedataSource erweitert AbstractroutingDataSource {public static map <String, Liste <String >> method_type_map = new Hashmap <String, Liste <String >> (); / *** Implementieren Sie die abstrakte Methode in der übergeordneten Klasse und erhalten Sie den Datenquellennamen* @return*/ Protected Object DeterleCurrentLookupkey () {return DataSourceHandler.getDataSource (); } // Setzen Sie die Datenquelle, die dem Präfix des Methodennamens public void setMethodtype entspricht (MAP <String, String> MAP) {für (String -Schlüssel: map.keyset ()) {list <string> v = new ArrayList <string> (); String [] type = map.get (Schlüssel) .Split (","); für (String -Typ: Typen) {if (stringutils.isnotblank (type)) {v.add (type); }} Method_type_map.put (Schlüssel, v); }}}(4) DataSourceAsPect führt einen AOP -Intercept für bestimmte Methoden durch
/** * Datenquelle wechseln (verschiedene Methoden rufen verschiedene Datenquellen an) */@Aspekt@component@enableaSpectjautoproxy (proxytargetClass = true) öffentliche Klasse dataSourceEtPect {protected logger logger = loggerfactory.getLogger (this.getClass ()); @Pointcut ("Execution (*com.xuliugen.choosedb.demo.mybatis.dao.*. point.gettarget (). getClass (). getName (); String method = point.getSignature (). GetName (); logger.info (className + ". try {für (String -Schlüssel: ChoosedataSource.method_type_map.keyset ()) {für (String -Typ: ChoosedataSource.method_type_map.get (Schlüssel)) {if (methode.startsWith (type)) {dataSourceHandler.putDataSource (Schlüssel); }}}} catch (Ausnahme e) {e.printstacktrace (); }}}(5) DataSourceHandler, die Handlerklasse der Datenquelle
Paket com.xuliugen.choosedb.demo.aspespe;/*** Handlerklasse der Datenquelle*/public class DataSourceHandler {// Datenquellenname ThreadPool public static Final ThreadLocal <string> Holder = new ThreadLocal <string> (); / *** Fügen Sie die konfigurierten Lese- und Schreibdatenquellen zum Halter hinzu, wenn das Projekt beginnt*/ public static void putDataSource (String DataSource) {Holder.set (DataSource); } / *** Die Datenquellenzeichenfolge aus der Holer* / public static String getDataSource () {return Holder.get (); }} Der Hauptcode, wie oben erwähnt.
Code in diesem Artikel: Demo
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.