2013-11-14 8 views
8

sql.Open() में गो/Golang sql.DB पुन: उपयोग के प्रकार * के एक चर sql.DB रिटर्नकार्यों

मैं एक समारोह है कि 10 अन्य कार्यों है कि सभी डेटाबेस कॉल

बनाने की जरूरत है कॉल इसे और अधिक सही/कुशल करने के लिए है:

  • हर कार्य के लिए * sql.DB सूचक भेजें, या
  • प्रत्येक कार्य में एक नया * sql.DB वस्तु बनाएं

func DoLotsOfThings() { 
    db, _ := sql.Open() 
    defer db.Close() 
    DoTask1(db) 
    DoTask2(db) 
} 

या

func DoLotsOfThings() { 
    DoTask1() 
    DoTask2() 
} 

func DoTask1() { 
    db, _ := sql.Open() 
    defer db.Close() 
} 

func DoTask1() { 
    db, _ := sql.Open() 
    defer db.Close() 
} 

कारण अर्थ कारण है कि मैं पूछ रहा हूँ, क्योंकि मैं वर्तमान में प्रत्येक कार्य करने के लिए सूचक भेज रहा हूँ और मेरे ड्राइवर को तोड़ने के लिए लगता है। मैं http://code.google.com/p/odbc का उपयोग कर रहा हूं, जो मुझे विश्वास दिलाता है कि प्रत्येक समारोह में अपना होना चाहिए, और मैं ड्राइवर के आंतरिक पर भरोसा कर सकता हूं।

संपादित

आरई ड्राइवर टूटना, यह केवल उच्च यातायात वातावरण के तहत होता है। और यह केवल दस मिनट या उससे अधिक समय के बाद होता है। जो मुझे विश्वास दिलाता है कि कुछ प्रकार की मेमोरी लीक है जो चालक को काम करना बंद कर देती है। हालांकि मैं * sql.DB के प्रत्येक उदाहरण के लिए db.Close() को रोकता हूं, इसलिए मुझे नहीं पता कि मैं इस समस्या को हल करने के लिए और क्या कर सकता हूं।

andybalholm कहते कनेक्शन पूलिंग, आंतरिक रूप से नियंत्रित किया जाता है, जो सही प्रतीत हो रहा है क्योंकि यह केवल टूट जाता है के बाद मैं कुछ निष्पादित करने के लिए प्रयास करते हैं, जब नहीं मैं आह्वान sql.Open()

मैं अपने जाओ एप्लिकेशन चल छोड़ देते हैं , यह किसी भी प्रकार के एसक्यूएल प्रश्नों को निष्पादित करने में सक्षम नहीं होगा, लेकिन अगर मैं अलग-अलग गो परीक्षणों को एमएसएसएलएल से कनेक्ट करने और चल रहे प्रश्नों को चलाने का प्रयास करता हूं, तो यह काम करता है।

+0

यदि आप यहां पुन: उत्पादित उदाहरण पोस्ट कर सकते हैं तो https://code.google.com/p/odbc/issues/list, मैं इसे ठीक करने का प्रयास करूंगा। – alex

उत्तर

6

आपको जगह पर डेटाबेस कनेक्शन खोलने की आवश्यकता नहीं है। डाटाबेस/एसक्यूएल पैकेज आंतरिक रूप से कनेक्शन को पूलिंग करता है, आवश्यकतानुसार कनेक्शन खोलता है और बंद करता है, जबकि एक कनेक्शन का भ्रम प्रदान करता है जिसे समवर्ती रूप से उपयोग किया जा सकता है।

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

+0

तो मेरे पास sql.Open और परिणामी * sql.DB का एक संदर्भ होना चाहिए। ऐसा लगता है कि आप पूलिंग के बारे में सही हैं, जब मैं एक क्वेरी निष्पादित करने का प्रयास करता हूं तो मुझे केवल त्रुटियां मिलती हैं। विचित्र रूप से मेरा जाना एप्लिकेशन एमएसएसएलएल से कनेक्ट करने में सक्षम होने से रोकता है, लेकिन इसके बाहर, मैं उन परीक्षणों को चला सकता हूं जो कनेक्ट करने में सक्षम हैं, जब तक कि मैं संग्रहीत प्रक्रियाओं को नहीं चला रहा हूं।यह सब बहुत अजीब है। –

+0

डेटाबेस/एसक्यूएल अनुप्रयोगों को डीबग करने का प्रयास करते समय याद रखने की एक बात यह है कि, कनेक्शन पूलिंग के कारण, जब आप sql करते हैं तो कनेक्शन त्रुटियां अक्सर दिखाई नहीं देती हैं। ओपन; वे तब तक प्रतीक्षा करते हैं जब तक आप कनेक्शन पर पहली क्वेरी नहीं चलाते। – andybalholm

18

वैश्विक स्तर पर var db *sql.DB घोषित करें, और उसके बाद इसे अपने कोड में पुन: उपयोग करें।

var db *sql.DB 

func DoLotsOfThings() { 
    DoTask1(db) 
    DoTask2(db) 
} 

func main() { 
    db, _ = sql.Open() # or whatever you use 
    defer db.Close() 
    DoLotsOfThings() 
} 

घोषणा *sql.DB विश्व स्तर पर भी कुछ अतिरिक्त लाभ के रूप में SetMaxIdleConns (विनियमित करने कनेक्शन पूल आकार) या अपने आवेदन भर में preparing SQL कथन है: यहाँ एक उदाहरण (सरलीकृत) है।

+0

उस नोट के लिए धन्यवाद! – Anatoly

संबंधित मुद्दे