【问题标题】:how long must a sql server connection be idle before it is closed by the connection pool?sql server 连接必须空闲多长时间才能被连接池关闭?
【发布时间】:2009-07-16 10:24:33
【问题描述】:

我有一个客户端-服务器应用程序,它使用 .NET SqlClient 数据提供程序连接到 sql server - 非常标准的东西。默认情况下,连接池管理器关闭数据库连接并将其从池中删除之前连接必须空闲多长时间?如果有什么设置可以控制这个?

This MSDN document 只说

连接池在一个连接空闲很长时间后,或者如果池检测到与服务器的连接已被切断,则从池中删除。

【问题讨论】:

    标签: sql-server connection-pooling


    【解决方案1】:

    几年前下面的答案是这种情况,但现在已经改变了,所以你可以参考source 并写一个总结:)


    旧答案

    This excellent article 告诉我们需要知道什么,使用反射来揭示连接池的内部工作原理。

    据我了解,“关闭”连接会以半随机间隔定期清理。清理过程每 2 分钟到 3 分钟 50 秒之间运行一次,但它需要运行两次才能正确关闭“关闭”连接。因此,在“关闭”7 分钟 40 秒后,底层 sql 连接应该正确关闭,但它可能短至 2 分钟。在编写进程中创建的第一个连接池时,计时器间隔始终为 3 分钟 10 秒,因此您通常会在 ADO 对象上调用 Close() 后,在 3 分钟 10 秒到 6 分钟 20 秒之间看到 sql 连接被关闭.

    显然,这使用了未记录的代码,因此将来可能会发生变化 - 或者甚至可能在撰写该文章后发生变化。

    【讨论】:

    • 这里要小心。 implementation 已更改,因此该文章公开的内部信息不再真实。连接真的很干净。
    • 所以...余额超时设置为 0 意味着连接真的立即关闭?我就是这么理解的。这如何帮助汇集底层连接?这不是破坏池化吗?
    • 哦。这仅适用于使用负载平衡器并且连接未标记为注定失败的情况。
    【解决方案2】:

    请通过这个:

    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring%28VS.80%29.aspx

    部分

    "下表列出了有效的 连接池值的名称 在 ConnectionString 中。”

    似乎对你感兴趣。

    【讨论】:

    • hmmm... 唯一可能适用的设置是负载平衡超时,但这是最短时间而不是最长时间,因此增加它应该使连接持续更长时间。我想知道默认情况下“长时间闲置”是什么意思。如果是连接池决定了一个连接是空闲的,那么它不应该依赖于 SQL Server 连接超时。还有SQL Server的连接超时之类的吗?
    • 可以使用连接生命周期来决定连接的最大生命周期(空闲+使用时间)。
    • 删除了关于连接超时的部分。根据可用数据,不能说 .NET 何时关闭连接,但使用连接生命周期和负载平衡超时,我认为您可以在一定程度上控制连接何时中断。在 TCP/IP 的情况下,SQl Server 的 keep alive 参数也会杀死死连接(不是空闲连接)。
    • Connection Lifetime 表示仅在连接返回池时检查它,并且它基于连接的创建时间而不是自上次批处理以来的时间。因此,我认为它在这种情况下没有用。
    • 根据文档,ConnectionLifetime 是自连接打开以来的时间段,而不是自上次使用以来的时间段。如果是这样,那么它没有设置空闲超时,并且设置它会导致连接在经常使用时被不必要地关闭。例如,我希望在 1 分钟无用后关闭连接。如果我使用 ConnectionTimeout 那么每个数据库连接将在 1 分钟后关闭。我只想关闭那些不经常使用的。
    猜你喜欢
    • 2021-07-10
    • 2018-07-15
    • 2014-12-04
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2012-04-02
    • 2010-11-25
    • 1970-01-01
    相关资源
    最近更新 更多