超时时间已到,但是尚未从池中获取连接异常捕获及解决办法

在使用连接池进行数据库连接时,我们经常会遇到"超时时间已到,但是尚未从池中获取连接"这个异常。虽然这个异常很难复现,但我们希望能够全局捕获该异常,并给出一个友好的提示。但问题是,我们不清楚这个异常属于哪种类型,有些人说它属于InvalidOperationException异常。因此我想请教各位大佬们是否有更好的解决办法。

首先,让我们来看一下对应的英文错误信息:

Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

然而,即使在极端情况下,这种情况仍然会发生。现在,我们只是想拦截这个异常并给出一个友好的提示。一种解决办法是通过Exception.Message进行拦截。

下面是一个示例代码,展示了如何在全局捕获该异常并给出友好提示:

示例代码

public class Sg1ExceptionFilterAttribute : ExceptionFilterAttribute{    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {        if (actionExecutedContext.Exception is InvalidOperationException || actionExecutedContext.Exception is Sq1Exception)
        {
            actionExecutedContext.Response = actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "请稍后重试");
        }        
        base.OnException(actionExecutedContext);
    }
}

通过继承ExceptionFilterAttribute类,我们可以自定义异常过滤器来捕获特定类型的异常。在上述代码中,我们判断异常是否属于InvalidOperationException或Sq1Exception,如果是,则将响应设为一个带有"请稍后重试"消息的错误响应。最后,调用基类的OnException方法,以确保异常继续传播到其他可能的异常处理程序。

这种方式能够有效地捕获并处理该异常,同时给用户提供了一个友好的提示信息,让他们知道发生了连接池超时的情况,并建议稍后重试。

总结一下,对于"超时时间已到,但是尚未从池中获取连接"这个异常,我们可以通过编写一个自定义的异常过滤器来全局捕获并处理该异常。这样能够提供更好的用户体验,并提示用户稍后重试。同时,我们也提供了一种通过拦截Exception.Message的解决办法。

解决思路

一、看所有open的连接是否都close了。

二、如果访问量很大,加上Max Pool Size=512这一句,当然这是要以损失系统性能为代价的! 这样以后一定可以解决你的问题!

解决方案

解决方案一

我想原因可能是并发操作。DataReader是独占连接的,就是说你的程序可能设计上有问题。比如说最大连接设100,假设有100个人同时使用 DataReader正在读取数据库内容,那么当第101人读取的时候,连接池中的连接已经没有了,就会出现上面的错误。DataReader是独占连接 的,每个DataReader都要占用一个连接。当然这个情况是偶尔出现的,所以会很长时间出现一次,因为只有同时有超过连接池最大连接数量的并发操作才会发生。而且你加大并发数量只能暂时缓解问题,如果你加大到200个并发连接,如果有201 人同时操作怎么办?你说了你使用Connection对象的Close()方法,这是不行的,因为Close()方法仅仅是关闭连接,但这个连接没有释放,还是被这个对象占用,要释放必须使用Connection的Dispose()方法显式释放连接才可以,否则这个对象占用的连接只能等到垃圾收集的情 况下才能被释放。这种情况肯定会出现“超时时间已到”的错误。

解决方法

解决方案一

  1. 修改几个关键页面或访问比较频繁的数据库访问操作,使用DataAdapter和DataSet来获取数据库数据,不要使用DataReader。

  2. 在访问数据库的页面上使用数据缓存,如果页面的数据不是经常更新(几分钟更新一次)的话,使用Cache对象可以不用访问数据库而使用缓存中的内容,那么可以大大减少连接数量。

  3. 修改代码,把使用Connection对象的地方都在Close()后面加上Dispose()调用。

  4. 建议对数据库操作进行大的修改,建立自己的数据库操作代理类,继承

System.IDisposable接口,强迫释放资源,这样就不会出现连接数量不够的问题了。

解决方案二

WEB.config 里面:在数据库连接加 Max Pool Size = 512;server=local;uid=;pwd=;database=2004;Max Pool Size = 512;">一劳永逸。 解决方案三

估计是连接(Connection)对象没有Close。倒是不必Dispose,而DataReader用完后应该关闭,但不关闭也没问题,只是不关闭的话此连接对象就一直不能用,只要你最终关闭了连接对象就不会出问题。 连接对象在Open后的操作都放在try块中,后面跟一个finally块:conn.Close();文章来源地址https://www.toymoban.com/diary/problem/646.html

到此这篇关于超时时间已到,但是尚未从池中获取连接异常捕获及解决办法的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/problem/646.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
Python列表转字典:如何将列表中的数据循环装进字典并加以键值?
上一篇 2023年12月30日 14:56
解决k8s pod无法启动:"unable to init seccomp"问题,附带详细步骤和原因分析
下一篇 2023年12月31日 12:26

相关文章

  • mysql Dbeaver连不上(连接数据库超时connect time out),但是navicat能连上

    mysql Dbeaver连不上,但是navicat能连上 现象:连接超时 方案1: 在dbeaver安装目录找到dbeaver.ini添加一行 若方案1改完连接报这个错时 修改连接方式为URL 并带上useUnicode=true参数

    2024年02月04日
    浏览(51)
  • python requests设置连接超时时间

    这段代码的主要作用是使用requests库发出一个GET请求,并设置连接超时时间为5秒钟,读取超时时间为10秒钟。 如果请求超时,就会抛出requests.exceptions.Timeout异常,并在\\\"except\\\"语句块中进行处理。如果发生其他类型的错误,如连接错误,就会抛出requests.exceptions.ConnectionError异常,

    2024年02月13日
    浏览(61)
  • ssh连接linux终端超时时间设置

            当终端通过ssh连接服务器时,如果长时间不操作,终端就会超时而掉线,需要断开ssh重新连接,如果超时时间过短的话,需要频繁的连接终端。         解决方法也很简单,在ssh的配置文件sshd_config中重新设置一下客户端的激活参数就行。ssh配置存在位置 : 修改过

    2024年02月10日
    浏览(49)
  • 设置服务器ssh远程连接时超时关闭的时间

    我们通过ssh远程连接服务器时,如果一段时间客户端没有使用,就会与服务器断开连接。这个断开的时间我们是可以自己的设置的。 以linux centos系统为例, 具体设置方法如下: 找到下面两行 ClientAliveInterval:表示服务器每隔多少时间发送一次请求给客户端,单位为s ClientAl

    2024年02月15日
    浏览(50)
  • springboot配置http连接超时时间主动断开避免产生大量close_wait

    与客户端联调接口,通信方式使用http连接,客户端设置了发起请求后10s就断开连接,然后果不其然,我在服务端这边收到了大量的close_wait状态,最终导致接口不可用。 close_wait产生的原因就是客户端断开了连接但是没有发FIN给到服务端,所以服务端不知道还一直在跟客户端通

    2024年02月16日
    浏览(59)
  • easy Connect连接成功,但是虚拟IP地址获取失败,而导致网页无法打开

    问题:easy Connect连接成功,但是虚拟IP地址获取失败,而导致网页无法打开 1.右键点开easy Connect,选连接状态 出现下面页面,虚拟Ip地址为0.0.0.0,即为虚拟IP地址获取失败 2.检查Sangfor的网络适配器是否有黄色感叹号   右击此电脑,选择属性,选设备管理器,检查网络适配器

    2024年02月09日
    浏览(49)
  • 什么是 MySQL JDBC 连接池中最高效的连接检测语句?

    在回答这个问题之前,首先我们看看 MySQL 中有哪些常用的 JDBC 连接池: c3p0 DBCP Druid Tomcat JDBC Pool HikariCP 这些连接池中,c3p0 是一个老牌的连接池,很多流行框架,在其老版本中,都将 c3p0 作为默认的连接池。 DBCP 和 Tomcat JDBC Pool(Tomcat 的默认连接池)是 Apache 开源的。 Druid

    2024年02月04日
    浏览(46)
  • Mac之SSH连接常用设置-延长连接的超时时间、给‘ssh 用户名@IP地址‘指令起别名等

    Mac 的终端可以直接使用 SSH命令连接远程服务器 ,但是默认情况下连接保持会话的时间很短,需要不断地重新登陆,麻烦;下面可以通过增加 SSH 连接的会话超时时间来解决此问题。相关配置如下: Mac 下使用 SSH命令连接远程服务器 时,每次需要输入 ssh 用户名@IP地址 ;可以针

    2024年02月05日
    浏览(46)
  • 若依框架 - 短时间内断开连接,重复跳转至登录界面问题的解决方法(docker 与 redis)、令牌超时问题

    在很短的时间内不去操作系统,就会自动提示, 登录状态已过期,您可以继续留在该页面,或者重新登录 ,所以老是要跳转到登录界面,这一点很麻烦,非常影响用户体验。 令牌设置超时时间,过于短暂; redis 服务的启动配置文件有问题,没有配置密码登录,而是默认配置

    2024年02月13日
    浏览(34)
  • windows“你尚未连接代理服务器可能有问题”解决方法

    打开控制面板的方法: 1.从任务栏搜索 单击Windows 10任务栏上的搜索按钮。 在搜索框中输入“控制面板”,然后单击顶部的搜索结果。 2.从运行对话框中打开控制面板 按Windows + R快捷键。 在输入框中输入“控制面板”(你也可以只输入control)。 按“确定”按钮。 3.用在命令

    2024年02月04日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包