1. مقدمة
تعد استراتيجية فصل القراءة والكتابة لقواعد البيانات في بيئة موزعة حلًا رئيسيًا لحل عنق الزجاجة لقراءة قاعدة البيانات وأداء الكتابة ، كما أنها تزيد من سرعة وتوافق بيانات القراءة (القراءة) في التطبيقات.
عند فصل قراءة قاعدة البيانات والكتابة ، نحتاج أولاً إلى تكوين قاعدة البيانات الرئيسية والعبد. أبسط واحد هو سيد وعبد (لأنظمة مواقع الويب الكبيرة ، بالطبع ، سيكون معقدًا للغاية. هنا نحلل فقط أبسط موقف). من خلال تكوين Master-Slave ، تحافظ قاعدة بيانات Master-Slave على نفس البيانات. نصل إلى عبد قاعدة بيانات الرقيق عند إجراء عمليات القراءة وماجستير قاعدة البيانات الرئيسية عند إجراء عمليات الكتابة. هذا سوف يقلل من الضغط على الخادم.
عند إجراء تحليل الحالة لفصل القراءة والكتابة. أولاً ، قم بتكوين النسخ المتماثل الرئيسي لقاعدة البيانات ، وقدم شرحًا مفصلاً للتثبيت المتزامن وتكوين قاعدة بيانات MySQL5.6 (Master/Slave)
بالطبع ، إنها مجرد طريقة بسيطة لمعرفة كيفية استخدام التعليمات البرمجية لتحقيق فصل قراءة قاعدة البيانات والكتابة ، وليس هناك حاجة لتكوين قاعدة بيانات الرقيق الرئيسية. يتطلب فقط جهازين مع تثبيت قاعدة البيانات نفسها.
2. طريقتان لتحقيق فصل القراءة والكتابة
على وجه التحديد في التطوير ، هناك طريقتان شائعتان لتحقيق فصل القراءة والكتابة:
1. الطريقة الأولى هي الطريقة الأكثر استخدامًا ، والتي تتمثل في تحديد اتصالات قاعدة البيانات ، أحدهما هو MasterDataSource والآخر هو slavedataSource. عند تحديث البيانات ، نقرأ MasterDataSource ، وعند الاستعلام عن البيانات ، نقرأ slavedataSource. هذه الطريقة بسيطة للغاية ، لذلك لن أخوض في التفاصيل.
2. الطريقة الثانية لتبديل مصدر البيانات الديناميكي هي نسج مصدر البيانات ديناميكيًا في البرنامج عند تشغيل البرنامج ، وذلك لاختيار قراءة المكتبة الرئيسية أو مكتبة الرقيق. التقنيات الرئيسية المستخدمة هي: التعليق التوضيحي ، الربيع AOP ، الانعكاس.
سيتم وصف طريقة التنفيذ بالتفصيل أدناه.
3. AOP يدرك حالة الفصل القراءة والكتابة لقاعدة بيانات العبد الرئيسية
1. عنوان رمز المشروع
عنوان المشروع الحالي لهذا العرض التوضيحي: العرض التوضيحي
2. هيكل المشروع
في الشكل أعلاه ، بالإضافة إلى الرمز المحدد ، فإن الآخرين هي رمز التكوين ورمز العمل بشكل أساسي.
3. تحليل محدد
هذا المشروع هو عرض تجريبي لإطار SSM ، الربيع ، الربيع MVC و MyBatis. لم يتم تقديم ملفات التكوين المحددة أكثر من اللازم.
(1) يحاكي UserContoller بيانات القراءة والكتابة
/*** تم إنشاؤه بواسطة Xuliugen في 2016/5/4. */@controller@requestMapping (value = "/user" ، تنتج = {"application/json ؛ charset = utf-8"}) فئة عامة USERCONTROLLER //http://localhost:8080/user/select.doResponseBodyRequestMapping (value = "/select.do" ، method = requestMethod.get) السلسلة العامة SELECT () {user user = userService.SelectUserById (123) ؛ إرجاع user.toString () ؛ } //http://localhost:8080/user/add.doResponseBodyRequestMapping (value = "/add.do" ، method = requestMethod.get) السلسلة العامة Add () العودة isok == صحيح؟ "Shibai": "Chenggong" ؛ }}محاكاة البيانات وكتابة البيانات واتصل iuserservice.
(2) Spring-db.xml قراءة وكتابة تكوين مصدر البيانات
<؟ Xmlns: aop = "http://www.springframework.org/schema/aop" http://www.springframework.org/schema/beans/spring-beans-4.0.xsd id = "statfilter" lazy-init = "true"> <property name = "logslowsql" value = "true"/> <property name = "mergesql" value = "true"/> </bean> <! value = "$ {driver}"/> <property name = "url" value = "$ {url1}"/> <property name = "username" value = "root"/> <property name = "password" value = "$ {password}"/> <! lazy-init = "true"> <property name = "driverClassName" value = "$ {driver}"/> <property name = "url" value = "$ {url}"/> <property name = "username" value = "root"/> <property name = "password" value = "$ {password}" -> <bean id = "datasource" lazy-init = "true"> <property name = "targetDatasources"> <map key-type = "java.lang.string" value-type = "javax.sql.datasource"> <! value-ref = "readDataSource"/> </map> </property> <property name = "defaultTargetDatAsource" ref = "writedatasource"/> <property name = "methodtype"> <map key-type = "java.lang.string"> <! <intrade key = "write" value = "، add ، إنشاء ، تحديث ، حذف ، إزالة ،"/> </map> </propertفي التكوين أعلاه ، يتم تكوين ReadDataSource و WritedAtaSource ، ولكن يتم تسليم DataSource فقط إلى sqlsessionfactorybean للإدارة ، واستخدام: com.xuliugen.choosedb.demo.asprict.ChoosedataSource هذا يستخدم اختيار البيانات.
<property name = "methodType"> <map-type-type = "java.lang.string"> <!-read-> <intern key = "read" ، read ، regh ، count ، list ، query "/> <!
تم تكوين الكلمات الرئيسية بادئة قاعدة البيانات. الكود المحدد لـ ChooseDataSource هو كما يلي:
(3) choosedataSource
/*** احصل على مصدر البيانات ، المستخدمة في تبديل مصادر البيانات*/الفئة العامة choosedataSource يمتد ArgTractRoutingDataSource {خريطة ثابتة عامة <سلسلة ، قائمة <string >> method_type_map = new hashmap <string ، list <string> () ؛ / *** قم بتنفيذ الطريقة التجريدية في الفئة الأصل والحصول على اسم مصدر البيانات* regurn*/ كائن محمي DETERNECURRENTOKTOFKEPKEY () {return datasourceHandler.getDataSource () ؛ } // قم بتعيين مصدر البيانات المقابل لسماء الأسلوب البادئة public void setMethodType (Map <String ، String> Map) {for (string key: map.keyset ()) {list <string> v = new ArrayList <string> () ؛ string [] types = map.get (key) .Split ("،") ؛ لـ (نوع السلسلة: أنواع) {if (stringUtils.isNotBlank (type)) {v.add (type) ؛ }} method_type_map.put (المفتاح ، v) ؛ }}}(4) DatasourCeaspect يؤدي اعتراض AOP لطرق محددة
/** * تبديل مصدر البيانات (طرق مختلفة استدعاء مصادر بيانات مختلفة) */@inform@component@enableAseventJautOproxy (proxyTargetClass = true) dataSourCeaseCt {protected logger logger = loggerfactory.getLogger (this.getClass ()) ؛ @pointcut ("التنفيذ (*com.xuliugen.choosedb.demo.mybatis.dao.*.*. point.getTarget (). getClass (). getName () ؛ طريقة السلسلة = point.getSignature (). getName () ؛ logger.info (className + ". حاول {for (مفتاح السلسلة: choosedatasource.method_type_map.keyset ()) {for (نوع السلسلة: choosedataSource.method_type_map.get (مفتاح)) {if (methart.startswith (type)) }}}} catch (استثناء e) {E.PrintStackTrace () ؛ }}}(5) DataSourceHandler ، فئة معالج مصدر البيانات
Package com.xuliugen.choosedb.demo.aspect ؛/*** فئة معالجات مصدر البيانات*/فئة عامة dataSourceHandler {// اسم مصدر البيانات threadpool public static Final Final -threadlocal <string> holder = new threadlocal <string> () ؛ / *** أضف مصادر البيانات التي تم تكوينها وكتابةها إلى الحامل عندما يبدأ المشروع*/ Public Static Void putDataSource (سلسلة بيانات DataSource) {Holder.set (DataSource) ؛ } / *** احصل على سلسلة مصدر البيانات من Holer* / public Static String getDataSource () {return holder.get () ؛ }} الكود الرئيسي ، كما ذكر أعلاه.
رمز في هذه المقالة: العرض التوضيحي
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.