zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    发布(Windows)
    Parallel并行编程
    query通用开源框架
    深入了解三种针对文件(JSON、XML与INI)的配置源
    GitLab CI
    雅思创始人Keith Taylor谈英语学习
    查看内存使用情况
    Reverse String
    分布式消息系统jafka快速起步(转)
    深入浅出 消息队列 ActiveMQ(转)
  • 原文地址:https://www.cnblogs.com/shanelau/p/6430837.html
Copyright © 2011-2022 走看看