Resolved a connection leak in Postgres.cs class by wrapping all instantiations in using blocks to ensure proper object disposal. This addresses an oversight in recent resilience updates where direct SQL calls were leaking connections. Additionally, added a try-catch block around the connection opening to handle errors gracefully while still guaranteeing disposal.

This commit is contained in:
richard-churchman
2026-03-24 11:25:55 +01:00
parent bc987fb4a2
commit 7c153eb8a5
9 changed files with 18 additions and 10 deletions
+1 -1
View File
@@ -147,7 +147,7 @@ namespace Jube.App.Controllers.Session
try
{
var postgres = new Postgres(reportConnectionString ?? dbContext.ConnectionString, log);
using var postgres = new Postgres(reportConnectionString ?? dbContext.ConnectionString, log);
await postgres.PrepareAsync(model.SelectSqlSearch + " " + model.WhereSql + " " + model.OrderSql,
filterRule.Tokens, token).ConfigureAwait(false);
model.Prepared = 1;
@@ -108,7 +108,7 @@ namespace Jube.App.Controllers.Session
await CheckRebuildAsync(modelCompiled, token).ConfigureAwait(false);
var postgres = new Postgres(reportConnectionString, log);
using var postgres = new Postgres(reportConnectionString, log);
var tokens = JsonConvert.DeserializeObject<List<object>>(modelCompiled.FilterTokens);
var sw = new StopWatch();
@@ -61,7 +61,7 @@ namespace Jube.Data.Query.CaseQuery
var sw = new StopWatch();
sw.Start();
var postgres = new Postgres(reportConnectionString, log);
using var postgres = new Postgres(reportConnectionString, log);
var value = await
postgres.ExecuteByOrderedParametersAsync(modelCompiled.SelectSqlDisplay
@@ -95,7 +95,7 @@ namespace Jube.Data.Query
}
}
var postgres = new Postgres(reportConnectionString ?? dbContext.ConnectionString, log);
using var postgres = new Postgres(reportConnectionString ?? dbContext.ConnectionString, log);
return await postgres.ExecuteByNamedParametersAsync(visualisationRegistryDatasource.Command,
mergedParametersByName, token).ConfigureAwait(false);
}
+1 -1
View File
@@ -64,7 +64,7 @@ namespace Jube.Data.Query
limit
};
var postgres = new Postgres(reportConnectionString ?? dbContext.ConnectionString, log);
using var postgres = new Postgres(reportConnectionString ?? dbContext.ConnectionString, log);
await postgres.PrepareAsync(sql, tokens, token).ConfigureAwait(false);
+9 -1
View File
@@ -34,7 +34,15 @@ namespace Jube.Data.Reporting
public Postgres(string connectionString, ILog log)
{
connection = new ResilientNpgsqlConnection(connectionString, log);
connection.Open();
try
{
connection.Open();
}
catch
{
connection.Dispose();
throw;
}
}
public void Dispose()
@@ -298,7 +298,7 @@ namespace Jube.Data.Repository
parametersDefaultValues.Add(parameter.Name.Replace(" ", "_"), defaultValue);
}
var postgres = new Postgres(dbContext.ConnectionString, log);
using var postgres = new Postgres(dbContext.ConnectionString, log);
return await postgres.IntrospectAsync(sql, parametersDefaultValues).ConfigureAwait(false);
}
@@ -124,7 +124,7 @@ namespace Jube.Engine.EntityAnalysisModelManager.BackgroundTasks.TaskStarters
// ReSharper disable once RedundantAssignment
var deleted = false;
var archiveDatabase = new Postgres(context.Services.ReportConnectionString ?? dbContext.ConnectionString, context.Services.Log);
using var archiveDatabase = new Postgres(context.Services.ReportConnectionString ?? dbContext.ConnectionString, context.Services.Log);
do
{
if (context.Services.Log.IsInfoEnabled)
@@ -40,7 +40,7 @@ namespace Jube.Engine.Exhaustive.Utilities
{
var dataList = new List<double[]>();
var outputsList = new List<double>();
var postgres = new Postgres(reportConnectionString ?? dbContext.ConnectionString, log);
using var postgres = new Postgres(reportConnectionString ?? dbContext.ConnectionString, log);
foreach (var json in
await postgres.ExecuteReturnOnlyJsonFromArchiveSampleAsync(entityAnalysisModelId, filterSql,
@@ -108,7 +108,7 @@ namespace Jube.Engine.Exhaustive.Utilities
string reportConnectionString = null,
CancellationToken token = default)
{
var postgres = new Postgres(reportConnectionString ?? dbContext.ConnectionString, log);
using var postgres = new Postgres(reportConnectionString ?? dbContext.ConnectionString, log);
var jsonList = await postgres.ExecuteReturnOnlyJsonFromArchiveSampleAsync(entityAnalysisModelId,
"NOT (" + filterSql + ")",
filterTokens, 10000, mockData, token).ConfigureAwait(false);