From 233c03093470b7978e064cab900976353ed6ddce Mon Sep 17 00:00:00 2001 From: Lombiq Date: Wed, 29 Jan 2014 18:04:02 +0100 Subject: [PATCH] UpgradeService now disposes NHibernate sessions, preventing possible SQL server connection pool saturation --- .../Upgrade/Services/UpgradeService.cs | 110 +++++++++--------- 1 file changed, 54 insertions(+), 56 deletions(-) diff --git a/src/Orchard.Web/Modules/Upgrade/Services/UpgradeService.cs b/src/Orchard.Web/Modules/Upgrade/Services/UpgradeService.cs index 4416b1d56..6446fe5aa 100644 --- a/src/Orchard.Web/Modules/Upgrade/Services/UpgradeService.cs +++ b/src/Orchard.Web/Modules/Upgrade/Services/UpgradeService.cs @@ -39,75 +39,74 @@ namespace Upgrade.Services { values.Add(parameters); }); - var sessionFactory = _sessionFactoryHolder.GetSessionFactory(); - var session = sessionFactory.OpenSession(); - var connection = session.Connection; + using (var session = _sessionFactoryHolder.GetSessionFactory().OpenSession()) { + var connection = session.Connection; - foreach (var record in values) { - var command = connection.CreateCommand(); - var statement = String.Format("INSERT INTO {0} (", toPrefixedTableName); + foreach (var record in values) { + var command = connection.CreateCommand(); + var statement = String.Format("INSERT INTO {0} (", toPrefixedTableName); - foreach (var keyValuePair in record) { - if (ignoreColumns.Contains(keyValuePair.Key)) { - continue; + foreach (var keyValuePair in record) { + if (ignoreColumns.Contains(keyValuePair.Key)) { + continue; + } + + statement += keyValuePair.Key; + if (keyValuePair.Key != record.Last().Key) { + statement += ", "; + } } - statement += keyValuePair.Key; - if (keyValuePair.Key != record.Last().Key) { - statement += ", "; - } - } + statement += ") VALUES ( "; - statement += ") VALUES ( "; + foreach (var keyValuePair in record) { + if (ignoreColumns.Contains(keyValuePair.Key)) { + continue; + } - foreach (var keyValuePair in record) { - if (ignoreColumns.Contains(keyValuePair.Key)) { - continue; + var parameter = command.CreateParameter(); + parameter.ParameterName = "@" + keyValuePair.Key; + parameter.Value = keyValuePair.Value; + + statement += parameter.ParameterName; + if (keyValuePair.Key != record.Last().Key) { + statement += ", "; + } + + command.Parameters.Add(parameter); } - var parameter = command.CreateParameter(); - parameter.ParameterName = "@" + keyValuePair.Key; - parameter.Value = keyValuePair.Value; + statement += ")"; - statement += parameter.ParameterName; - if (keyValuePair.Key != record.Last().Key) { - statement += ", "; - } + command.CommandText = statement; - command.Parameters.Add(parameter); - } - - statement += ")"; - - command.CommandText = statement; - - command.ExecuteNonQuery(); + command.ExecuteNonQuery(); + } } } public void ExecuteReader(string sqlStatement, Action action) { - var sessionFactory = _sessionFactoryHolder.GetSessionFactory(); - var session = sessionFactory.OpenSession(); + using (var session = _sessionFactoryHolder.GetSessionFactory().OpenSession()) { + var command = session.Connection.CreateCommand(); + command.CommandText = string.Format(sqlStatement); - var command = session.Connection.CreateCommand(); - command.CommandText = string.Format(sqlStatement); + var reader = command.ExecuteReader(); - var reader = command.ExecuteReader(); - - while (reader != null && reader.Read()) { - try { - if (action != null) { - action(reader, session.Connection); + while (reader != null && reader.Read()) { + try { + if (action != null) { + action(reader, session.Connection); + } + } + catch (Exception e) { + Logger.Error(e, "Error while executing custom SQL Statement in Upgrade."); } } - catch (Exception e) { - Logger.Error(e, "Error while executing custom SQL Statement in Upgrade."); - } - } - if (reader != null && !reader.IsClosed) { - reader.Close(); + if (reader != null && !reader.IsClosed) { + reader.Close(); + } } } @@ -122,16 +121,15 @@ namespace Upgrade.Services { public bool TableExists(string tableName) { // While not particularly nice (or fast with many tables) this seems to be a database-agnostic way of checking the existence // of a table. - var sessionFactory = _sessionFactoryHolder.GetSessionFactory(); - var session = sessionFactory.OpenSession(); + using (var session = _sessionFactoryHolder.GetSessionFactory().OpenSession()) { + var connection = session.Connection as DbConnection; - var connection = session.Connection as DbConnection; + if (connection == null) { + throw new InvalidOperationException("The database connection object should derive from DbConnection to check if a table exists."); + } - if (connection == null) { - throw new InvalidOperationException("The database connection object should derive from DbConnection to check if a table exists."); + return connection.GetSchema("Tables").Rows.Cast().Any(row => row["TABLE_NAME"].ToString() == tableName); } - - return connection.GetSchema("Tables").Rows.Cast().Any(row => row["TABLE_NAME"].ToString() == tableName); } } }