Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何检测SqlConnection的“阻塞期”是否处于活动状态?

如何检测SqlConnection的“阻塞期”是否处于活动状态?
EN

Stack Overflow用户
提问于 2013-11-22 10:09:47
回答 3查看 2K关注 0票数 8

根据微软的文章(Server连接池(ADO.NET)),

当启用连接池时,如果出现超时错误或其他登录错误,将引发异常,随后的连接尝试将在接下来的5秒“阻塞期”失败。如果应用程序试图在阻塞期间内连接,则将再次引发第一个异常。阻塞周期结束后,应用程序的另一个连接故障将导致阻塞期,其长度是前一个阻塞周期的两倍。阻塞周期结束后的后续故障将导致一个新的阻塞周期,其长度是前一个阻塞周期的两倍,最长可达5分钟。

如何检测阻塞期是活动的?我假设在尝试连接之前有一些属性需要检查,这样就可以避免延长阻塞期。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-26 17:45:27

不幸的是,没有一种简单的方法来检测您是否处于ADO.NET“阻塞期”(而不是求助于一些脆弱的东西,比如反射)。

但是,如果您使用的是.Net 4.5或更高版本,那么您可以通过查看SqlExceptionClientConnectionId并将其与您看到的最后一个SqlException的id进行比较(因为异常是重复的,id也是重复的),就可以检测您在SqlException/OpenAsync中观察到的最后一个异常是否重复。

假设您有一个为单个连接字符串创建\open SqlConnections的位置,则可以执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static class DataAccessLayer
{
    // Single connection string that all connections use
    private static readonly string _connectionString = "server=(local);integrated security=true;";

    // Stores that last observed connection if when opening a connection
    // NOTE: Using an object so that the Volatile methods will work
    private static object _lastErrorConnectionId = Guid.Empty;

    public static SqlConnection GetOpenedConnection()
    {
        try
        {
            SqlConnection connection = new SqlConnection(_connectionString);
            connection.Open();
            return connection;
        }
        catch (SqlException ex)
        {
            // Did the connection open get to the point of creating an internal connection?
            if (ex.ClientConnectionId != Guid.Empty)
            {
                // Verify that the connection id is something new
                var lastId = (Guid)Volatile.Read(ref _lastErrorConnectionId);
                if (ex.ClientConnectionId != lastId)
                {
                    // New error, save id and fall-through to re-throw
                    // NOTE: There is a small timing window here where multiple threads could end up switching this between
                    //       a duplicated id and a new id. Since this is unlikely and will only cause a few additional exceptions to be
                    //       thrown\logged, there isn't a large need for a lock here.
                    Volatile.Write(ref _lastErrorConnectionId, (object)ex.ClientConnectionId);
                }
                else
                {
                    // Duplicate error
                    throw new DuplicatedConnectionOpenException(_connectionString, ex);
                }
            }

            // If we are here, then this is a new exception
            throw;
        }
    }
}

public class DuplicatedConnectionOpenException : Exception
{
    public string ConnectionString { get; private set; }

    internal DuplicatedConnectionOpenException(string connectionString, SqlException innerException)
        : base("Hit the connection pool block-out period and a duplicated SqlException was thrown", innerException)
    {
        ConnectionString = connectionString;
    }
}

现在,如果您调用GetOpenedConnection并看到抛出一个DuplicatedConnectionOpenException,您就会知道您已经进入了“阻塞期”。

注意:我在这里使用的是Volatile Read/Write,而不是锁,因为我选择更好的性能,而不是100%准确地表示处于“阻塞期”。如果您想要的准确性,您可以使用lock代替。

此外,我确实有代码作为SqlConnection上的扩展方法,可以处理多个连接字符串,但是它的性能要差得多,因为它使用ConcurrentDictionary将连接字符串映射到连接it。

票数 0
EN

Stack Overflow用户

发布于 2013-11-23 18:16:57

不应该需要检查是否处于阻塞期以避免扩展。正如上面的摘录所述,任何在阻塞期间连接的尝试都将重新抛出第一个异常,它没有提到延长阻塞期。然而,每一个新的阻塞期将是以前的两倍。

在我的经验中,抛出的异常(由于超时、连接泄漏等)是否存在环境问题或未能正确关闭/处理连接。记录这些异常是个好主意,这样您就可以追踪真正的问题了。

如果您确实经常遇到超时异常,您可以捕获它并尝试清理所有的游泳池,但很可能是由于连接泄漏。您需要确保用using语句包装连接,这将有助于在完成连接或发生异常时关闭/处理连接。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using(SqlConnection connection = new SqlConnection("connection_string"))
{
    using(SqlCommand command = new SqlCommand())
    {

        SqlCommand command = new SqlCommand();
        command.Connection = connection;
        command.CommandType = CommandType.Text;
        command.CommandTimeout = [some timeout value]; 
        command.CommandText = "Update SomeTable Set Value = 1";

        connection.Open();

        command.ExecuteNonQuery();
    }
}
票数 2
EN

Stack Overflow用户

发布于 2017-11-18 17:31:32

除了ClientConnectionId字段之外,

SqlException.Message也将是参考-平等。也就是说,对于在“阻塞期”内失败的连接,将返回缓存的字符串。

然而,这也是一个实现细节,可能会发生变化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20151652

复制
相关文章
ClickHouse在苏宁用户画像场景的最佳实践
---- 关注 「 Cli肉眼品世界 」 , 后台回复 cksn 可获取PDF
肉眼品世界
2021/06/08
1.3K0
无限滚动加载最佳实践
无限滚动(Infinite scrolling),有时候被称为无尽滚动(endless scrolling),这种技术允许用户在大量内容上滚动,眼中看不到结束的地方。这种技术很简单,就是页面往下滚动的时候保持刷新。
疯狂的技术宅
2019/03/27
4.3K0
无限滚动加载最佳实践
管理Salesforce用户的最佳实践
管理Salesforce用户看起来不困难,但是今天我们还是会介绍下管理Salesforce用户的最佳实践。使用不正确的方法管理用户和许可证可能导致企业数据完整性出现问题。最佳实践应用于Salesforce的很多地方,用户管理的方法也同样适用。
臭豆腐
2019/04/16
1.1K0
Java延迟加载的最佳实践应用示例!
作者 | S.L 来源 | http://r6d.cn/abGzy 代码中的很多操作都是Eager的,比如在发生方法调用的时候,参数会立即被求值。总体而言,使用Eager方式让编码本身更加简单,然而使用Lazy的方式通常而言,即意味着更好的效率。 延迟初始化 一般有几种延迟初始化的场景: 对于会消耗较多资源的对象:这不仅能够节省一些资源,同时也能够加快对象的创建速度,从而从整体上提升性能。 某些数据在启动时无法获取:比如一些上下文信息可能在其他拦截器或处理中才能被设置,导致当前bean在加载的时候可能获取
程序猿DD
2023/04/04
7980
Java延迟加载的最佳实践应用示例!
微服务前端数据加载的最佳实践
目前在不少团队里已经逐步实践落地了微服务架构,比如前端圈很流行的 BFF(Backend For Frontend)其实就是微服务架构的一种变种,即让前端团队维护一套“胶水层/接入层/API层”的服务,调用后台团队提供的若干个微服务,将微服务的结果进行逻辑组装,从而包装出对外的 API。
lucifer210
2021/05/10
9870
微服务前端数据加载的最佳实践
【前端探索】图片加载优化的最佳实践
图片加载的优化,是前端性能优化中,最划算的一项工作,往往工作量和难度都不大,但却能给页面性能带来极大极大的提升。
luciozhang
2023/04/22
7040
【前端探索】图片加载优化的最佳实践
Kerberos 身份验证在 ChunJun 中的落地实践
Kerberos,在古希腊神话故事中,指的是一只三头犬守护在地狱之门外,禁止任何人类闯入地狱之中。
袋鼠云数栈
2022/12/16
1.6K0
PyTorch 最佳实践:模型保存和加载
PyTorch模型保存和加载有两种方法,官方最佳实践指南推荐其中一种,但似乎效果没啥区别。最近做模型量化,遇到一个意外的错误,才理解了最佳实践背后的原理,以及不遵循它可能会遇到什么问题。
McGL
2020/09/21
1.9K0
Jenkins 在 Kubernetes 上的最佳实践
Jenkins 是由 Java 编写的编排引擎,在 Full GC 时会 Stop The World(STW)。在大规模构建时,STW 可能会导致 Jenkins 无法处理新的请求。
陈少文
2021/06/05
1.1K0
BFF模式:微服务前端数据加载的最佳实践?
设想一个场景,你需要使用微服务构建电子商务应用程序。你可以为客户、订单、产品、购物车等提供微服务,微服务暴露 API 给前端使用。
winty
2021/04/29
1.9K0
BFF模式:微服务前端数据加载的最佳实践?
作者|Viduni Wickramarachchi 译者|吴留坡 策划|田晓旭 设想一个场景,你需要使用微服务构建电子商务应用程序。你可以为客户、订单、产品、购物车等提供微服务,微服务暴露 API 给前端使用。 但是,微服务提供给前端的数据可能不会按照前端需要的方式进行编排或过滤。 这种情况下,前端需要一些逻辑来重新处理这些数据,同时在用户端使用这样的逻辑会占用更多的浏览器资源。 在这样的情况下,我们可以使用 BFF 将一些前端逻辑转移到中间层,中间层就是 BFF。当前端请求一些数据时,它将调用 BFF 中
深度学习与Python
2023/04/01
7080
BFF模式:微服务前端数据加载的最佳实践?
前后端分离后,RESTful API 最佳实践
它的大原则容易把握,但是细节不容易做对。本文总结 RESTful 的设计细节,介绍如何设计出易于理解和使用的 API。
芋道源码
2019/05/21
9470
前后端分离后,RESTful API 最佳实践
swagger 在 egg 项目中的最佳实践
swagger 是一个 RESTful 接口的基于 YAML、JSON 语言的文档和代码在线自动生成工具,它让部署管理 API 变得前所未有的简单。swagger 在 java 界广为使用,其他语言同样可以方便地集成使用。本文以基于 node.js 的企业级应用框架 egg.js 为例,集成 swagger 以根据函数注释自动生成接口文档。
CS逍遥剑仙
2021/05/24
3.7K0
干货 | DevSecOps在携程的最佳实践
作为业务覆盖机票、酒店、度假、汽车票、火车票、支付等各个方面,为全球用户提供服务的在线旅游网站,携程每周都会有数以万计的应用发布次数,如何保证每一次发布代码的安全性成为了DevSecOps实践中最大的挑战。
携程技术
2020/07/14
2.5K0
linux如何查看所有的用户和组信息?
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/112960.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/08
6.9K0
linux如何查看所有的用户和组信息?
6个增加Salesforce用户采用率的最佳实践
想象下这个场景:你的公司正在实施Salesforce,作为一个系统管理员,你非常兴奋你所做的工作可以让Salesforce促进团队的工作。你导入数据,自定义接口,并根据用户的需求拓展新的功能。你还创建了很多自定义报表并设计了很多完美的仪表盘。你已经向主管演示了系统,他们很满意——你的经理也很喜欢你。你满怀信心并渴望分享你的专家经验,你推广系统并希望听到生产力和关键指标有很大突破的消息。但是很可惜你听到的并不是这些。
臭豆腐
2019/04/16
6000
一条命令查询所有mysql用户的授权信息
大大刺猬
2023/06/29
5301
一条命令查询所有mysql用户的授权信息
点击加载更多

相似问题

存储用户信息的最佳实践

10

返回用户信息的最佳实践

15

用户身份验证最佳实践

31

存储Facebook用户信息最佳实践?

19

在Redis中存储用户信息的最佳实践

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文