语境:
我有十几台服务器。
每台服务器都有一个带有站点的 IIS,该站点每 5 分钟执行一次以下大型 SQL 脚本。
在某些服务器上,托管站点的池崩溃。该池仅包含此站点。
每次崩溃后我都需要回收游泳池……目前是我的双手。
因此,该站点存在问题,我认为大型 SQL 脚本存在问题。
调用 SQL 脚本的 C# 代码:
string root = AppDomain.CurrentDomain.BaseDirectory;
string script = File.ReadAllText(root + @"..\SGBD\select_user_from_all_bases.sql").Replace("$date", dtLastModif);
string connectionString = @"Data Source=(local);Integrated Security=SSPI";
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var command = new SqlCommand(script, connection);
var reader = command.ExecuteReader();
var users = new List<UserModel>();
while (reader.Read())
{
users.Add(new UserModel()
{
dbName = String.Format("{0}", reader[0]),
idExternal = int.Parse(String.Format("{0}", reader[1])),
firstname = String.Format("{0}", reader[2]),
lastname = String.Format("{0}", reader[3]),
login = String.Format("{0}", reader[4]),
password = String.Format("{0}", reader[5]),
dtContractStart = reader[6] != DBNull.Value ? (DateTime?)reader[6] : null,
dtContractEnd = reader[7] != DBNull.Value ? (DateTime?)reader[7] : null,
emailPro = String.Format("{0}", reader[8]),
emailPerso = String.Format("{0}", reader[9])
});
}
return users;
}
和 SQL 脚本:
USE master
DECLARE db_names CURSOR FOR
SELECT name FROM sysdatabases WHERE [name] LIKE 'FOO_%' AND [name] NOT LIKE 'FOO_TRAINING_%'
DECLARE @db_name NVARCHAR(100)
DECLARE @query NVARCHAR(MAX)
DECLARE @queryFinal NVARCHAR(MAX)
SET @query = ''
OPEN db_names
FETCH NEXT FROM db_names INTO @db_name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @query = @query + 'SELECT ''' + @db_name + ''', id_salarie, nom, prenom, login COLLATE SQL_Latin1_General_CP1_CI_AS, password COLLATE SQL_Latin1_General_CP1_CI_AS, date_arrivee, date_depart, email COLLATE SQL_Latin1_General_CP1_CI_AS, persoMail COLLATE SQL_Latin1_General_CP1_CI_AS FROM [' + @db_name + '].dbo.utilisateurs WHERE dt_last_modif >= ''$date'' UNION '
FETCH NEXT FROM db_names INTO @db_name
END
DEALLOCATE db_names
SET @queryFinal = left(@query, len(@query)-6)
EXEC sp_executesql @queryFinal
有关服务器的更多信息:
- Server0 : 8 个数据库,1050 个用户,没有崩溃
- Server1:88个数据库,18954个用户,经常崩溃
- Server2:109个数据库,21897个用户,经常崩溃
- Server3:26个数据库,1612个用户,没有crash
- ETC
问题 :
- 脚本有什么问题?知道如何阻止崩溃吗?
- 如果没有解决方案,如何自动回收池?