feat: Set default values for DB connection parameters

- Configures `max_open` and `max_idle` in default configs to `25`.
  This changes the previous behaviour of connection pooling where both the
  values were unset (from default config) and causes unbounded connection
  limit and no connection reuse.
- Configures `db.SetConnMaxLifetime` which sets the maximum time the
  connection can be reused in a pool.
- Sets `max_conn_lifetime` in default config as `5 minutes`.

Closes https://github.com/knadh/listmonk/issues/225
This commit is contained in:
Karan Sharma 2020-11-17 13:59:32 +05:30
parent c60cc3525f
commit ad8f290dad
3 changed files with 17 additions and 8 deletions

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"database/sql" "database/sql"
"fmt" "fmt"
"time"
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
"github.com/lib/pq" "github.com/lib/pq"
@ -84,14 +85,15 @@ type Queries struct {
// dbConf contains database config required for connecting to a DB. // dbConf contains database config required for connecting to a DB.
type dbConf struct { type dbConf struct {
Host string `koanf:"host"` Host string `koanf:"host"`
Port int `koanf:"port"` Port int `koanf:"port"`
User string `koanf:"user"` User string `koanf:"user"`
Password string `koanf:"password"` Password string `koanf:"password"`
DBName string `koanf:"database"` DBName string `koanf:"database"`
SSLMode string `koanf:"ssl_mode"` SSLMode string `koanf:"ssl_mode"`
MaxOpen int `koanf:"max_open"` MaxOpen int `koanf:"max_open"`
MaxIdle int `koanf:"max_idle"` MaxIdle int `koanf:"max_idle"`
MaxLifetime time.Duration `koanf:"max_lifetime"`
} }
// connectDB initializes a database connection. // connectDB initializes a database connection.
@ -104,6 +106,7 @@ func connectDB(c dbConf) (*sqlx.DB, error) {
} }
db.SetMaxOpenConns(c.MaxOpen) db.SetMaxOpenConns(c.MaxOpen)
db.SetMaxIdleConns(c.MaxIdle) db.SetMaxIdleConns(c.MaxIdle)
db.SetConnMaxLifetime(c.MaxLifetime)
return db, nil return db, nil
} }

View File

@ -10,3 +10,6 @@
password = "listmonk" password = "listmonk"
database = "listmonk" database = "listmonk"
ssl_mode = "disable" ssl_mode = "disable"
max_open = 25
max_idle = 25
max_lifetime = "300s"

View File

@ -17,3 +17,6 @@
password = "listmonk" password = "listmonk"
database = "listmonk" database = "listmonk"
ssl_mode = "disable" ssl_mode = "disable"
max_open = 25
max_idle = 25
max_lifetime = "300s"