• ADO.net 数据库连接new SqlConnection、Open、Close、Dispose


    今天踩了一个坑,用了一个static对象,存储了Connection,导致了并发量大时(35/s)出现单个连接的数据库请求堆积,以及并发Open导致的异常,最终使服务下线。
    排查中发现有些概念不清的地方,做了一下梳理。

    1、在项目启动后,首次获取数据库连接的时候(SqlConnection conn = new SqlConnection(strConnection)),ADO.net会创建一个连接池(连接数量可用Min Pool Size设定),并返回一个连接。
    2、在拿到连接后,需打开连接(Connection.Open()),才可以进行数据库操作。但注意未Close时,调用2次Open会报异常。
    3、在操作完成后,必须要关闭连接(Connection.Close()),将连接还回连接池中。调用多次Close()是不会报异常的。
    4、若还有查询操作,可以重新Open,并进行操作。
    5、操作完记得Close。
    6、最后在完全使用完毕后,调用Connection.dispose(),将conn对象置null(但此时物理连接并没有释放,而是存在于连接池中)。
    7、当并发数较多,连接池中的连接数不够用时,会创建新的链接,但当达到连接池的Max Pool Size时,会进行等待,等待可通过SqlConnection.ConnectionTimeout设置超时时间。
    8、当服务停止时,会将连接池中的物理连接释放;或可通过将Pooling设置为True,调用close的时候就会释放物理连接。

    close和dispose的异同:
    1、close是关闭连接,会将连接还回连接池,dispose也一样
    2、dispose是对close的调用,额外的操作是将Connection置null。

    原本的构想是很美好的,想要控制对同一个库的链接数,尽量使用一个连接进行操作,不用重新new Connection对象,较少部分消耗(但实际的大部分消耗是在Open、close上)。
    但是没考虑到并发数多的情况。还是测试不到位,考虑不周全。

    参考:http://blog.csdn.net/gtosky4u/article/details/48970453

  • 相关阅读:
    Hadoop学习笔记(九)HDFS架构分析
    Hadoop学习笔记(九)HDFS架构分析
    Hadoop学习笔记(八)MapReduce深入分析
    Hadoop学习笔记(八)MapReduce深入分析
    Hadoop学习笔记(七)
    Hadoop学习笔记(七)
    Hadoop学习笔记(六)启动Shell分析
    Hadoop学习笔记(六)启动Shell分析
    「2018-11-05模拟赛」T5 传送机 解题报告
    NOIP 2018 普及组 解题报告
  • 原文地址:https://www.cnblogs.com/shanelau/p/6430837.html
Copyright © 2020-2023  润新知