今天踩了一个坑,用了一个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

ADO.net 数据库连接new SqlConnection、Open、Close、Dispose的更多相关文章

  1. ADO.Net数据库连接字符串、DbProviderFactory

    一.ADO.Net数据库连接字符串 1.OdbcConnection(System.Data.Odbc) (1)SQL Sever 标准安全:" Driver={SQL Server}; S ...

  2. 必须知道的ADO.NET 数据库连接池

    http://www.cnblogs.com/liuhaorain/archive/2012/02/19/2353110.html 题外话 通过前几章的学习,不知道大家对ADO.NET有一定的了解了没 ...

  3. ado.net中的 sqlconnection sqlcommand datareader dataset SqlDataAdapter之间的关系

    Connection: 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能够知道是 ...

  4. C# ADO.net 数据库连接池

    前一阵开发一套系统,同组的同事提供了一个数据库连接组件,是他自己封装的,使用了自定义的连接池,用着很是不爽,而且经常会因为程序不严谨的原因,导致连接池里的连接被用完,也导致其他错误,因此我想自己研究一 ...

  5. C# 根据ADO.NET数据库连接字符串构建EntityFrame数据库连接字符串

    为了保持开发效率,以及保持代码优雅,项目中引用了EntityFrame.但是又因为某些报表功能需要大量计算,所以又要求直接使用ADO.NET,调用存储过程进行计算. 于是乎webconfig文件中就会 ...

  6. ado.net 数据库连接的两方式种

    DataAdapter: string connectionString = "data source=127.0.0.1;Database=dong;user id=sa;password ...

  7. 数据库学习任务二:数据库连接对象SqlConnection

    数据库应用程序的开发流程一般主要分为以下几个步骤: 创建数据库 使用Connection对象连接数据库 使用Command对象对数据源执行SQL命令并返回数据 使用DataReader和DataSet ...

  8. ado.net 用c#与数据库连接实现增删改查

    ADO.NET: 数据访问技术 就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 是所有数据访问技术的基础 ...

  9. ADO.NET学习系列(一)

    一.ADO.NET基础 程序和数据库交互,要通过ADO.NET进行:通过ADO.NET就能在数据库中执行SQL了.ADO.NET中提供了对不同数据库的统一操作接口(ODBC).另外还有一种操作数据库的 ...

随机推荐

  1. requestLibrary API

    requestLibrary API Keyword Arguments Documentation Create Ntlm Session alias, url, auth, headers={}, ...

  2. Linux服务器集群性能监控之Performance Co-Pilot(PCP)部署

    转载自:https://blog.csdn.net/w84268426/article/details/78431778 在部署PCP时,我用到了两台cent os 7虚拟机. 1.官方安装文档htt ...

  3. SAP JCO3配置

    windows 环境设置 1.sapjco3.dll 需要与 sapjco3.jar 在同一目录 2.设置系统环境变量,将sapjco3所在目录加入系统环境变量 例如: 新建环境变量 变量名: JAV ...

  4. React Native初始化项目0.47.1报错

    首先看一下安卓和iOS报错: iOS终端运行报错: Xcode运行报错: 解决办法一: 将版本降到0.44.3,修改package,具体请看我的另一篇博客: http://www.cnblogs.co ...

  5. What's binary search?

    Binary Search: Search a sorted array by repeatedly  dividing the search interval in half. Begin with ...

  6. vue父组件如何向子组件中传递数据?

    原文地址 props传参 父组件: <template> <parent> <child :list="list"></child> ...

  7. JAVA各种框架插件常用端口:redis、MySQL、rabbitmq、elasticsearch、tomcat等等

    默认端口号 应用 21 FTP(文件传输) 22 SSH(安全登录).SCP(文件传输).端口重定向 23 Telnet(远程登录) 80 HTTP服务器 1433 SQL Server数据库serv ...

  8. USACO 1.1 Greedy Gift Givers

    模拟. 如果用$map$的话,会很好写. 如果你不会$map$的话,在此小广告:https://blog.csdn.net/CQBZLYTina/article/details/80063739 /* ...

  9. JAVA -----------交互式程序

    2.6交互式程序 如果程序能在执行期间交互地从用户输入中读取数据,就可使程序每执行一次时计算出新结果,并且新结果取决于输入数据.这样的程序才具有实用性. 2.6.1 Scanner类 Scanner类 ...

  10. vue60秒倒计时

    wait:"60", content:"验证码", canClick: true, daojishi(){ if(!this.canClick) return ...