1. Vorwort
Bei der Verwendung von Java zur Entwicklung von Unternehmensanwendungssoftware wird Spring+MyBatis+MySQL häufig zum Erstellen eines Datenbank -Frameworks verwendet. Wenn das Datenvolumen groß ist, speichert eine MySQL-Bibliothek die Datenzugriffseffizienz sehr niedrig und verwendet häufig die Methode der Unterlebungsverwaltung von Unterbereitungen. In diesem Artikel wird beschrieben, wie eine Multi-Daten-Zugangs-Architektur über Spring+MyBatis erstellt und Multi-Threading verwendet wird, um die Effizienz des Datenbankzugriffs zu verbessern.
Es ist zu beachten, dass diese Methode nur für Situationen geeignet ist, in denen die Anzahl der Datenbanken und Namen festgelegt und nicht besonders groß ist. Als Antwort auf die Situation, in der die Anzahl der Datenbanken nicht behoben ist, werde ich später einen weiteren Verarbeitungsplan schreiben.
2. Gesamtplan
3. Vorbereitung der Entwicklungsumgebung
3.1 Download Spring, MyBatis, MySQL -Komponenten.
3.2 Eclipse: Java Development IDE. Die folgenden JAR -Pakete werden eingeführt:
Die Codestruktur lautet wie folgt:
4. Erstellen Sie einen Datenbankcluster
Erstellen Sie 11 Datenbanken in MySQL (Test1/2/3/4/5/6/7/8/9/10/11), um eine einfache Tabelle zu erstellen:
Fügen Sie 50 Millionen Daten in die TBL_DEMO -Tabelle in Test1 und 5 Millionen Daten in die TBL_DEMO -Tabelle in den anderen 10 Datenbanken (unter Verwendung von Funktionen) ein.
Fügen Sie 50 Millionen Daten in die TBL_DEMO -Tabelle in Test1 und 5 Millionen Daten in die TBL_DEMO -Tabelle in den anderen 10 Datenbanken (unter Verwendung von Funktionen) ein.
5. Erstellen Sie die MyBatis -Datenbank -Mapping -Schnittstelle
/** * MyBatis Mapping Interface * * * @Author Elon * @Version 1.0, 23. Oktober 2015 */public interface idemo {public void InsertDemo (Demodao Demo); publiclist <Integer> SelectGroup ();}/** * * MyBatis Mapping Service Interface * * @Author Elon * @Version 1.0, 23. Oktober 2015 */public interface idemoService {public void InsertDemo (Demodao Demo); publiclist <Neger> SelectGroup ();}/** * * MyBatis Mapping Service Implementierung * * @Author Elon * @Version 1.0, 23. Oktober 2015 */public class DemoServiceImpl implementiert IdemoService {private ideemo idee = null; public void setidemo (idemo idee) {this.idemo = idee; } @Override public void InsertDemo (Demodao Demo) {ideamo.insertdemo (Demo); } @Override publiclist <Neger> selectGroup () {return idee.selectGroup (); }}6. Erstellen Sie Datenbankidentitätsmanagement und dynamische Datenquellen
/** * * Speichern Sie die Datenbank -ID. Jeder Thread wird von einem unabhängigen Objekt gespeichert * * @Author Elon * @Version 1.0, 23. Oktober 2015 */public class dBindetifier {private static ThreadLocal <string> dbkey = new ThreadLocal <string> (); public static void setdbkey (endgültige String dbkeypara) {dbkey.set (dbkeypara); } public static String getdbkey () {return dbkey.get (); }}/*** Dynamische Datenquelle. Verschiedene Datenbanken können nach verschiedenen Datenindizes in Verbindung gebracht werden }}7. Datenbankzugriffsobjekt erstellen
/** * * Datenbankzugriffsobjekt. Wird zum Einfügen von Daten verwendet. * * @Author Elon * @version 1.0, 23. Oktober 2015 */Public Class Demodao {private int a; private Zeichenfolge B; Privat int C; public int geta () {return a; } public void seta (int a) {this.a = a; } public String getb () {return b; } public void setB (String b) {this.b = b; } public int getC () {return c; } public void setc (int c) {this.c = c; }}/** * Zuordnungsergebnisdefinition * * @Author Elon * @Version 1.0, 23. Oktober 2015 */public class Demoresult implementiert serialisierbar {/** * Kommentar für <Code> serialversionUid </code> <br> * */private statische endgültige long serialversionuid = -413001138792555353535353144l; private lange Summe; public long getum () {return sum; } public void setsum (lange sum) {this.sum = sum; } @Override public String toString () {return string.ValueOf (sum); }}8. Datenbankzugriffsaufgaben erstellen
/*** Datenbankzugriffsaufgabe Definition. Verpacken Sie jede Anforderung in den Datenbankzugriff in ein Task -Objekt, setzen Sie sie in die Aufgabenverwaltung ein und warten Sie, bis die Aufgabenausführung das Ergebnis ausführt und abgerufen wird. * * @Author Elon * @Version 1.0, 23. Oktober 2015 */Public Class DBTASK implementiert Runnable {// Betriebsdatenbankidentität, verwendet zur Angabe der zugegriffenen Datenbank. In Übereinstimmung mit der dynamischen Datenquellendefinition in der Federkonfigurationsdatei. private endgültige String Dbkey; // MyBatis -Datenbankzugriffsobjekt privates endgültiges Objekt dbaccessObject; // Mysbatis Database Access Method -Name, verwendet, um den privaten String -String -MethodName des Anrufs zu reflektieren. // den Wert der variablen Parameter private endgültige Objekt [] Paraarray speichern; // den variablen Parametertyp @SuppressWarnings ("Rawtypes") Private Final Class [] Paracklassarray; // Datenbankbetriebsergebnis. Der Abfragevorgang gibt das Abfrageergebnis zurück. Die Vorgänge einfügen, löschen und ändern. private Objektbetrieben; // Ausnahmeinformationen, die von der Operation Database Private Exception Exception ausgeliefert werden; // Identifizieren Sie, ob die Aufgabe ein privates Boolean -Finish ausgeführt wurde. / *** Konstruktor* @param dbkey database id* @param dbaccessObject Database -Zugriffsobjekt* @param methodname Database Zugriffsmethode Name* @param paraarray Parameterliste*/ public DBTASK (endgültige String Dbkey, endgültiges Objekt DBACCESSObject, endgültige String -Methode, endgültiges Objekt ... ParaArray) {This.dbkey = dbkey; dbkey; this.dbaccessObject = dbaccessObject; this.methodname = methodName; this.Paraarray = paraarray; Finish = falsch; Ausnahme = null; paracklassarray = new class [paraarray.length]; für (int index = 0; index <paraarray.length; ++ Index) {paracklassarray [index] = paraarray [index] .getClass (); } operateresult = null; } / *** Aufgabenausführungsfunktion** / @Override public void run () {try {dbindetifier.setDbkey (dbkey); Methode Methode = dbaccessObject.getClass (). GetMethod (MethodName, ParacklassArray); // Der Abfragevorgang gibt das Abfrageergebnis zurück. Die Vorgänge einfügen, löschen und modifizieren. } catch (Ausnahme e) {exception = e; E. printstacktrace (); } finde = true; } /** * * Geben Sie das Operationsergebnis zurück. Abfragebetrieb gibt Abfrageergebnisse zurück; Einfügen, löschen und ändern Operationen return null * * @Return Operation Ergebnis */ öffentliches Objekt GetRetValue () {return operatersult; } / *** Datenbankoperation Exception** @return Exception* / public Exception getException () {return Exception; } / **** zurückgeben, ob die Aufgabe ausgeführt wurde }}9. Erstellen Sie einen Datenbank -Task -Manager
/*** Datenbankzugriffsaufgabeverwaltung. Legen Sie die Datenbankzugriffsaufgabe in den Thread -Pool, um es auszuführen. * * * @Author Elon * @Version 1.0, 23. Oktober 2015 */public class dBtaskmgr {private statische Klasse DBTASKMGRINSTANCE {public static Final dBtaskMgrin Instance = new DBtaskmgr (); } public static dbtaskmgrin Instance () {return dBtaskMgrinStance.instance; } privater ThreadPoolexecutor -Pool; public dBtaskmgr () {pool = new threadPoolexecutor (10, 50, 60, TimeUnit.Seconds, New ArrayBlockingQueue <Runnable> (10000), neuer ThreadPoolexecutor.Callrunspolicy ()); } public void excute (runnable task) {pool.execute (Aufgabe); }}10. MyBatis -Konfigurationsdatei erstellen
10.1 mybatis.xml
<? ressourcen = "cfg/demomapper.xml"/> </mappers> </configuration>
10.2 Demomapper.xml
<? id = "insertDemo" parameterType = "com.elon.demodao"> in tbl_demo (a, b, c) Werte ( #{a}, #{b}, #{c}) einfügen; </insert> <resultMap id = "Demoresult" type = "com.elon.Demoresult"> <id Property = "sum" column = "sumcolum"/> </resultMap> <select id = "selectGroup" resultMap = "Demoresult"> Summe (a) als Sumcolum aus Tbl_Demo -Gruppe by c; </select> </mapper>11. Federkonfigurationsdatei erstellen
11.1 Spring.xml
<? XSI: Schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-Beans-3.0.xsd" value = "com.mysql.jdbc.driver"> </Property> <Eigenschaft name = "url" value = "jdbc: mysql: //10.70.69.69: 3306/test1"> </Eigenschaft> <Eigenschaft name = "username" value name = "maxactive" value = "100"> </Eigenschaft> <Eigenschaft name = "maxidle" value = "30"> </Eigenschaft> <Eigenschaft name = "maxwait" value = "500"> </Eigenschaft> <Eigenschaft name = "defaultAutocommit" value = "true"> </property> </bean> <bean id = "dataSource_2". value = "com.mysql.jdbc.driver"> </Eigenschaft> <Eigenschaft name = "url" value = "jdbc: mysql: //10.70.69.69: 3306/test2"> </Eigenschaft> <Eigenschaft name = "username" value name="maxActive" value="100"></property> <property name="maxIdle" value="30"></property> <property name="maxWait" value="500"></property> <property name="defaultAutoCommit" value="true"></property> </bean> <bean id="dataSource_3"> <property name="driverClassName" value = "com.mysql.jdbc.driver"> </property> <Eigenschaft name = "url" value = "jdbc: mysql: //10.70.69.69: 3306/test3"> </Eigenschaft> <Eigenschaft name = "username" value name = "maxactive" value = "100"> </Eigenschaft> <Eigenschaft name = "maxidle" value = "30"> </Eigenschaft> <Eigenschaft name = "maxwait" value = "500"> </Eigenschaft> <Eigenschaft name = "defaultAutocommit" value = "true"> </property> </bean> <bean id = "dataSource_" "dribe> <bean id =" datasource_4 "> </ban> <bean id =" dataSource_4 "> </ban> <bean id =" dataSource_4 "> </ban> <bean id =" dataSource_4 " value = "com.mysql.jdbc.driver"> </Eigenschaft> <Eigenschaft name = "url" value = "jdbc: mysql: //10.70.69.69: 3306/test4"> </Eigenschaft> <Eigenschaft name = "username" value name="maxActive" value="100"></property> <property name="maxIdle" value="30"></property> <property name="maxWait" value="500"></property> <property name="defaultAutoCommit" value="true"></property> </bean> <bean id="dataSource_5"> <property name="driverClassName" value = "com.mysql.jdbc.driver"> </Eigenschaft> <Eigenschaft name = "url" value = "jdbc: mysql: //10.70.69.69: 3306/test5"> </Eigenschaft> <Eigenschaft name = "username" value name = "maxactive" value = "100"> </Eigenschaft> <Eigenschaft name = "maxidle" value = "30"> </Eigenschaft> <Eigenschaft name = "maxwait" value = "500"> </Eigenschaft> <Eigenschaft name = "defaultAutocommit" value = "true"> </property> </bean> <bean id = "dataSource_6"> </ban> <bean id = "dataSource_6"> </ban> <bean id = "dataSource_6"> </ban> <bean id = "dataSource_6"> </ban> <bean id = "dataSource_6"> </ban> <bean id = "dataSource_6" value = "com.mysql.jdbc.driver"> </Eigenschaft> <Eigenschaft name = "url" value = "jdbc: mysql: //10.70.69.69: 3306/test6"> </Eigenschaft> <Eigenschaft name = "username" value name = "maxactive" value = "100"> </Eigenschaft> <Eigenschaft name = "maxidle" value = "30"> </Eigenschaft> <Eigenschaft name = "maxwait" value = "500"> </Eigenschaft> <Eigenschaft name = "defaultAutocommit" value = "true"> </property> </bean> <bean id = "dataSource_7"> </ban> <bean id = "dataSource_7"> </ban> <bean id = "dataSource_7" ". value = "com.mysql.jdbc.driver"> </Property> <Eigenschaft name = "url" value = "jdbc: mysql: //10.61.67.246: 3306/test7"> </property> <Eigenschaft name = "username" value name = "maxactive" value = "100"> </Eigenschaft> <Eigenschaft name = "maxidle" value = "30"> </Eigenschaft> <Eigenschaft name = "maxwait" value = "500"> </Eigenschaft> <Eigenschaft name = "defaultAutocommit" value = "true"> </property> </bean> <bean id = "dataSource_8"> </ban> <bean id = "dataSource_8"> </ban> <bean id = "dataSource_8" value = "com.mysql.jdbc.driver"> </Property> <Eigenschaft name = "url" value = "jdbc: mysql: //10.61.67.246: 3306/test8"> </property> <Property name = "username" value name = "maxactive" value = "100"> </Eigenschaft> <Eigenschaft name = "maxidle" value = "30"> </Eigenschaft> <Eigenschaft name = "maxwait" value = "500"> </Eigenschaft> <Eigenschaft name = "defaultAutoCommit" value = "true"> </property> </bean> <bean id = "dataSource_9"> </ban> <bean id = "dataSource_9"> </ban> <bean id = "dataSource_9"> </ban> <bean id = "dataSource_9"> </ban> <bean id = "datasource_9" value = "com.mysql.jdbc.driver"> </property> <Eigenschaft name = "url" value = "jdbc: mysql: //10.61.67.246: 3306/test9"> </property> <Eigenschaft name = "username" value name = "maxactive" value = "100"> </Eigenschaft> <Eigenschaft name = "maxidle" value = "30"> </Eigenschaft> <Eigenschaft name = "maxwait" value = "500"> </Eigenschaft> <Eigenschaft name = "DefaultAutoCommit" value = "true"> </property> </bean> <bean id = "dataSource_10"> </ban> <bean id = "dataSource_10" ". value = "com.mysql.jdbc.driver"> </Property> <Eigenschaft name = "url" value = "jdbc: mysql: //10.61.67.246: 3306/test10"> </property> <Eigenschaft name = "username" value name = "maxactive" value = "100"> </Eigenschaft> <Eigenschaft name = "maxidle" value = "30"> </property> <Eigenschaft name = "maxwait" value = "500"> </Eigenschaft> <Eigenschaft name = "defaultAutocommit" value = "true"> </property> </bean> <bean id = "dataSource_11". value = "com.mysql.jdbc.driver"> </Property> <Eigenschaft name = "url" value = "jdbc: mysql: //10.61.67.246: 3306/test11"> </property> <Property name = "username" value name="maxActive" value="100"></property> <property name="maxIdle" value="30"></property> <property name="maxWait" value="500"></property> <property name="defaultAutoCommit" value="true"></property> </bean> <bean id="dataSource"> <property name="targetDataSources"> <map> <entry KEY = "test1" value-ref = "dataSource_1"/> <Eintragsetaste "test2" Value-ref = "dataSource_2"/> <Eintragsetaste = "test3" Value-ref = "dataSource_3"/> <Eintragsetaste = "test4" value-ref = "dataSource_4"/> <eintragstaste = "test5" test5 "test5" test5 "test5" test5 "test5" test5 "test5" test5 "test5" test5 "test5" test5 "test5" test5 "test5" test5 ""/"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/"/> <"/>" test5 ""/"/> < KEY = "test6" value-ref = "dataSource_6"/> <Eintragsetaste "test7" Value-ref = "dataSource_7"/> <Eintragsetaste = "test8" Value-ref = "dataSource_8"/> <Eintragsetaste = "test9" value-ref = "dataSource_9"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/"/> "/> <"/> "test10" ". key = "test11" value-ref = "dataSource_11"/> </map> </property> </bean> <bean id = " id = "ideemo"> <Eigenschaft name = "mapperinterface" value = "com.elon.idemo"> </property> <Eigenschaft name = "sqlSessionFactory" ref = "
12. Testcode
public class testmain {/** * Testcode * * * @param args */public static void main (string [] args) {@Suppresswarnings ("Ressource") applicationContext context = new classPathxMlApplicationContext ("CFG/Spring.xml"); IdemoService service1 = (idemoService) context.getBean ("idemoService"); // Task -Objekt DBTASK Task1 = new DBtask ("test1", service1, "selectGroup"); DBTASK Task2 = new DBtask ("test2", service1, "selectGroup"); DBTASK Task3 = new DBtask ("test3", service1, "selectGroup"); DBTASK Task4 = new DBtask ("test4", service1, "selectGroup"); DBTASK TACK5 = NEU DBTASK ("test5", service1, "selectGroup"); DBTASK Task6 = new DBtask ("test6", service1, "selectGroup"); DBTASK Task7 = new DBtask ("test7", service1, "selectGroup"); DBTASK Task8 = new DBtask ("test8", service1, "selectGroup"); DBTask Task9 = new DBtask ("test9", service1, "selectGroup"); DBTask Task10 = new DBtask ("test10", service1, "selectGroup"); DBTask Task11 = New DBTask ("test11", service1, "selectGroup"); Demodao Demo = New Demodao (); Demo.seta (10000000); Demo.SetB ("12121212"); Demo.setc (100); DBTASK TaskInsert = new DBtask ("test2", service1, "InsertDemo", Demo); SimpleDateFormat Format = new SimpledateFormat ("yyyy-mm-dd hh: mm: ss"); System.out.println ("Daten starten:" + format.format (New Date ())); DBtaskmgr.instance (). Excute (TaskInsert); while (true) {if (! taskinsert.isfinish ()) {try {thread.sleep (1000); } catch (interruptedException e) {e.printstacktrace (); }} else {break; }} System.out.println ("Data End einfügen:" + format.format (New Date ())); System.out.println ("Abfragen der 50 Millionen Datentabelle:" + format.format (New Date ())); DBTASKMGR.Instance (). Excute (Task1); while (true) {if (! task1.isfinish ()) {try {thread.sleep (1000); } catch (interruptedException e) {e.printstacktrace (); }} else {break; }} System.out.println (Task1.getRetValue ()); System.out.println ("Abfrage 50 Millionen Datentabelle End:" + format.format (neues Datum ())); Liste <DBTask> TaskList = New ArrayList <DBTask> (); TaskList.Add (Task2); TaskList.add (Aufgabe3); TaskList.add (Task4); TaskList.Add (Aufgabe5); TaskList.Add (Task6); TaskList.Add (Task7); TaskList.add (Aufgabe8); TaskList.Add (Task9); TaskList.add (Task10); TaskList.Add (Task11); System.out.println ("Start Abfrage 10 5 Millionen Datentabellen:" + format.format (neues Datum ())); für (DBTASK -Task: TaskList) {dbtaskmgr.instance (). Excute (Aufgabe); } while (true) {int success = 0; für (dBtask Task: TaskList) {if (! task.isfinish ()) {try {thread.sleep (1000); } catch (interruptedException e) {e.printstacktrace (); }} else {++ Erfolg; }} if (success == 10) {break; }} für (DBTASK -Task: TaskList) {System.out.println (Task.getRetValue ()) ;; } System.out.println ("10 5 Millionen Datentabelle Abfrage endet:" +format.format (New Date ())); }}13. Testergebnisse
Es dauert 45er, um eine Datenbank mit 50 Millionen Daten direkt abzufragen.
Es dauert 22s, um 10 Datenbanken mit 5 Millionen Daten synchron zu befragen.
Da auf zwei Servern 10 Datenbanken platziert werden, verfügt ein Server über 5 Datenbanken. Wenn 10 Daten separat auf 10 Servern bereitgestellt werden, ist die Effizienz sogar noch höher.
Zusammenfassen
Das obige ist die Einführung des Editors in Spring+MyBatis+MySQL, um ein verteiltes Datenbankzugriffs -Framework zu erstellen. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!