恐慌:pq:抱歉,已有太多客户

时间:2018-01-02 10:24:17

标签: postgresql go

我试图运行一个非常简单的coinmarketcap解析器。我只有两个表:货币汇率,因此我会动态添加新货币并在此之后插入新的汇率。

package main

import (
    "log"
    "os"
    "../helpers"
    "fmt"
    "database/sql"
    _ "github.com/lib/pq"
    "encoding/json"
    "strconv"
)

func chk(err error) {
    if err != nil {
        log.Panic(err)
    }
}

type Rate struct {
    Name   string `json:"name"`
    Symbol string `json:"symbol"`
    Price  string `json:"price_usd"`
}

func getCreateCurrency(db *sql.DB, rate Rate) int {
    var id int

    res, err := db.Query("SELECT id FROM currency WHERE symbol = $1", rate.Symbol)
    chk(err)
    defer res.Close()

    if res.Next() {
        err = res.Scan(&id)
        chk(err)
        return id
    }

    err = db.QueryRow(`
        INSERT INTO currency
        (name, symbol)
        VALUES ($1, $2)
        RETURNING id
    `, rate.Name, rate.Symbol).Scan(&id)
    chk(err)

    return id
}

func parseRates(db *sql.DB) {
    for {
        ratesBody, err := helpers.GetHttpBody("https://api.coinmarketcap.com/v1/ticker/?limit=0")
        chk(err)

        rates := make([]Rate, 0)
        json.Unmarshal([]byte(ratesBody), &rates)

        for _, rate := range rates {
            currencyId := getCreateCurrency(db, rate)
            price, err := strconv.ParseFloat(rate.Price, 64)
            if err != nil {
                continue
            }

            db.QueryRow(`INSERT INTO rate (currency_id, rate) VALUES ($1, $2)`, currencyId, price)

            fmt.Println(rate.Symbol, rate.Price)
        }

        break
    }
}

func main() {
    cfg, err := helpers.GetConfig(os.Args[1])
    chk(err)

    db, err := sql.Open("postgres", cfg.DbConnection)
    chk(err)
    defer db.Close()

    parseRates(db)
}

突然在100次循环迭代后出现错误:

panic: pq: sorry, too many clients already

getCreateCurrency 函数的问题。我以某种方式得到了挂起的连接,因为如果我关掉所有的工作就好了。

当然我在postgres.conf上有max_connections = 100,但我认为我只使用一个连接,因为我的事件不会在这里使用异步功能。

我使用macos,第9.6页,去1.9.2。

0 个答案:

没有答案