在 SQL Server 中设置最大连接超时的最佳方法

Posted

技术标签:

【中文标题】在 SQL Server 中设置最大连接超时的最佳方法【英文标题】:Best way of setting a maximum connection timeout in SQL Server 【发布时间】:2013-12-19 11:54:39 【问题描述】:

我知道您可以在 ConnectionString 上设置连接超时参数,但是,它设置的是最小超时时间,而不是最大超时时间。

我的应用程序连接到远程数据库,如果连接丢失,它需要灰显屏幕并等待连接恢复。我已经很好地做到了,但有时当连接丢失时,它需要 30 多秒才能意识到连接丢失,即使使用最小连接超时参数值。

我检测到连接丢失,因为我有一个线程每 0.5 秒对数据库进行一次轮询,我等待它抛出“在建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误" 例外。

我想知道是否有设置最大超时的好方法或其他替代方法可以更快地检测到连接丢失。

编辑:我不知道还存在 CommandTimeout。它不能完美地工作,但效果更好。必须在每个新的 DataContext 对象上设置它,但这很好。我设置了一个值 X,它似乎总是需要 X + 5 秒来引发超时异常。

【问题讨论】:

最大连接超时是什么意思,和最小连接超时有什么区别? @Steve 例如,当我将其设置为 5 时,这意味着它不会在 5 秒之前超时,这就是我所说的最小的意思,就是这样工作......它会在5秒后的任意时间抛出异常。最大超时意味着它将在超过 5 秒等待的确切时刻抛出异常。 hm 你的服务器轮询间隔比你的超时时间小得多,这可能会造成混淆吗?我认为应该反过来。每次轮询时是否打开新连接?还是轮询独立于连接本身?您是否尝试在没有远程服务器的情况下在本地重现此内容?因为 sql 连接“随机”在超时间隔后的“某个时间”终止,恕我直言。 @DrCopyPaste 好吧,在轮询线程内部,它有一个进行查询的方法,因此轮询间隔无关紧要,因为它将被锁定在此方法中,直到抛出异常或成功. @DrCopyPaste,不,connectiontimeout 是连接Open() 调用的超时时间。它根本不适用于命令。 CommandTimeout 适用于ExecuteExecuteScalar 调用。它根本不适用于连接。 【参考方案1】:

ConnectionTimeout 是连接Open() 调用的超时时间。它根本不适用于命令。 CommandTimeout 适用于 ExecuteExecuteScalar 调用。它根本不适用于连接。

要将CommandTimeout 应用于所有命令,您必须在每次创建 Command 对象时执行此操作。

【讨论】:

【参考方案2】:

我发现最好的方法是创建另一个类来检测连接何时丢失。

这个类将创建 2 个线程,一个调用一个方法来检查数据库是否存在,然后将标志设置为 true;另一个会在一定时间后检查标志是否为真。如果一定时间后仍然为假,则表示数据库连接丢失,第一个线程被锁定等待超时。这样我就不需要等待超时发生来检测它。

【讨论】:

以上是关于在 SQL Server 中设置最大连接超时的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac 上的 Dbvisualizer 中设置 SQL Server 连接

如何在不使用 Docker 或 Windows Server 2016 上的 Confluent 平台的情况下在 Kafka 中设置 Debezium SQL Server 连接器?

如何在 SQLAlchemy 中设置连接超时

即使选项在防火墙设置中设置为 yes,Azure SQL Server 防火墙也不允许操作连接

如何在jdbc中设置锁定超时

在 CodeIgniter 3 中设置数据库连接超时