2017-08-03 111 views
0

你好GoLang MongoDB的連接泄漏

這裏是從每個的MongoDB第二執行檢索的代碼示例。 我的問題是,在各檢索附加的連接(根據MongoDB的日誌)打開

代碼:

package main 

import (
    "os" 
    "fmt" 
    "gopkg.in/mgo.v2" 
    "time" 
    "gopkg.in/mgo.v2/bson" 
) 

const (
    host1  = "localhost" 
    port1  = "27017" 
    dbName  = "test_db" 
    collectionName = "TEST_COLLECTION" 
) 
type Data struct { 
    InternalId bson.ObjectId `bson:"_id" json:"_id,omitempty"` 
    Key1   string 
    Key2   string 
    Key3   int64 
} 


func main() { 

    fmt.Println("Starting mongo worker ... ") 
    finished := make(chan bool) 
    go DoWorkerJob(finished) 
    <-finished 
} 


func DoWorkerJob(finished chan bool) { 

    session, err := GetSession() 
    defer  session.Close() 

    if err != nil { 
     panic(err) 
     os.Exit(1) 
    } 


for { 
    fmt.Println("Retrieving data ...") 
    collection := GetCollection(*session,collectionName) 

    allData, err := GetAllRows(collection) 
    if err != nil { 
     panic(err) 
     continue 
    } 

    if allData != nil { 

     fmt.Println("Total retrieved: ", len(allData), " documents.") 
    } 


    time.Sleep(time.Duration(1000) * time.Millisecond) 
    } 

    finished <- true 
} 


func GetAllRows(collection *mgo.Collection) ([]Data, error) { 
    var results []Data 

    err := collection.Find(nil).All(&results) 
    if err != nil { 
     panic(err) 
     return nil, err 
    } 
    return results, nil 
} 

func GetSession() (*mgo.Session, error) { 
    fmt.Println("Creating session ...") 
    MongoDBHosts1 := host1 + ":" + port1 

    mongoDBDialInfo := &mgo.DialInfo{ 
     Addrs: []string{MongoDBHosts1}, 
     Timeout: 5 * time.Second, 
     Database: dbName, 
    } 

    mongoSession, err := mgo.DialWithInfo(mongoDBDialInfo) 

    if err != nil { 
     panic(err) 
     return nil, err 
    } 

    mongoSession.SetSocketTimeout(5 * time.Second) 
    mongoSession.SetMode(mgo.Monotonic, true) 

    session := mongoSession.New() 

    fmt.Println("Session created!") 
    return session, nil 
} 


func GetCollection(session mgo.Session, queueName string) (*mgo.Collection) 
{ 

    fmt.Println("Creating collection ...") 
    collection := session.Copy().DB(dbName).C(queueName) 
    fmt.Println("Collection created!") 
    return collection 

} 

程序輸出:

Starting mongo worker ... 
Creating session ... 
Session created! 
Retrieving data ... 
Creating collection ... 
Collection created! 
Total retrieved: 3 documents. 
Retrieving data ... 
Creating collection ... 
Collection created! 
Total retrieved: 3 documents. 
Retrieving data ... 
Creating collection ... 
Collection created! 
Total retrieved: 3 documents. 
Retrieving data ... 

MongoDB的日誌:

2017-08-03T11:24:53.600+0300 I NETWORK [initandlisten] waiting for connections on port 27017 
2017-08-03T11:25:38.785+0300 I NETWORK [initandlisten] connection accepted from 127.0.0.1:54591 #1 (1 connection now open) 
2017-08-03T11:25:41.952+0300 I NETWORK [initandlisten] connection accepted from 127.0.0.1:54592 #2 (2 connections now open) 
2017-08-03T11:25:45.260+0300 I NETWORK [initandlisten] connection accepted from 127.0.0.1:54593 #3 (3 connections now open) 
2017-08-03T11:26:19.327+0300 I NETWORK [initandlisten] connection accepted from 127.0.0.1:54594 #4 (4 connections now open) 
2017-08-03T11:26:38.797+0300 I NETWORK [initandlisten] connection accepted from 127.0.0.1:54595 #5 (5 connections now open) 
2017-08-03T11:26:41.964+0300 I NETWORK [initandlisten] connection accepted from 127.0.0.1:54596 #6 (6 connections now open) 
2017-08-03T11:26:45.269+0300 I NETWORK [initandlisten] connection accepted from 127.0.0.1:54597 #7 (7 connections now open) 
2017-08-03T11:27:19.338+0300 I NETWORK [initandlisten] connection accepted from 127.0.0.1:54599 #8 (8 connections now open) 
2017-08-03T11:38:37.106+0300 I NETWORK [initandlisten] connection accepted from 127.0.0.1:54836 #9 (9 connections now open) 

我在這裏做什麼錯了? Mongo中的連接數量達到成千上萬,最終導致它終止...

回答

0

每次複製會話時,都應該關閉它。

重寫GetCollectionGetAllRows,使用一個功能,如:

func FetchData(session mgo.Session, queueName string) ([]Data, error) { 
    fmt.Println("Creating collection ...") 
    sess := session.Copy() 
    collection := sess.DB(dbName).C(queueName) 
    fmt.Println("Collection created!") 

    defer sess.Close() 

    var results []Data 

    err := collection.Find(nil).All(&results) 
    if err != nil { 
     panic(err) 
     return nil, err 
    } 
    return results, nil 
} 

defer sess.Close() 
+0

目前,它只有兩個交易日累計開行,並關閉其中的一個 - 不是最佳,但它不該連接數不斷增加。會話創建在循環之外完成。 – Adrian

+0

非常感謝您的回答! –