• 18056错误


    image

    根据报错日志找到连接池崩掉了;

    超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。

    查看哪些是读的较多的语句:

    SELECT
        SPID                = er.session_id 
        ,STATUS             = ses.STATUS 
        ,[LOGIN]            = ses.login_name 
        ,HOST               = ses.host_name 
        ,BlkBy              = er.blocking_session_id 
        ,DBName             = DB_NAME(er.database_id) 
        ,CommandType        = er.command 
        ,SQLStatement       = st.text 
        ,ObjectName         = OBJECT_NAME(st.objectid) 
        ,ElapsedMS          = er.total_elapsed_time 
        ,CPUTime            = er.cpu_time 
        ,IOReads            = er.logical_reads + er.reads 
        ,IOWrites           = er.writes 
        ,LastWaitType       = er.last_wait_type 
        ,StartTime          = er.start_time 
        ,Protocol           = con.net_transport 
        ,ConnectionWrites   = con.num_writes 
        ,ConnectionReads    = con.num_reads 
        ,ClientAddress      = con.client_net_address 
        ,Authentication     = con.auth_scheme 
    FROM sys.dm_exec_requests er 
    OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st 
    LEFT JOIN sys.dm_exec_sessions ses 
    ON ses.session_id = er.session_id 
    LEFT JOIN sys.dm_exec_connections con 
    ON con.session_id = ses.session_id 
    WHERE er.session_id > 50 
    ORDER BY er.blocking_session_id DESC,er.session_id

    分析过程:
    如IIS的连接池设置1500M,IIS连接数据正常1500个,那么每个session分到的连接池大小平均1MB,
    数据库网络数据包默认是4096;
    如果这个时候有个请求需要返回20M数据,那么这个session从数据库返回的数据包大小就要超过session
    获得的连接池大小,数据包是4096,比正常的请求(请求1M的回话)就需要多的数据包传递,这个session对应的
    回话保持时间就需要比平均水平长些,正常情况下,这些独大的请求不会有太大问题.
    如果同一时刻,IIS的请求数达到3000,每个SESSION分到的连接池大小平均值就会0.5MB,如果同样返回20MB数据,
    那么SESSION的时间就会更长!
    如果这个时候客户端请求返回100个30M数据,那么此时的请求,当数据库返回给IIS时,IIS会发现连接池没有足够的内存空间
    分配这个SESSION,此时IIS的连接池大小不会随着客户端请求的增加而自动增加或IIS服务器没有更多的物理内存,此时IIS就会
    因为没有足够的连接池空间分配来缓存对应的SESSION,但是后续的客户端回话还是不停的向IIS申请,这个时候问题就来啦!
    IIS会释放掉(或IIS进程down掉或IIS自动重启)没法处理的SESSION,当数据库收到IIS端SESSION请求查询出数据准备返回给
    IIS的SESSION时,去寻找对应请求的SPID,发现该请求的SPID已经不存在,但是数据库的TCP连接不会因为SPID的不存在立即抛弃这些
    数据,此时网卡的流量会增加!同时数据库ERRORLOG里全是这种错误.
    解决办法:
    0.首先排除DB是否有死锁

    1.最直接的办法就是增加IIS连接池大小

    2.就是找出程序中大的会话请求,修改代码


    3.限制IIS进程数上限,根据日常运行情况设置连接池大小(不推荐,迫不得已)

    4.数据库端限制sql回话时常:SQL防火墙或数据库限制长连接(不推荐,迫不得已,没办法的办法)

    根据原博客解决问题:http://blog.csdn.net/yangzhawen/article/details/8209167

  • 相关阅读:
    Java 中无参带返回值方法的使用
    Java 中无参无返回值方法的使用
    如何定义 Java 中的方法
    Java 中的二维数组
    使用 foreach 操作数组
    使用 Arrays 类操作 Java 中的数组
    如何使用 Java 中的数组
    Java 循环语句之多重循环
    UML常用图的几种关系的总结
    JAVA 对象引用,以及对象赋值
  • 原文地址:https://www.cnblogs.com/kingwwz/p/5780420.html
Copyright © 2020-2023  润新知