SqlConnection关闭后全局临时表未删除,父窗体关闭才消失的原因
全局临时表存活原因解析
这核心原因是数据库连接池的机制,结合SQL Server全局临时表的生命周期规则共同导致的:
- 首先明确全局临时表(
##开头)的生命周期:它会在创建它的原始会话完全终止,且没有其他会话正引用它的时候才会被SQL Server自动删除。 - 子窗体关闭SQL连接时,调用的
Close()/Dispose()并没有真正断开与SQL Server的会话——因为应用程序默认启用了连接池(比如.NET的SqlClient、Java的JDBC等都默认开启)。此时连接只是被放回连接池,处于空闲状态,对应的SQL Server会话并没有结束。 - 直到整个应用程序进程(父窗体所在的进程)关闭时,连接池才会销毁所有空闲连接,对应的SQL Server会话才真正终止。这时全局临时表失去了它的创建会话,才会被SQL Server清理删除。
补充验证方式:如果在连接字符串中添加Pooling=false禁用连接池,子窗体关闭连接时SQL会话会立即终止,全局临时表也会随之被删除(前提是没有其他会话在使用它)。
内容的提问来源于stack exchange,提问作者Torpi1974
相关产品推荐
相关产品推荐

