【发布时间】:2021-11-19 08:32:40
【问题描述】:
我们在程序中使用全局临时表,用 C++ 编写,使用 ATL 作为 DB 接口。使用 SQL OLE DB 提供程序建立会话。
这个全局临时表会保留很长时间,可能会保留一个会话的完整时间。当特定操作/活动结束时,我们会明确删除此类临时表。所以我们总是清理桌子。
现在我们看到删除全局临时文件对使用缓慢或不稳定 VPN 连接的人的影响。应该读取某些内容的查询返回错误
##tblTemp... 不是有效的对象名称
对我来说,这表明 SQL Server 终止了会话。
但怎么可能呢?我们的程序具有至少每 5 分钟访问一次服务器的内部功能(即使用户处于非活动状态)。通常访问 SQL Server 的频率要高得多。但是程序可能会在后台最小化。
SQL Server 终止会话并删除临时表的超时时间是多少?
我在服务器设置中看到了Remote Query Timeout。但这对我来说似乎是错误的,因为我们这里没有开放查询……而且对表的查询也很简单。插入一条记录,删除一条记录。
问题:
-
在哪里可以找到此会话超时的设置?
-
有没有办法让客户端发现会话已终止?对我来说奇怪的是,SQL 查询本身被转移到 SQL Server 并最终失败,因为临时表不再存在。我们在客户端上遇到了其他错误。
-
有没有办法在服务器上对此进行协议?
编辑:
在此处详细了解我们如何使用这些表格。
- 这些表是在我的主线程中创建的。该线程有一个在程序开始时创建并在程序结束时结束的 SQL 会话。
- 其他线程使用临时表。我们通过它传递名称。
因此,由于创建 SQL 会话仍然处于活动状态并且在执行使用临时表的语句时没有显示错误,它告诉我会话仍然处于活动状态。但我的问题是要删除的对象接缝。
再次重申:我们只在与服务器的 VPN 连接缓慢/不良的机器上遇到此问题!
【问题讨论】:
-
听起来全局会话范围的对象不是您所需要的,只需直接将您的表创建为 tempdb.dbo.table,它将一直保留到您的应用删除它或服务器重新启动。
-
听起来,老实说,他们真正需要的根本不是临时的,他们应该将数据存储在用户数据库中的永久表中(和 l 同一个表,没有多少表),如果他们希望在完成后删除这些数据,
DELETEit。 -
主要会话是临时的!它也是少量数据,访问应该是内存缓冲的......所有这些都是全局临时表提供的。而且我不需要临时表的 DDL 权限。数据写入器就足够了。
-
访问应该是内存缓冲的 这对任何表都是如此,一旦数据被读取,它就会保留在缓冲区缓存中;如果您假设 ##table 未写入磁盘,那是不正确的。
-
仅在 tempdb 或用户数据库中创建用户表并根据需要将其用于临时/中间数据,而在不再需要时删除数据会有什么问题。是否存在使用全局临时表来解决的问题?
标签: sql-server session temp-tables session-timeout