鍍金池/ 問答/GO/ 一個(gè)db連接,有大量查詢的時(shí)候出現(xiàn)dial tcp: lookup xxx.co

一個(gè)db連接,有大量查詢的時(shí)候出現(xiàn)dial tcp: lookup xxx.com: no such host?

程序代碼片段是這樣的:

maxPage := *flagMaxPage
        if maxPage > 0 {
            jobs := make(chan int, maxPage)
            results := make(chan []map[string]string, maxPage)
            // 招聘10個(gè)工人,讓他們工作(待命),每個(gè)工人會(huì)從jobs管道里獲得任務(wù),工人干活,把結(jié)果放到results管道
            for w := 1; w <= 10; w++ {
                go doWork(jobs, results)
            }
            //分配任務(wù)
            for j := 1; j <= maxPage; j++ {
                jobs <- j
            }
            close(jobs)
            //db connect
            db, err := mysqlUtil.CreateReadDb()
            defer db.Close()
            if err != nil {
                log.Fatal("connect db err ", err)
                fmt.Println("connect db err ", err)
            }
            //處理結(jié)果
            for j := 1; j <= maxPage; j++ {
                data := <-results
                //這里做查詢和入庫操作
                doDb(db, data)
                fmt.Println(len(data))
            }
            close(results)
            fmt.Println("all done...")
        }

doDb函數(shù)如下:

func doDb(db *sql.DB,data []map[string]string) {
    if data != nil {
        for _, v := range data {
            if v == nil {
                continue
            }
            if v["title"] == "" {
                continue
            }
            if v["url"] == "" {
                continue
            }
            //寫入數(shù)據(jù)庫
            sqlStr := `select * from film where title_md5 ='` + Md5(v["title"]) + `'`
            rows, err := db.Query(sqlStr)
            if err != nil {
                fmt.Println("query err1 ", err)
                continue
            }
            existData, err := mysqlUtil.GetRow(rows)
            if err != nil {
                fmt.Println("query err2 ", err)
                continue
            }
            //如果為空,就插入數(shù)據(jù)
            if len(existData) == 0 {
                score := v["score"]
                scoreVal, err := strconv.ParseFloat(score, 64)
                if err != nil {
                    fmt.Println("insert data parse score error ", err)
                    continue
                }
                f1 := decimal.NewFromFloat(scoreVal)
                f2 := decimal.NewFromFloat(100)
                aaa := f1.Mul(f2).IntPart()
                insertScore := strconv.Itoa(int(aaa))
                titleMd5 := Md5(v["title"])
                sqlInsert := `insert into film(title, img, uptime, url, score, title_md5) values ('` + v["title"] + `', '` + v["img"] + `', '` + v["uptime"] +
                    `','` + v["url"] + `','` + insertScore + `','` + titleMd5 + `')`
                db.Query(sqlInsert)
            }
        }
    }
}

測(cè)試了一下,大概跑20個(gè)協(xié)程,doDb這個(gè)函數(shù)的第二個(gè)參數(shù)一次最多15條數(shù)據(jù),在執(zhí)行到16個(gè)協(xié)程的結(jié)果后,就會(huì)在fmt.Println("query err1 ", err)這個(gè)地方報(bào)大量 :

query err1  dial tcp: lookup xxxx.com: no such host

在包這個(gè)錯(cuò)誤的時(shí)候,我手動(dòng)執(zhí)行

nslookup xxxx.com

解析是正常的。請(qǐng)問一下,這是為啥呢?doDb這個(gè)函數(shù)是一個(gè)一個(gè)處理result的,一共才20*15條記錄,為啥會(huì)出現(xiàn)這種問題呢?

回答
編輯回答
瘋浪

https://stackoverflow.com/que...。 在mac里執(zhí)行ulimit -u 發(fā)現(xiàn)只有256,當(dāng)操作300條數(shù)據(jù)的時(shí)候,大于這個(gè)值,所以會(huì)出現(xiàn)上面的問題。執(zhí)行ulimit -n 1000,再次操作300條數(shù)據(jù),就不會(huì)出現(xiàn)這種問題了。

2018年2月26日 11:19
編輯回答
陪我終

有設(shè)置mysql連接池嗎

2018年6月9日 08:10