में एकाधिक डेटाबेस पर पुन: सक्रिय करने का सुरक्षित तरीका मेरे पास एक ही MySQL सर्वर पर चलने वाले कई रेल ऐप्स हैं। वे सभी एक ही ऐप चलाते हैं, और सभी डेटाबेस में एक ही स्कीमा होती है, लेकिन प्रत्येक डेटाबेस एक अलग ग्राहक से संबंधित होता है।रेल
वैचारिक रूप से, यहाँ मैं क्या करना चाहते हैं:
Customer.all.each do |customer|
connection.execute("use #{customer.database}")
customer.do_some_complex_stuff_with_multiple_models
end
क्योंकि, जब यह एक वेब अनुरोध में चलाया जाता है, अंतर्निहित मॉडल वर्गों ए/आर कनेक्शन से अलग डेटाबेस कनेक्शन कैश यह दृष्टिकोण काम नहीं करता है पूल। तो जिस कनेक्शन पर मैं "उपयोग" कथन निष्पादित करता हूं, मॉडल का उपयोग कनेक्शन नहीं हो सकता है, इस स्थिति में यह गलत डेटाबेस से पूछताछ करता है।
ActiveRecord::Base.clear_active_connections!
ActiveRecord::Base.establish_connection(each_customer_database_config)
मुझे विश्वास है कि:
मैं "का उपयोग" बयान के बजाय रेल ए/आर कोड (संस्करण 3.0.3) के माध्यम से पढ़ा है, और पाश में निष्पादित करने के लिए इस कोड के साथ आया था, कनेक्शन पूल प्रति-धागा है, इसलिए ऐसा लगता है कि यह कनेक्शन पूल को पकड़ लेगा और केवल एक थ्रेड के लिए इसे फिर से स्थापित करेगा, वेब अनुरोध चालू है। लेकिन अगर कनेक्शन किसी भी तरह से साझा नहीं किया जाता है, तो मैं नहीं देख रहा हूं, मैं नहीं चाहता कि वह कोड उसी ऐप में अन्य सक्रिय वेब अनुरोधों के साथ विनाश को खत्म कर दे।
क्या यह एक चल रहे वेब ऐप में सुरक्षित है? ऐसा करने के लिए कोई और रास्ता नहीं है?
बस स्पष्ट करने के लिए, MySQL _does_ समर्थन एसक्यूएल स्कीमा, लेकिन मूल रूप से और infelicitously उन्हें कहा जाता है एसक्यूएल कीवर्ड "SCHEMA" संस्करण 5.0.2 (दिसंबर 2004) के बाद से मान्यता प्राप्त है। MySQL को "यूएसई फू" कहकर एक पोस्टग्रेएसक्यूएल कनेक्शन की 'search_path' को एक ही नामस्थान "foo" पर सेट करना समान है। – pilcrow
बिल्कुल। आप MYSQL में "डेटाबेस एबीसी बनाने" के बजाय "स्कीमा एबीसी बनाएं" भी लिख सकते हैं। – Jagira