जैसा कि आपने कहा था कि MySQlProxy एक समाधान हो सकता है, लेकिन मैंने व्यक्तिगत रूप से कभी भी उत्पादन में इसका परीक्षण नहीं किया।
मैं लिखने और पढ़ने के अनुरोधों को विभाजित करने के लिए अपने कोड में 2 डीबी कनेक्शन का उपयोग करता हूं। सामान्य कार्यों में से 80% रीड कनेक्शन के साथ किए जाते हैं। आप उपयोग कर सकते हैं multidb">Zend_Application_Resource_Multidb इसे संभालने के लिए (मेरे लिए मैंने यह हिस्सा बहुत पहले किया है और मैं बस रजिस्ट्री में दूसरा डीबी कनेक्शन स्टोर करता हूं)।
- पहले अपने उपयोगकर्ता अधिकारों को केवल ऑनरीड ऑपरेशन सीमित करें और राइट ऑथराइजेशन के साथ एक और dbuser बनाएं।
- फिर अपने कोड में प्रत्येक लिखने के अनुरोध को ट्रैक करें ("अपडेट", "इन्सर्ट", "डिलीट" एक अच्छी शुरुआत है) और इन सभी कॉल्स को एक समर्पित हेल्पर के साथ करने का प्रयास करें।
- अपना ऐप चलाएं और इसे क्रैश होते हुए देखें, फिर समस्याएं ठीक करें :-)
जब आप शुरुआत में इस समस्या के बारे में सोचते हैं तो यह आसान होता है। उदाहरण के लिए:
- मेरे पास आमतौर पर एक Zend_Db_Table फ़ैक्टरी होती है, जो 'रीड' या 'राइट' पैरामीटर लेती है, और मुझे सही Zend_Db_Table का सिंगलटन देती है (एक डुअल सिंगलटन, यह मेरे पास एक रीड इंस्टेंस और एक राइट इंस्टेंस हो सकता है)। तब मुझे केवल यह सुनिश्चित करने की आवश्यकता है कि जब मैं लेखन पहुंच प्रश्नों/संचालनों का उपयोग करता हूं तो मैं सही प्रारंभिक Zend_Db_Table का उपयोग करता हूं। ध्यान दें कि Zend_Db_Table को सिंगलटन के रूप में उपयोग करते समय स्मृति उपयोग कहीं बेहतर है।
- मैं ट्रांजेक्शनहैंडलर में सभी लेखन कार्यों को प्राप्त करने का प्रयास करता हूं। मैं वहां जांच कर सकता हूं कि मैं केवल सही कनेक्शन से जुड़ी वस्तुओं का उपयोग करता हूं। लेन-देन तब नियंत्रकों पर प्रबंधित होते हैं, मैं कभी भी डेटाबेस परतों में लेनदेन का प्रबंधन करने की कोशिश नहीं करता, सभी प्रारंभ/प्रतिबद्ध/रोलबैक सोच नियंत्रकों (या किसी अन्य वैचारिक परत, लेकिन डीएओ परत पर नहीं) पर की जाती है।
यह अंतिम बिंदु, लेन-देन, महत्वपूर्ण है। यदि आप लेन-देन का प्रबंधन करना चाहते हैं तो लेन-देन के अंदर पढ़ें अनुरोध . करना महत्वपूर्ण है , WRITE-सक्षम कनेक्शन . के साथ . जैसा कि लेन-देन से पहले किए गए सभी पठन को पुराना माना जाना चाहिए, और यदि आपका डेटाबेस बैकएंड इम्प्लीकेट लॉक कर रहा है, तो आपको ताले प्राप्त करने के लिए रीड अनुरोध करना होगा। यदि आपका डेटाबेस बैकएंड निहित पठन नहीं कर रहा है तो आपको लेन-देन में पंक्ति लॉक भी करना होगा। और इसका मतलब है कि आपको उस अनुरोध को केवल-पढ़ने के लिए कनेक्शन पर धकेलने के लिए SELECT कीवर्ड पर भरोसा नहीं करना चाहिए।
यदि आपके पास अपने आवेदन में एक अच्छा डीबी परत उपयोग है तो परिवर्तन करना वास्तव में कठिन नहीं है। यदि आपने अपने डेटाबेस/डीएओ परत के साथ अराजक चीजें बनाई हैं तो... यह कठिन हो सकता है।