1。序文
Javaを使用してエンタープライズアプリケーションソフトウェアを開発する場合、Spring+MyBatis+MySQLがデータベースフレームワークの構築に使用されることがよくあります。データボリュームが大きい場合、MySQLライブラリはデータアクセス効率を非常に低く保存し、多くの場合、サブレポジトリストレージ管理の方法を使用します。この記事では、Spring+MyBatisを介してマルチデータベースアクセスアーキテクチャを構築し、マルチスレッドを使用してデータベースアクセス効率を向上させる方法について説明します。
この方法は、データベースと名前の数が固定されており、特に大きくない状況にのみ適していることに注意する必要があります。データベースの数が修正されていない状況に応じて、後で別の処理計画を書きます。
2。全体的な計画
3。開発環境の準備
3.1 Spring、MyBatis、MySQLコンポーネントをダウンロードします。
3.2日食:Java Development IDE。次のJARパッケージが導入されています。
コード構造は次のとおりです。
4.データベースクラスターを作成します
MySQLに11のデータベースを作成します(test1/2/3/4/5/6/7/8/9/10/11)。簡単なテーブルを作成します。
Test1のTBL_DEMOテーブルに5000万個のデータを挿入し、500万個のデータを他の10個のデータベースのTBL_DEMOテーブルに挿入します(関数を使用)。
Test1のTBL_DEMOテーブルに5000万個のデータを挿入し、500万個のデータを他の10個のデータベースのTBL_DEMOテーブルに挿入します(関数を使用)。
5. MyBatisデータベースマッピングインターフェイスを作成します
/** * mybatisマッピングインターフェイス * * * @author elon * @version 1.0、2015年10月23日 */publicインターフェイスidemo {public void insertdemo(demodao demo); public list <integer> selectgroup();}/** * * mybatisマッピングサービスインターフェイス * * @author elon * @version 1.0、2015年10月23日 */public interface idemoservice {public void insertdemo(demodao demo); public list <integer> selectgroup();}/** * * mybatisマッピングサービスの実装 * * @author elon * @version 1.0、2015年10月23日 */パブリッククラスのdemoserviceimplはidemoservice {private idemo idea = null; public void setidemo(idemo Idea){this.idemo = Idea; } @Override public void insertdemo(demodao demo){ideamo.insertdemo(demo); } @Override public List <Integer> SelectGroup(){return Idea.selectgroup(); }}6.データベースID管理と動的なデータソースを作成します
/** * *データベースIDを保存します。各スレッドは独立したオブジェクトによって保存されます * * @author elon * @version 1.0、2015年10月23日 */public class dbindetifier {private stathic threadlocal <string> dbkey = new threadlocal <string>(); public static void setdbkey(final string dbkeypara){dbkey.set(dbkeypara); } public static string getdbkey(){return dbkey.get(); }}/***動的データソース。さまざまなデータベースは、さまざまなデータインデックスに従って接続できます * * @author elon * @version 1.0、2015年10月23日 */public class dynamicdatasource extends abstractroutingdatasource {@Override public Object detinecurrentlookupkey(){return dbindetifier.getdbkey(); }}7.データベースアクセスオブジェクトを作成します
/** * *データベースアクセスオブジェクト。データを挿入するために使用されます。 * * @author elon * @version 1.0、2015年10月23日 */public class demodao {private int a;プライベート文字列B; Private 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; }}/** *マッピング結果定義 * * @author elon * @version 1.0、2015年10月23日 */公開クラスの悪魔serializable {/** *コメント<code> serialversionuid </code> <br> * */private static final long serialversionuid = -4130013879231448l;プライベートの長い合計; public long getsum(){return sum; } public void setsum(long sum){this.sum = sum; } @Override public string toString(){return string.valueof(sum); }}8.データベースアクセスタスクを作成します
/***データベースアクセスタスク定義。各リクエストをデータベースアクセスにタスクオブジェクトにパッケージ化し、タスク管理に入れてから、タスクの実行が完了して実行結果を取得するのを待ちます。 * * @author elon * @version 1.0、2015年10月23日 */public class dbtask実装{//アクセスしたデータベースの指定に使用されるデータベースIDの操作。 Spring構成ファイルのデータ動的データソース定義と一致しています。プライベートファイナルストリングdbkey; // mybatisデータベースアクセスオブジェクトプライベート最終オブジェクトdbaccessObject; // mysbatisデータベースアクセス方法名。 //変数パラメーターの値を保存プライベート最終オブジェクト[] Paraarray; //変数パラメータータイプ@suppresswarnings( "rawTypes")プライベート最終クラス[] Paraclassarrayを保存します。 //データベースの操作結果。クエリ操作はクエリ結果を返します。操作の挿入、削除、および変更null。プライベートオブジェクトoperateresult; //操作データベースのプライベート例外例外によってスローされた例外情報。 //タスクがプライベートブール仕上げに実行されているかどうかを特定します。 / ** constructor* @param dbkeyデータベースID* @param dbaccessobject databaseアクセスオブジェクト* @param methodnameデータベースアクセスメソッド名* @param paraarrayパラメーターリスト*/ public dbtask(最終的なdbkey、最終オブジェクトdbaccessobject、final string methodname、final Array ... paraarray = dbkey; this.dbaccessObject = dbaccessObject; this.methodname = methodname; this.paraarray = paraarray;仕上げ= false;例外= null; paraclassarray = new class [paraarray.length]; for(int index = 0; index <paraarray.length; ++ index){paraclassarray [index] = paraarray [index] .getClass(); } operateresult = null; } / ***タスク実行機能** / @Override public void run(){try {dbindetifier.setdbkey(dbkey);メソッドメソッド= dbaccessObject.getClass()。getMethod(MethodName、ParaclassArray); //クエリ操作はクエリ結果を返します。挿入、削除、および変更操作は、null operateresult = method.invoke(dbaccessobject、paraarray)を返します。 } catch(例外e){例外= e; e.printstacktrace(); } finish = true; } /** * *操作結果を返します。クエリ操作はクエリの結果を返します。操作を挿入、削除、および変更null * * @return操作結果 */ public Object getRetValue(){return operateresult; } / ***データベース操作例外をスロー** @return例外* /パブリック例外getException(){return Exception; } / ****タスクが実行されたかどうかを返します** @return tag* / public boolean isfinish(){return finish; }}9.データベースタスクマネージャーを作成します
/***データベースアクセスタスク管理。データベースアクセスタスクをスレッドプールに入れて実行します。 * * * @author elon * @version 1.0、2015年10月23日 */public class dbtaskmgr {private static class dbtaskmgrinstance {public static final dbtaskmgr instance = new dbtaskmgr(); } public static dbtaskmgr instance(){return dbtaskmgrinstance.instance; } private threadpoolexecutorプール。 public dbtaskmgr(){pool = new threadPoolexecutor(10、50、60、TimeUnit.seconds、new ArrayBlockingQueue <Runnable>(10000)、new SthreadPoolexecutor.CallerrunSpolicy()); } public void excute(runnable task){pool.execute(task); }}10。mybatis構成ファイルを作成します
10.1 mybatis.xml
<?xml version = "1.0" encoding = "utf-8"?> <!doctype構成public " - // mybatis.org//dtd config 3.0 // en" "http://mybatis.org/dtd/mybatis-3-config.dtd" resource = "cfg/demomapper.xml"/> </mappers> </configuration>
10.2 Demomapper.xml
<?xml version = "1.0" encoding = "utf-8"?> <!doctype mapper public " - // mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" parametertype = "com.elon.demodao"> tbl_demoに挿入(a、b、c)値(#{a}、#{b}、#{c}); </insert> <resultmap id = "demoreult" type = "com.elon.demoresult"> <id property = "sum" column "/> </resultmap> <select id =" selectgroup "resultmoreult"> select sum(a)> select sum(a)as sumcolum as tbl_demo group by c; </select> </mapper>11.スプリング構成ファイルを作成します
11.1 spring.xml
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id = "dataSource_1" value = "com.mysql.jdbc.driver"> </property> <property name = "url" value = "jdbc:mysql://10.70.69.69:3306/test1"> </property name = "username" value = "user123"> </propertion name = "maxactive" value = "100"> </property> <property name = "maxidle" value = "30"> </property name = "maxwait" value = "500"> </property name> <property namit = "defaultautocommit" value = "true"> </property> </bean> < value = "com.mysql.jdbc.driver"> </property> <property name = "url" value = "jdbc:mysql://10.70.69.69:3306/test2"> </property name = "username" value = "user123"> </propertion name = "maxactive" value = "100"> </property> <property name = "maxidle" value = "30"> </property name = "maxwait" value = "500"> </property name> <property namit = "defaultautocommit" value = "true"> </property> </bean> < value = "com.mysql.jdbc.driver"> </property> <property name = "url" value = "jdbc:mysql://10.70.69.69:3306/test3"> </property name = "username" value = "user123"> </property = propertion = "fally =" us balue = name = "maxactive" value = "100"> </property> <property name = "maxidle" value = "30"> </property name = "maxwait" value = "500"> </property name> <property namit = "defaultautocommit" value = "true"> </property> </bean> <bean id = "dataSource_4 value = "com.mysql.jdbc.driver"> </property> <property name = "url" value = "jdbc:mysql://10.70.69.69:3306/test4"> </property name = "username" value = "user123"> </property = propertion = "propertion =" us balue = "users123" name = "maxactive" value = "100"> </property> <property name = "maxidle" value = "30"> </property name = "maxwait" value = "500"> </property name> <property namit = "defaultautocommit" value = "true"> </jean> <bean id = "dataSource_5"> <""> < value = "com.mysql.jdbc.driver"> </property> <property name = "url" value = "jdbc:mysql://10.70.69.69:3306/test5"> </property name = "username" value = "user123"> </property = propertion = "propertion =" us balue> name = "maxactive" value = "100"> </property> <property name = "maxidle" value = "30"> </property name = "maxwait" value = "500"> </property name> <property namit = "defaultautocommit" value = "true"> </property> </bean> <bean id = "datasource_6 value = "com.mysql.jdbc.driver"> </property> <property name = "url" value = "jdbc:mysql://10.70.69.69:3306/test6"> </property name = "username" value = "user123"> </property = property = "propertion =" us balue> name = "maxactive" value = "100"> </property> <property name = "maxidle" value = "30"> </property name = "maxwait" value = "500"> </property name> <property namit = "defaultautocommit" value = "true"> </jean> <bean id = "dataSource_7 value = "com.mysql.jdbc.driver"> </property> <property name = "url" value = "jdbc:mysql://10.61.67.246:3306:3306/test7"> </property name> <property name = "username" value = "user123" name = "maxactive" value = "100"> </property> <property name = "maxidle" value = "30"> </property name = "maxwait" value = "500"> </property name> <property name = "defaultautocommit" value = "true"> </property> </bean> < value = "com.mysql.jdbc.driver"> </property> <property name = "url" value = "jdbc:mysql://10.61.67.246:3306:3306/test8"> </property> <プロパティ名= "username" value = "users123">プロパティ=プロパティ= name = "maxactive" value = "100"> </property> <property name = "maxidle" value = "30"> </property name = "maxwait" value = "500"> </property name> <property name = "defaultautocommit" value = "true"> </property> </bean> < value = "com.mysql.jdbc.driver"> </property> <property name = "url" value = "jdbc:mysql://10.61.67.246:3306:3306/test9"> </property name = "username" value = "users123">プロパティ=プロパティ= "fall> name = "maxactive" value = "100"> </property> <property name = "maxidle" value = "30"> </property name = "maxwait" value = "500"> </property name> <property namit = "defaultautocommit" value = "true"> </property> </bean> < value = "com.mysql.jdbc.driver"> </property> <property name = "url" value = "jdbc:mysql://10.61.67.246:3306:3306/test10"> </property name> <Property name = "username" value = "user123" name = "maxactive" value = "100"> </property> <property name = "maxidle" value = "30"> </property name = "maxwait" value = "500"> </property name> <property namit = "defaultautocommit" value = "true"> </property> </bean> < value = "com.mysql.jdbc.driver"> </property> <property name = "url" value = "jdbc:mysql://10.61.67.246:3306:3306/test11"> </property name = "username" value = "users123">財産= "uspation =" usurs1123 " name = "maxactive" value = "100"> </property> <property name = "maxidle" value = "30"> </property name = "maxwait" value = "500"> </property name> <property namit = "defaultautocommit" value = "true"> </property> </bean> <bean = "> <<< key = "test1" value-ref = "datasource_1"/> <entry key = "test2" value-ref = "datasource_2"/> <entry key = "test3" value-ref = "datasource_3"/> <entry key = "test4" value-ref = "dataSource_4 key = "test6" value-ref = "datasource_6"/> <entry key = "test7" value-ref = "datasource_7"/> <entry key = "test8" value-ref = "datasource_8"/> <entry key = "test9" value-ref = "datasource_9 key = "test11" value-ref = "datasource_11"/>> </map> </property> </bean> <bean id = "sqlsessionfactory"> <プロパティ名= "configlocation" value = "classpath:cfg/mybatis.xml"> </property> <property name = "datasource"/<bean <プロパティ名= "mapperinterface" value = "com.elon.idemo"> </property> <Property name = "sqlsessionfactory" ref = "sqlsessionfactory"> </property> </bean> <bean id = "idemoservice"> <property name = "idemo" ref = "idemo"> </パイプロパティ> </bean> </bean> </bean> </bean
12。テストコード
public class testmain {/** * test code * * * @param args */public static void main(string [] args){@suppresswarnings( "resource")ApplicationContext Context = new ClassPathXMLApplicationContext( "CFG/Spring.xml"); idemoservice service1 =(idemoservice)context.getbean( "idemoservice"); //タスクオブジェクト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 task5 = new 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( "挿入挿入データ:" + format.format(new date())); dbtaskmgr.instance()。excute(taskinsert); while(true){if(!taskinsert.isfinish()){try {thread.sleep(1000); } catch(arturnedexception e){e.printstacktrace(); }} else {break; }} system.out.println( "データend:" + format.format(new date())); System.out.println( "5,000万のデータテーブルのクエリを開始します:" + format.format(new date())); dbtaskmgr.instance()。excute(task1); while(true){if(!task1.isfinish()){try {thread.sleep(1000); } catch(arturnedexception e){e.printstacktrace(); }} else {break; }} system.out.println(task1.getRetValue()); System.out.println( "5,000万のデータテーブルエンド:" + format.format(new date())); List <DBTASK> TASKLIST = new ArrayList <DBtask>(); TaskList.Add(Task2); TaskList.Add(Task3); TaskList.Add(Task4); TaskList.Add(Task5); TaskList.Add(Task6); TaskList.Add(Task7); TaskList.Add(Task8); TaskList.Add(task9); TaskList.Add(Task10); TaskList.Add(Task11); System.out.println( "クエリを開始します10 500万のデータテーブル:" + format.format(new date())); for(dbtask task:tasklist){dbtaskmgr.instance()。excute(task); } while(true){int success = 0; for(dbtask task:tasklist){if(!task.isfinish()){try {thread.sleep(1000); } catch(arturnedexception e){e.printstacktrace(); }} else {++ success; }} if(success == 10){break; }} for(dbtask task:tasklist){system.out.println(task.getRetValue());; } system.out.println( "1,000万500万のデータテーブルクエリの終了:" +format.format(new date())); }}13。テスト結果
5,000万データのデータベースを直接照会するには45秒かかります。
同期方法で500万のデータを持つ10のデータベースを照会するには22秒かかります。
10のデータベースが2つのサーバーに配置されるため、1つのサーバーには5つのデータベースがあります。 10個のデータが10個のサーバーに個別に展開されると、効率がさらに高くなります。
要約します
上記は、分散データベースアクセスフレームワークを構築するためのSpring+MyBatis+MySQLの編集者の紹介です。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!