2015-01-25 9 views
7

मैं github.com/go-sql-driver/mysql ड्राइवर का उपयोग करने के लिए उपयोग कर रहा हूं।गोलांग, mysql: त्रुटि 1040: बहुत सारे कनेक्शन

db, err := sql.Open("mysql", str) 

तो मैं दो कार्य है जो निम्न mysql कोड के साथ 200 बार प्रत्येक कहा जाता है है:

rows, err := db.Query("select name from beehives") 
if err != nil { 
    panic(err) 
}  
defer rows.Close() 

दूसरा:

err = db.QueryRow("select id, secret, shortname from beehives where shortname = ?", beehive).Scan(&id, &secre 
    switch { 
    case err == sql.ErrNoRows: 
     err = errors.New("Beehive '"+beehive+"' not found.") 
    case err != nil: 
     panic("loginBeehive: "+ err.Error()) 
    default: 
     // ... do the work 

मैं एक डेटाबेस को खोलने के पहला एक पैनसिंग है।

जब मैं केवल एक बार डेटाबेस खोलता हूं और मैं उन्हें कैसे बंद कर सकता हूं तो एक से अधिक कनेक्शन कैसे हो सकते हैं?

उत्तर

11

sql.Open doesn't really open a connection to your database.

एक sql.DB अपने डेटाबेस के लिए कनेक्शन का एक पूल बनाए रखता है। प्रत्येक बार जब आप अपना डेटाबेस पूछते हैं तो आपका प्रोग्राम इस पूल से कनेक्शन प्राप्त करने या अन्यथा एक नया निर्माण करने का प्रयास करेगा। एक बार जब आप उन्हें बंद कर देते हैं तो ये कनेक्शन पूल में वापस रखे जाते हैं।

यह rows.Close() करता है। आपका db.QueryRow("...") आंतरिक रूप से वही काम करता है जब आप Scan(...) पर कॉल करते हैं।

मूल समस्या यह है कि आप बहुत सारे प्रश्न बना रहे हैं, जिनमें से प्रत्येक को कनेक्शन की आवश्यकता है, लेकिन आप अपने कनेक्शन को पर्याप्त तेज़ी से बंद नहीं कर रहे हैं। इस तरह आपके प्रोग्राम को प्रत्येक क्वेरी के लिए एक नया कनेक्शन बनाना है।

आप अपने sql.DB पर SetMaxOpenConns पर कॉल करके अपने प्रोग्राम का अधिकतम कनेक्शन सीमित कर सकते हैं।

अधिक जानकारी के लिए http://go-database-sql.org/surprises.html देखें।

2

कनेक्शन का पुन: उपयोग करने के लिए तैयार बयान db.Prepare(query string) (*Stmt, error) और stmt.Query या stmt.Exec और stmt.Close से अधिक करने का प्रयास करें।

3

*DB उद्देश्य यह है कि आप sql.Open से वापस पाने के लिए एक एकल कनेक्शन से मेल खाती है नहीं करता है। यह डेटाबेस के लिए एक हैंडल के रूप में बेहतर विचार है: यह आपके लिए एक कनेक्शन पूल का प्रबंधन करता है।

आप निष्क्रिय कनेक्शन के लिए `(*DB).SetMaxOpenConns और its pair के साथ खुले कनेक्शन की संख्या को नियंत्रित कर सकते हैं।

तो मूल रूप से यहाँ क्या होता है कि db.Query और db.QueryRow की कोशिश करता खुद को और डीबी संभाल के लिए एक कनेक्शन प्राप्त करने के लिए तो अपने कोड घबरा निरंतर कनेक्शन की संख्या पर कोई प्रतिबंध नहीं करता है जब यह mysql क्या संभाल कर सकते हैं और अधिक से अधिक खोलता है ।

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