@@ -227,11 +227,10 @@ func (ds *SQLDatasource) handleQuery(ctx context.Context, req backend.DataQuery,
227
227
if errors .Is (err , ErrorQuery ) && ! errors .Is (err , context .DeadlineExceeded ) {
228
228
for i := 0 ; i < ds .driverSettings .Retries ; i ++ {
229
229
backend .Logger .Warn (fmt .Sprintf ("query failed. retrying %d times" , i ))
230
- db , err := ds .c . Connect (dbConn . settings , q . ConnectionArgs )
230
+ db , err := ds .dbReconnect (dbConn , q , cacheKey )
231
231
if err != nil {
232
232
return nil , err
233
233
}
234
- ds .storeDBConnection (cacheKey , dbConnection {db , dbConn .settings })
235
234
236
235
if ds .driverSettings .Pause > 0 {
237
236
time .Sleep (time .Duration (ds .driverSettings .Pause * int (time .Second )))
@@ -247,11 +246,10 @@ func (ds *SQLDatasource) handleQuery(ctx context.Context, req backend.DataQuery,
247
246
if errors .Is (err , context .DeadlineExceeded ) {
248
247
for i := 0 ; i < ds .driverSettings .Retries ; i ++ {
249
248
backend .Logger .Warn (fmt .Sprintf ("connection timed out. retrying %d times" , i ))
250
- db , err := ds .c . Connect (dbConn . settings , q . ConnectionArgs )
249
+ db , err := ds .dbReconnect (dbConn , q , cacheKey )
251
250
if err != nil {
252
251
continue
253
252
}
254
- ds .storeDBConnection (cacheKey , dbConnection {db , dbConn .settings })
255
253
256
254
res , err = QueryDB (ctx , db , ds .c .Converters (), fillMode , q )
257
255
if err == nil {
@@ -263,6 +261,19 @@ func (ds *SQLDatasource) handleQuery(ctx context.Context, req backend.DataQuery,
263
261
return nil , err
264
262
}
265
263
264
+ func (ds * SQLDatasource ) dbReconnect (dbConn dbConnection , q * Query , cacheKey string ) (* sql.DB , error ) {
265
+ if err := dbConn .db .Close (); err != nil {
266
+ backend .Logger .Warn (fmt .Sprintf ("closing existing connection failed: %s" , err .Error ()))
267
+ }
268
+
269
+ db , err := ds .c .Connect (dbConn .settings , q .ConnectionArgs )
270
+ if err != nil {
271
+ return nil , err
272
+ }
273
+ ds .storeDBConnection (cacheKey , dbConnection {db , dbConn .settings })
274
+ return db , nil
275
+ }
276
+
266
277
// CheckHealth pings the connected SQL database
267
278
func (ds * SQLDatasource ) CheckHealth (ctx context.Context , req * backend.CheckHealthRequest ) (* backend.CheckHealthResult , error ) {
268
279
key := defaultKey (getDatasourceUID (* req .PluginContext .DataSourceInstanceSettings ))
0 commit comments