【问题标题】:C# SqlConnection caching DNSC# SqlConnection 缓存 DNS
【发布时间】:2018-05-29 15:50:56
【问题描述】:

我们正在将数据库迁移到新的数据中心。我的迁移计划是更新所有客户端在连接到它时使用的 DNS 记录。

我已经通过启动一个循环执行以下操作的进程对此进行了测试:

  1. 打开一个新的 SQL 连接,使用 DNS 条目作为服务器名称
  2. 使用该连接执行查询
  3. 关闭并释放 SQL 连接

在运行时,我更新了 DNS 条目以指向新服务器。

除非我停止并重新启动进程,否则查询将继续针对旧服务器执行。

我在使用 HttpClient 发送 Web 请求时尝试过相同的方法,并且似乎每 2 分钟刷新一次它的 DNS,但 SqlConnection 对象会一直保持原始分辨率,直到整个过程重新启动。我认为这是因为连接是池化的,当它从池中获取连接时,它不会重新验证 DNS 条目。

理想情况下,我希望避免在迁移过程中回收应用程序池和重新启动服务。有没有其他人经历过这种行为?如果是这样,您是否找到强制 SqlConnection 重新评估它用作服务器名称的 DNS 条目的方法?

【问题讨论】:

  • 您能否在切换数据库服务器之前重新部署应用程序? IE。代码或配置更改是否可接受?
  • 大约有 40 个单独的软件以某种方式使用此数据库服务器,所以我不希望这样做,但这并非不可能。
  • 作为一个选项 - 您可能有一个不时查询 DNS 的计时器,当检测到更改时 - 清除所有连接池。
  • 首先要尝试的是:在 DSN 更改后刷新连接池(msdn.microsoft.com/en-us/library/… 表示 SqlClient) - 这是否使它按预期方式工作?
  • @MarcGravell 从现有答案中已经很清楚了,但是检测 DNS 更改的最佳方法是什么?

标签: c# sql-server dns connection-pooling sqlconnection


【解决方案1】:

使用连接池,连接和底层会话将被重复使用,直到从池中删除连接并创建一个新连接。您可以通过调用SqlConnection.ClearAllPools 来强制清除连接池,以清除当前应用程序域的池。您也可以使用 Pooling=False 连接字符串关键字完全关闭连接池,但请注意性能损失可能相当大。

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 2011-11-04
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2019-08-04
    • 2014-07-02
    • 2012-06-16
    相关资源
    最近更新 更多