@@ -12,6 +12,7 @@ import (
12
12
"net/url"
13
13
"os"
14
14
"sync"
15
+ "time"
15
16
16
17
"github.com/jackc/pgx/v5/pgxpool"
17
18
@@ -22,6 +23,9 @@ import (
22
23
)
23
24
24
25
const defaultDBName = "edgex_db"
26
+ const defaultMaxConns = int32 (4 )
27
+ const defaultMaxConnIdleTime = time .Minute * 30
28
+ const defaultMaxConnLifetime = time .Hour
25
29
26
30
var once sync.Once
27
31
var dc * Client
@@ -35,17 +39,15 @@ type Client struct {
35
39
36
40
// NewClient returns a pointer to the Postgres client
37
41
func NewClient (ctx context.Context , config db.Configuration , lc logger.LoggingClient , schemaName , serviceKey , serviceVersion string , sqlFiles embed.FS ) (* Client , errors.EdgeX ) {
38
- // Get the database name from the environment variable
39
- databaseName := os .Getenv ("EDGEX_DBNAME" )
40
- if databaseName == "" {
41
- databaseName = defaultDBName
42
- }
43
-
44
42
var edgeXerr errors.EdgeX
45
43
once .Do (func () {
46
- // use url encode to prevent special characters in the connection string
47
- connectionStr := "postgres://" + fmt .Sprintf ("%s:%s@%s:%d/%s" , url .PathEscape (config .Username ), url .PathEscape (config .Password ), url .PathEscape (config .Host ), config .Port , url .PathEscape (databaseName ))
48
- dbPool , err := pgxpool .New (ctx , connectionStr )
44
+ connPoolConfig , err := connPoolConConfig (config , lc )
45
+ if err != nil {
46
+ edgeXerr = WrapDBError ("fail to parse pg conn pool config" , err )
47
+ return
48
+ }
49
+
50
+ dbPool , err := pgxpool .NewWithConfig (ctx , connPoolConfig )
49
51
if err != nil {
50
52
edgeXerr = WrapDBError ("fail to create pg connection pool" , err )
51
53
}
@@ -78,6 +80,35 @@ func NewClient(ctx context.Context, config db.Configuration, lc logger.LoggingCl
78
80
return dc , nil
79
81
}
80
82
83
+ func connPoolConConfig (config db.Configuration , lc logger.LoggingClient ) (* pgxpool.Config , error ) {
84
+ // Get the database name from the environment variable
85
+ databaseName := os .Getenv ("EDGEX_DBNAME" )
86
+ if databaseName == "" {
87
+ databaseName = defaultDBName
88
+ }
89
+
90
+ // use url encode to prevent special characters in the connection string
91
+ connectionStr := "postgres://" + fmt .Sprintf ("%s:%s@%s:%d/%s" , url .PathEscape (config .Username ), url .PathEscape (config .Password ), url .PathEscape (config .Host ), config .Port , url .PathEscape (databaseName ))
92
+ connPoolConfig , err := pgxpool .ParseConfig (connectionStr )
93
+ if err != nil {
94
+ return nil , WrapDBError ("fail to parse pg connection string" , err )
95
+ }
96
+ connPoolConfig .MaxConns = int32 (config .MaxConns )
97
+ if connPoolConfig .MaxConns <= 0 {
98
+ lc .Errorf ("The MaxConns too small, use default '%d'" , defaultMaxConns )
99
+ connPoolConfig .MaxConns = defaultMaxConns
100
+ }
101
+ if connPoolConfig .MaxConnIdleTime , err = time .ParseDuration (config .MaxConnIdleTime ); err != nil {
102
+ connPoolConfig .MaxConnIdleTime = defaultMaxConnIdleTime
103
+ lc .Errorf ("Fail to parse pg conn pool MaxConnIdleTime config, use default '%v', err: %v" , defaultMaxConnIdleTime , err )
104
+ }
105
+ if connPoolConfig .MaxConnLifetime , err = time .ParseDuration (config .MaxConnLifetime ); err != nil {
106
+ connPoolConfig .MaxConnLifetime = defaultMaxConnLifetime
107
+ lc .Errorf ("Fail to parse pg conn pool MaxConnLifetime config, use default '%v', err: %v" , defaultMaxConnLifetime , err )
108
+ }
109
+ return connPoolConfig , nil
110
+ }
111
+
81
112
// CloseSession closes the connections to postgres
82
113
func (c * Client ) CloseSession () {
83
114
c .ConnPool .Close ()
0 commit comments