From 4ea920825d83418209ced0b249eab4eb6f0deff1 Mon Sep 17 00:00:00 2001 From: niekvanderreest Date: Mon, 21 Nov 2022 14:57:01 +0100 Subject: [PATCH] Cherry pick #13373 to v10/dev --- .../Persistence/UmbracoDatabase.cs | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs index e0542874d0..425629dc4b 100644 --- a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs @@ -82,6 +82,51 @@ public class UmbracoDatabase : Database, IUmbracoDatabase { Mappers.AddRange(_mapperCollection); } + + InitCommandTimeout(); + } + + // https://github.com/umbraco/Umbraco-CMS/issues/13354 + // This sets the Database Command to connectionString Connection Timeout / Connect Timeout + // This could be better, ideally the UmbracoDatabaseFactory.CreateDatabase() function would set this based on a setting (global or connectionstring setting) + private void InitCommandTimeout() + { + if (CommandTimeout != 0) + { + // CommandTimeout configured elsewhere, so we'll skip + return; + } + + if (Connection is not null && Connection.ConnectionTimeout > 0) + { + CommandTimeout = Connection.ConnectionTimeout; + return; + } + + // get from ConnectionString + var connectionParser = new DbConnectionStringBuilder + { + ConnectionString = ConnectionString + }; + + if (connectionParser.TryGetValue("connection timeout", out var connectionTimeoutString)) + { + if (int.TryParse(connectionTimeoutString.ToString(), out var connectionTimeout)) + { + _logger.LogTrace("Setting Command Timeout to value configured in connectionstring Connection Timeout : {TimeOut} seconds", connectionTimeout); + CommandTimeout = connectionTimeout; + return; + } + } + + if (connectionParser.TryGetValue("connect timeout", out var connectTimeoutString)) + { + if (int.TryParse(connectTimeoutString.ToString(), out var connectionTimeout)) + { + _logger.LogTrace("Setting Command Timeout to value configured in connectionstring Connect Timeout : {TimeOut} seconds", connectionTimeout); + CommandTimeout = connectionTimeout; + } + } } #endregion