我们在程序中使用全局临时表,用c++编写,使用ATL作为DB接口。会话是通过SQL OLE DB提供程序建立的。
这个全局临时表被保存很长时间,可能是整个会话的时间。当特定操作/活动结束时,我们会显式删除这些临时表。所以我们总是清理桌子。
现在我们看到对使用缓慢或不稳定VPN连接的人的影响,全局临时被删除。应该读取某些内容的查询返回错误
# # tblTemp……不是一个有效的对象名
对我来说,这是一个指示符,SQL Server终止会话。
怎么可能呢?我们的程序具有至少每5分钟访问一次服务器的内部函数(即使用户处于非活动状态)。通常访问SQL Server的频率要高得多。但是程序可能会在后台被最小化。
SQL Server终止会话并删除临时表的超时是多少?
我在服务器设置中看到Remote Query Timeout
。但这对我来说似乎是错误的,因为我们这里没有开放的查询…对表的查询也非常简单。插入、删除记录
问题:
-
我在哪里找到这个会话超时的设置?
-
客户端是否有办法发现会话被终止?奇怪的是,SQL查询本身被转移到SQL Server,最终失败,因为临时表不再存在。客户端出现其他错误
-
是否有办法在服务器上达成协议?
编辑:
下面是我们如何使用这些表的更多细节。
- 这些表是在主线程中创建的。这个线程有一个SQL会话,它在程序开始时创建,并在程序结束时结束。其他线程使用临时表。我们通过它传递名字。
因此,由于创建SQL会话仍然是活的,并且在执行使用临时表的语句时没有显示错误,它告诉我会话仍然是活的。但是我的问题是对象似乎要被删除。
再次说明:我们只在VPN连接到服务器的机器上有这个问题!
引用手册:
来源所以这不是关于每隔几分钟访问一次服务器,而是关于特定的对象被引用。当创建临时表的会话结束并且所有其他任务停止引用临时表时,全局临时表将被自动删除。任务和表之间的关联仅在单个Transact-SQL语句的生命周期内维护。这意味着在创建会话结束时主动引用表的最后一个Transact-SQL语句完成时,将删除全局临时表。
如果创建全局临时表的会话已经结束(例如超时),并且没有其他积极地引用同一表,它将被丢弃!