मेरे पास एक पायथन लिपि है जो हमेशा पृष्ठभूमि पर चलती रहती है

नोहप पायथन script.py &

तो क्या स्क्रिप्ट करता है: यह mqtt पर जाँच करता है कि क्या वहाँ कोई संदेश है और यदि सही है तो इसे डेटाबेस पर डालें

on_message(client, userdata, msg):
    SQL.execute("INSERT INTO logs(deviceID) VALUES (msg)")

मैं डीबी से कनेक्ट करने के लिए इस तरह का उपयोग करता हूं लेकिन कुछ घंटों के बाद कनेक्शन बंद हो जाता है और स्क्रिप्ट चल रही है लेकिन यह डीबी में डालने में सक्षम नहीं है

mydb = mysql.connector.connect(host="localhost",  user="xxxx",  passwd="xxxx",  database="xxx")
SQL = mydb.cursor()

प्रश्न:

  1. क्या मुझे हर बार SQL.execute() से पहले नया कनेक्शन खोलने की आवश्यकता है या इसे खुला रखने के लिए बेहतर है?
  2. क्या आप वह कोड जोड़ सकते हैं जो आपको लगता है कि उपयोग करना बेहतर है
2
wuqn yqow 29 मार्च 2020, 16:33
 – 
Kir Chou
29 मार्च 2020, 17:10
मुझे लगता है कि मेरे प्रश्न का उत्तर केवल 2 शब्दों में दिया जा सकता है और मुझे किस कोड का उपयोग करना चाहिए
 – 
wuqn yqow
29 मार्च 2020, 19:08
मेरा जवाब देखें अगर यह मदद करता है तो मुझे बताएं।
 – 
AzyCrw4282
31 मार्च 2020, 21:22

2 जवाब

जब आपको इसकी आवश्यकता हो तो कनेक्शन खोलना सबसे अच्छा है और इसे केवल खुला न छोड़ें क्योंकि इससे संसाधनों का एक टन बर्बाद हो जाएगा।

जब अपवाद 'MySQL सर्वर चला गया' उठाया जाता है, तो आप MySQL डीबी को फिर से कनेक्ट करने के लिए इस तरह के किसी भी डीबी हैंडलर फ़ंक्शन में डेकोरेटर जोड़ सकते हैं। कोड यहां से लिया गया है

class DB:
    """Database interface"""

    def retry(func):
        def call(self, *args, **kwargs):
            lock.acquire()
            try:
                return func(self, *args, **kwargs)
            except MySQLdb.Error, e:
                if 'MySQL server has gone away' in str(e):
                    # reconnect MySQL
                    self.connect_mysql()
                else:
                    # No need to retry for other reasons
                    pass
            finally:
                lock.release()
        return call

    def __init__(self):
        pass

    def connect_mysql(self):
        # create connection here

    @retry
    def execute(self):
        # use the decorator to get conenction and do you SQL.execute() here
0
AzyCrw4282 29 मार्च 2020, 19:27

आपके संदेश कितनी बार आते हैं? यदि वे बहुत अधिक बार नहीं आते हैं, तो मैं केवल try कनेक्शन खोलूंगा, सम्मिलित करूंगा, फिर उसे else में बंद कर दूंगा। कनेक्शन सिस्टम संसाधन हैं, आपको उन्हें बर्बाद नहीं करना चाहिए।

साथ ही, कुछ डेटाबेस इंजन, जो कि MySQL के बारे में कोई जानकारी नहीं है, समय-समय पर कचरा-एकत्रित लंबे-निष्क्रिय कनेक्शन होंगे और जब आप इसका उपयोग करने का प्रयास करते हैं तो आपका कनेक्शन अप्रत्याशित रूप से बंद हो जाएगा।


on_message(client, userdata, msg):

    try:
        mydb = mysql.connector.connect(host="localhost",  user="xxxx",  passwd="xxxx",  database="xxx")
        SQL = mydb.cursor()
        #☝️ use mysqls parametrized queries
        SQL.execute("INSERT INTO logs(deviceID) VALUES (%s)", (msg,))
    except Exception as e:
        raise
    else:
        SQL.close()

0
JL Peyret 30 मार्च 2020, 00:40
कभी-कभी 1 घंटा नो msg , लेकिन कभी-कभी 1 msg प्रति सेकंड। लेकिन अजगर स्क्रिप्ट हर समय पृष्ठभूमि में चलनी चाहिए (1 वर्ष: पी)
 – 
wuqn yqow
29 मार्च 2020, 19:27
पासवर्ड के कारण मैं कनेक्शन ओपन कोड को कहीं और फ़ंक्शन में डालूंगा, esp। अस्वीकरण: टैबलेट पर, इसलिए मेरे अंत में टाइपो संभव है।
 – 
JL Peyret
29 मार्च 2020, 19:33
यदि एक स्टैंड अलोन स्क्रिप्ट w 1 yr अपटाइम reqs मैं स्क्रिप्ट को पहले काम करवाता हूं, तो इसे एक विशेष प्रोग्राम के साथ लॉन्च करके एक डेमॉन/सर्विस में बना देता हूं जो इसे हमेशा बनाए रखता है: सिस्टमड, रनिट या मोनिट अच्छे विकल्प हो सकते हैं उदाहरण के लिए एक लिनक्स सिस्टम। रनिट लगभग किसी भी पॉज़िक्स पर चलता है। वे निपटने के लिए एक दर्द हैं, लेकिन स्थिर लंबे समय तक चलने के लिए उनकी आवश्यकता होती है। en.wikipedia.org/wiki/Runit
 – 
JL Peyret
29 मार्च 2020, 19:38
साथ ही, आपका डीबी थोड़ी देर के लिए डाउन हो सकता है - रखरखाव कहें - इसलिए आंतरायिक कनेक्शन त्रुटियों पर मैं संदेश को एक सूची में जोड़ दूंगा और अगली बार इसे लिखने का प्रयास करूंगा। या अगर यह ठीक है तो इसे छोड़ दें।
 – 
JL Peyret
29 मार्च 2020, 19:56