如何优化数据库连接

时间:2019-08-08 07:20:57

标签: sql postgresql go go-gorm

在Go应用程序中,我使用crontab软件包每分钟运行Tracker函数。正如您从代码中注意到的那样,我称PostgreSQL函数。为了与PostgreSQL数据库进行交互,我使用了gorm包。应用程序运行了好几天没有任何问题,但是现在我注意到日志中有一个错误:pq: sorry, too many clients already。我知道之前在StackOverflow中多次问过同样的问题。例如,在此post中,人们建议使用ExecScan方法。以我为例,您可以看到我使用Exec方法,但是无论如何我都出错了。据我了解,每个数据库请求都建立一个单独的连接,并且不会关闭它。我不知道自己在做什么错。

main.go:

package main

import (
    "github.com/mileusna/crontab"
)

func main()  {
    database.ConnectPostgreSQL()
    defer database.DisconnectPostgreSQL()

    err = crontab.New().AddJob("* * * * *", controllers.Tracker); if err != nil {
        utils.Logger().Fatal(err)
        return
    }
}

tracker.go:

package controllers

import (
    "questionnaire/database"
    "time"
)

var Tracker = func() {
    err := database.DBGORM.Exec("CALL tracker($1)", time.Now().Format("2006-01-02 15:04:05")).Error; if err != nil {
        utils.Logger().Println(err)  // ERROR: pq: sorry, too many clients already
        return
    }
}

PostgreSQL.go:

package database

import (
    "fmt"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/postgres"
    "github.com/joho/godotenv"
    "questionnaire/utils"
)

var DBGORM *gorm.DB

func ConnectPostgreSQL() {
    err := godotenv.Load(".env")
    if err != nil {
        utils.Logger().Println(err)
        panic(err)
    }

    databaseUser := utils.CheckEnvironmentVariable("PostgreSQL_USER")
    databasePassword := utils.CheckEnvironmentVariable("PostgreSQL_PASSWORD")
    databaseHost := utils.CheckEnvironmentVariable("PostgreSQL_HOST")
    databaseName := utils.CheckEnvironmentVariable("PostgreSQL_DATABASE_NAME")

    databaseURL:= fmt.Sprintf("host=%s user=%s dbname=%s password=%s sslmode=disable", databaseHost, databaseUser, databaseName, databasePassword)

    DBGORM, err = gorm.Open("postgres", databaseURL)
    if err != nil {
        utils.Logger().Println(err)
        panic(err)
    }

    err = DBGORM.DB().Ping()
    if err != nil {
        utils.Logger().Println(err)
        panic(err)
    }

    DBGORM.LogMode(true)
}

func DisconnectPostgreSQL() error {
    return DBGORM.Close()
}

0 个答案:

没有答案