यहां सिंगलटन पैटर्न का उपयोग करने में कुछ भी गलत नहीं है।
मैं कुछ इस तरह का प्रयोग करेंगे:
var db *sql.DB = nil
func GetDB() (*sql.DB, error) {
if db == nil {
conn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require",
DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
log.Println("Creating a new connection: %v", conn)
d, err := sql.Open("postgres", conn)
if err != nil {
return nil, err
}
db = d
}
return db, nil
}
इस के साथ समारोह का निर्यात आप अन्य सभी संकुल से एक कनेक्शन प्राप्त कर सकते हैं। टिप्पणियों के अनुसार उत्तर का
अद्यतन (सूचना के लिए धन्यवाद @all) !:
लौटे डीबी कई goroutines और द्वारा समवर्ती उपयोग के लिए सुरक्षित है निष्क्रिय कनेक्शन के अपने स्वयं के पूल को बनाए रखता है । इस प्रकार, ओपन फ़ंक्शन को केवल एक बार बुलाया जाना चाहिए। डीबी को बंद करना शायद ही कभी जरूरी है। ¹
डीबी बंद करना दुर्लभ है, क्योंकि डीबी हैंडल लंबे समय तक रहने वाले और कई goroutines के बीच साझा किया गया है। ²
मैं कहूंगा कि डेटाबेस कनेक्शन को बंद करने का कोई कारण नहीं है। मुझे कोई अन्य बयान नहीं मिला। इसके बावजूद मैं main
फ़ंक्शन में defer GetDB().close()
का उपयोग करूंगा - बस कोड की पूर्णता के लिए।
एक और चीज जो मैं ध्यान रखना चाहूंगा कि कनेक्शन db.Ping()
द्वारा सत्यापित किया जाना चाहिए अन्यथा कनेक्शन स्थापित किया जा सकता है लेकिन डेटाबेस मौजूद नहीं हो सकता है।
इस नई जानकारी के साथ मैं डेटाबेस को स्थापित करने के लिए कुछ म्यूटेक्स का उपयोग करने से परेशान नहीं होगा। मैं एक नया DBInit()
बनाउंगा और इसे मुख्य पैकेज के init()
फ़ंक्शन के अंदर चलाऊंगा।
समर्थन मुझे कुछ func में sql.Open कॉल करके कनेक्शन पूल मिलता है - मुझे इसे अपने एप्लिकेशन के अंदर कैसे स्टोर करना चाहिए। –
यहां आम दृष्टिकोण क्या है? मैं डेटा को जारी रखने के तरीकों के बारे में नहीं पूछ रहा हूं - लेकिन आवेदन में कनेक्शन पूल के लिए वाई स्टोर संदर्भ। –
क्योंकि प्रत्येक चयन के लिए निर्माण कनेक्शन पूल सही समाधान नहीं है –