我试图运行一个非常简单的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。