2011 नोट: मूल उत्तर 2010 से है। अब बेहतर दृष्टिकोण, जैसा कि टिप्पणियों में बताया गया है, लगता है का उपयोग करना पूल_रीसायकल परम ।
2010 से मूल उत्तर इस प्रकार है।
परीक्षित समाधान के लिए नीचे संपादित करें देखें
मैंने इसे आजमाया नहीं, लेकिन शायद पूल लिस्टनर जाने का रास्ता है?
आप ऐसा कुछ कर सकते हैं:
class MyListener(sqlalchemy.interfaces.PoolListener):
def __init__(self):
self.retried = False
def checkout(self, dbapi_con, con_record, con_proxy):
try:
dbapi_con.info() # is there any better way to simply check if connection to mysql is alive?
except sqlalchemy.exc.OperationalError:
if self.retried:
self.retried = False
raise # we do nothing
self.retried = True
raise sqlalchemy.exc.DisconnectionError
# next, code according to documentation linked above follows
e = create_engine("url://", listeners=[MyListener()])
इस तरह हर बार पूल से कनेक्शन की जांच होने वाली है, हम परीक्षण करते हैं कि क्या यह वास्तव में सर्वर से जुड़ा है। यदि नहीं, तो हम sqlalchemy को फिर से जोड़ने का एक मौका देते हैं। उसके बाद, यदि समस्या अभी भी बनी हुई है, तो हम उसे जाने देते हैं।
पीएस:मैंने परीक्षण नहीं किया कि यह काम करता है या नहीं।
संपादित करें:पाइलन्स के लिए, ऊपर दिखाए गए इंजन इनिशियलाइज़ेशन में संशोधनों को your_app.model.init_model (Pylons 0.9.7) या में करने की आवश्यकता होगी। your_app.config.environment.load_environment <स्ट्राइक>(पिलोन 1.0)स्ट्राइक> समारोह - <स्ट्राइक>ये हैंस्ट्राइक> यह है <स्ट्राइक>स्थानस्ट्राइक> वह स्थान जहाँ इंजन इंस्टेंस बनाया जाता है।
संपादित करें
<मजबूत>ठीक है। मैं वर्णित स्थिति को पुन:पेश करने में सक्षम था। ऊपर दिए गए कोड को काम करने के लिए कुछ बदलावों की आवश्यकता है। नीचे बताया गया है कि इसे कैसे किया जाना चाहिए। साथ ही इससे कोई फर्क नहीं पड़ता कि यह 0.9.7 है या 1.0।
आपको your_app/config/environment.py संपादित करने की आवश्यकता है। इन निर्यातों को फ़ाइल के शीर्ष पर रखें:
import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions
और load_environment फ़ंक्शन का अंत इस तरह दिखना चाहिए:
class MyListener(sqlalchemy.interfaces.PoolListener):
def __init__(self):
self.retried = False
def checkout(self, dbapi_con, con_record, con_proxy):
try:
dbapi_con.cursor().execute('select now()')
except _mysql_exceptions.OperationalError:
if self.retried:
self.retried = False
raise
self.retried = True
raise sqlalchemy.exc.DisconnectionError
config['sqlalchemy.listeners'] = [MyListener()]
engine = engine_from_config(config, 'sqlalchemy.')
init_model(engine)
इस बार मैं इसका परीक्षण करने में सक्षम था (Pylons 1.0 + SQLAlchemy 0.6.1 पर) और यह काम करता है। :)पी>