今天踩了一个坑,用了一个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. 005-文件权限解说、授权chmod和chown命令的用法

    一.文件权限说明 1.1.linux 中 drwxr-xr-x权限含义 在 linux drwxr-xr-x意思如下: 第一位表示文件类型.d是目录文件,l是链接文件,-是普通文件,p是管道. 后面的 ...

  2. 问题root@localhost's password:localhost:permission denied,please try again

    转载:https://www.cnblogs.com/hmy-blog/p/6500909.html 经过试验,上述方法在我的电脑中没有成功. 1.安装 open ssh:sudo apt-get i ...

  3. Git(2):基本操作

    Git 创建仓库 执行<git init>命令后,Git仓库会生成一个.git目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(Git 只在仓库的根目录生成 .git 目录). ...

  4. Dell 12V/18A电源适配器接口改造

    手头有几个航模用的充电器,原来一直用实验室电源,不方便移动,为了便携省地方,就想配个合适的电源.在网上找了下,航模专用的适配器价格太高,国产的杂牌适配器功率虚标严重并且可靠性是个问题,工业用的电源基本 ...

  5. flask 之(七) --- 认证|文件|部署

    登陆注册 说明: 令牌Token认证,在对HTTP形式的API发请求时,大部分情况我们不是通过用户名密码做验证,而是通过一个令牌[Token来做验证]. RESTful API无法使用Flask-Lo ...

  6. 【POJ - 1970】The Game(dfs)

    -->The Game 直接中文 Descriptions: 判断五子棋棋局是否有胜者,有的话输出胜者的棋子类型,并且输出五个棋子中最左上的棋子坐标:没有胜者输出0.棋盘是这样的,如图 Samp ...

  7. 【JulyEdu-Python基础】第 8 课:Python第三方库

    outline 数值计算 numpy 数据处理分析 pandas 可视化 matplotlib/seaborn 机器学习 Sklearn / keras 交互 pygame 网络 Selen ...

  8. Mysql安装后在服务里找不到和服务启动不起来的解决方法

    一,在安装完Mysql数据库后,发现在控制面板->管理->服务中找不到Mysql的服务启动 解决方法如下:开启命令行,按照如下步骤即可: 1.进入到mysql的安装包,在bin里执行:my ...

  9. kernel32.dll 这个系统模块

    详细解读:远程线程注入DLL到PC版微信 一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一 ...

  10. MySQL_数据类型

    目录 整型 浮点型 定点数类型 日期时间型 字符型 M为最大值,D为精度值 整型 数据类型 存储范围 字节 tinyint 有符号值:-128到127(-27到27-1) 无符号值:0到255(0到2 ...