ठीक है, मुझे एक समाधान मिल गया है.. विल के लिए धन्यवाद और PRR (मेरे सहकर्मी)।
मैं नहीं प्रत्येक क्वेरी पर एक नया थ्रेड प्रारंभ करें, क्योंकि यह एक रीयल-टाइम एप्लिकेशन है, जो प्रति सेकंड 1000+ संदेशों को संसाधित करने वाला है..(वैसे भी, R.. विचार के लिए)।
साथ ही, पुस्तकालय के माध्यम से कनेक्शन को समाप्त करना संभव नहीं था, न ही क्वेरी को रद्द/मारना, क्योंकि समस्या डीबी सर्वर में थी।
और यहाँ एक क्रूर-बल समाधान है, लेकिन फिर भी बहुत बेहतर है कि _EXIT( FAILURE )
:यहां संबंधित प्रश्न है:"कैसे बंद करने के लिए बाध्य करें Linux पर सॉकेट?"
- तो, मैंने अभी सिस्टम कॉल का उपयोग करके सॉकेट बंद कर दिया है।
महत्वपूर्ण नोट :(धन्यवाद विल) - यह पता चला है कि हमारे MySQL लाइब्रेरी रैपर में "असफल-सुरक्षित" ध्वज है, ताकि बंद सॉकेट (या अन्य महत्वपूर्ण त्रुटि) पर, यह समस्या को "हल" करने का प्रयास करता है, इसलिए यह सॉकेट को फिर से खोलता है , अपने आप में, मेरे मामले में। इसलिए, मैंने अभी इस विकल्प को बंद कर दिया है और अब सब कुछ ठीक है - एक अपवाद के कारण निष्पादन समाप्त हो गया है - ऐसा करने का यह "सबसे नरम" तरीका है।
यह निश्चित रूप से किसी अन्य थ्रेड के माध्यम से किया जाना चाहिए - a उदाहरण के लिए टाइमर।
संपादित करें: टाइमआउट वास्तव में 5.0.25 के बाद के संस्करणों के लिए काम कर रहे हैं। लेकिन, कम से कम RHEL4 और RHEL5 पर, किसी कारण से टाइमआउट तीन गुना हो जाता है! उदाहरण के लिए, यदि कुछ टाइमआउट 20sec पर सेट है, तो वास्तविक टाइमआउट ~60sec है..
साथ ही, एक और महत्वपूर्ण बात यह है कि ये टाइमआउट (किसी भी अन्य विकल्प के रूप में) जरूरी बाद सेट किया जाए mysql_init
और पहले mysql_connect
या mysql_real_connect
.