[C#][MSSQL] 连线结束后 Temp Table 没有自动释放 !?

原文:[C#][MSSQL] 连线结束后 Temp Table 没有自动释放 !?

上次 [C#] SQL 资料库 Connection Pool 连线池观念釐清 有提到可以开启 Connection Pool 来减少开启连线的效能耗损,但最近发现有 Stored Procedure 执行后没有手动 Drop Temp Table,而 .NET 又将连线丢回 Pool 里面造成 Temp Table 没有被正常释放的问题,下面来测试看看是不是真的会有这种情况发生。

正常情况下 Temp Table 的生命週期为一个 Connection,当 Connection 结束时将会回收中间使用到的暂存资源,但是 .NET 内建的 Connection Pool 的功能让 Connection 重複利用且没有关闭,如果是 Web Applicetion 或是 Windows Service 没有手动 Drop Temp Table 就会发生资源被占用的问题。

这边为了测试我将 Pooling 设为 True 并将 MinPoolSize 设为 100 更容易看出差异

程式码:

static void Main(string[] args){    SqlConnectionStringBuilder sqlStrBuilder = new SqlConnectionStringBuilder();    sqlStrBuilder.DataSource = "192.168.245.137";    sqlStrBuilder.UserID = "sa";    sqlStrBuilder.Password = "Zxcv#1234";    sqlStrBuilder.InitialCatalog = "master";    sqlStrBuilder.Pooling = true;    sqlStrBuilder.MinPoolSize = 100;    string connectionString = sqlStrBuilder.ToString();    for (int i = 0; i < 100; i++)    {        string result = ExecuteSql(connectionString, i);        Console.WriteLine(result);    }    Console.ReadKey();}static string ExecuteSql(string connectionString, int i){    string tempTableName = $"#{Guid.NewGuid().ToString().Replace("-", string.Empty)}";    var sb = new StringBuilder();    sb.AppendLine($"SELECT '{i} - {tempTableName}' AS col INTO {tempTableName}");    sb.AppendLine($"SELECT col FROM {tempTableName}");    using (var sqlConnection = new SqlConnection(connectionString))    {        string sql = sb.ToString();        return sqlConnection.ExecuteScalar<string>(sql);    }}

Temp Table 占用状态:

结论:

只要不结束应用程式这些 Temp Table 就不会被释放,如果资料量大的话会造成硬碟空间被大量占用甚至出现吃满的状况。

从这件事可以了解使用 Temp Table 完毕后记得要手动 Drop 掉,不然可能会有效能问题。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章