1

此 Microsoft Doc中的方案 C描述了如何将范围限定为连接的临时表替换为内存优化表。该方案使用过滤器安全策略,该策略调用一个函数来确定@@spid 是否与内存优化表中的 SpidFilter 列匹配。

这适用于 .NET 连接池吗?我希望@@spid 将返回与一遍又一遍地重用连接相同的数字。.NET 通过调用 sp_reset_connection 清除会话范围的临时表,但这不会清除内存优化表或更改 @@spid。也许可以添加 sys.dm_exec_sessions 的 session_id 以使其在连接池环境中工作?

4

1 回答 1

1

在 Microsoft 支持的帮助下,我能够获得有关 ASP.NET 连接池的必要详细信息来回答这个问题。确实,ASP.NET 线程将共享相同的 SPID,但不会同时共享。只有在前一个线程不再使用该连接后,该线程才会被分配一个连接。连接池不会减少所需的连接数,它只会减少需要打开和关闭连接的次数。

这是关于连接池的很好的文档,尽管它没有区分。https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling

请注意,场景 C 有特别说明:“将代码中的 CREATE TABLE #tempSessionC 语句替换为 DELETE FROM dbo.soSessionC,以确保会话不会暴露给具有相同 session_id 的先前会话插入的表内容。” – 我一个

由于一次只有一个线程会使用该连接,因此这就足够了。如果表在使用后没有被删除,它将继续消耗内存(在 Azure 中尤其宝贵),直到另一个线程碰巧使用具有相同 SPID 的连接。

于 2018-08-24T18:44:02.543 回答