1、当SqlDataReader没有关闭之前,数据库连接会一直保持open状态,所以在使用SqlDataReader时,使用完毕应该马上调用SqlDataReader.Close()关闭它。

2、一个连接只能被一个SqlDataReader使用,这也是为什么要尽早关闭SqlDataReader的原因。
3、使用完SqlDataReader后,你可以在程序中显示的调用数据库连接对象的Close方法关闭连接,也可以在调用Command对象的ExecuteReader方法时传递CommandBehavior.CloseConnection 这个枚举变量,这样在调用SqlDataReader的Close方法时会自动关闭数据库连接。
4、使用SqlDataReader时尽量使用和数据库字段类型匹配的方法来取得相应的值,比如对于整形的字段使用GetInt32,对字符类型的字段使用GetString。这样会减少因为类型不一致而额外增加的类型转换操作。
5、使用SqlDataReader获取多条记录时,如果没有访问到取出记录的末尾时想要关闭SqlDataReader,应该先调用Command对象的Cancel方法,然后再调用SqlDataReader的Close方法。Command对象的Cancel方法使得数据库不再把SqlDataReader中未访问的数据发送到调用端,如果不调用此方法直接关闭SqlDataReader,数据库会发送和SqlDataReader未访问数据等长的空数据流到调用端。
6、如果想通过SqlCommand的ExecuteReader方法获取存储过程的返回值或者输出参数,必须先调用SqlDataReader的Close方法后,才能获取输出参数的值或者返回值。
7、如果使用SqlDataReader只返回一条记录,那么在调用Command的ExecuteReader方法时,指定
CommandBehavior.SingleRow参数,这个参数的是否使用对SQL Server .NET Data Provider没有什么影响,但是当你使用OLE DB .NET Data Provider时,指定这个参数后,DataPrivider内部将使用IRow接口,而不是使用相对来说耗费资源的IRowSet接口。

这部分来自其他网上资料,但是自己测试却发现真实情况不是这样。

本人这样测试,数据库操作类做长连接,也就是整个客户端程序只用一个数据库连接保持打开不关闭。客户端开启三个不同线程通过该打开的数据库连接获取数据,使用dataRead,用后不关闭dataRead和数据连接,未见异常,程序内存没有变大,数据库会话也只有一个。

数据库操作类

 /// <summary>/// 数据库操作类/// </summary>class DBHelper{//长连接是否打开bool connet = false;public  string connstr = "Data Source=ORCL;uid=admin;pwd=jxdflp";//数据库链接对象private  OracleConnection Conn = null;public DBHelper(){InitConnection();Thread tr=new Thread(testConncet);tr.IsBackground=true;tr.Start();}//初始化数据库链接private  void InitConnection(){try{//如果连接对象不存在,创建连接if (Conn == null)Conn = new OracleConnection(connstr);//如果连接对象关闭,打开连接if (Conn.State == ConnectionState.Closed)Conn.Open();//如果连接中断,重启连接if (Conn.State == ConnectionState.Broken){Conn.Close();Conn.Open();}connet = true;}catch (Exception ex){ClassVar.WriteErrorLog(ex.ToString());}}//测试长连接线程private void testConncet(){while (true){try{string sql = "select 1 from dual";OracleDataReader read = GetDataReader(sql);if (read.Read()){connet = true;}else{connet = false;InitConnection();}}catch (Exception ex){ClassVar.WriteErrorLog(ex.ToString());}Thread.Sleep(100);}}//查询,获取DataReaderpublic  OracleDataReader GetDataReader(string sqlStr){OracleDataReader read=null;try{OracleCommand cmd = new OracleCommand(sqlStr, Conn);read= cmd.ExecuteReader();}catch (Exception ex){ClassVar.WriteErrorLog(ex.ToString());}return read;}}

界面类

 1  public partial class Form1 : Form
 2     {
 3
 4         DBHelper db;
 5         public Form1()
 6         {
 7             InitializeComponent();
 8
 9             db = new DBHelper();
10             Thread tr = new Thread(test);
11             tr.IsBackground = true;
12             tr.Start();
13
14             Thread tr1 = new Thread(test2);
15             tr1.IsBackground = true;
16             tr1.Start();
17
18             Thread tr2 = new Thread(test3);
19             tr2.IsBackground = true;
20             tr2.Start();
21         }
22
23
24         private void test()
25         {
26             while (true)
27             {
28                 string sql = "select * from JZFWXX t";
29                 OracleDataReader read=  db.GetDataReader(sql);
30                 Thread.Sleep(5);
31             }
32         }
33
34         private void test2()
35         {
36             while (true)
37             {
38                 string sql = "select * from JZRXX t";
39                 OracleDataReader read = db.GetDataReader(sql);
40                 Thread.Sleep(5);
41             }
42         }
43
44         private void test3()
45         {
46             while (true)
47             {
48                 string sql = "select * from MJSBXX t";
49                 OracleDataReader read = db.GetDataReader(sql);
50                 Thread.Sleep(5);
51             }
52         }
53     }

转载于:https://www.cnblogs.com/KQNLL/p/8478160.html

C# ado.net数据库连接池,使用长连接访问数据库相关推荐

  1. 数据库连接池之自定义连接池(mysql)

    数据库连接池之自定义连接池(mysql) 上一篇博文是"基于mysql的JDBC的增删改查的封装":点击可查看 今天本仙在昨天JDBC封装增删改查的基础上实现自定义的数据库连接池: ...

  2. 针对数据库连接池到DRDS连接探活的优化

    简介: 针对数据库连接池到DRDS连接探活的优化 1. 问题背景 近期在给某专有云客户进⾏云产品应⽤性能优化分析时,发现了⼀个有趣的关于DRDS使⽤层⾯的问题,这⾥给⼤家分享⼀下. 使⽤过DRDS产品 ...

  3. pdo sqlite_ sqlite2 pdo_mysql_PHP数据库连接篇,PDO连接sqlite数据库,Sqlite安装使用说明!(PHP+Sqlite2和PHP+Sqlite3)...

    PHP+Sqlite2和PHP+Sqlite3 PHP数据库连接篇,PDO连接sqlite数据库,Sqlite安装使用说明! SQLite是一种轻量级的关系型数据库,可以内嵌在我们的应用程序中一起发布 ...

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

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

  5. 数据库连接池和Tomcat连接池的配置问题

    在做系统优化的时候师哥给我们提了一个连接池的概念,问我们有没有配置,我对这个概念一无所知,于是进行了一些研究,连接池有很多,比如WCF.EF还有数据库.CAS也可以配连接池,这些连接池用通俗的语言来说 ...

  6. 数据库连接池 ( 四 ) Druid 连接池

    3.2.Druid 连接池 Druid:Druid不仅是一个数据库连接池,还包含一个ProxyDriver.一系列内置的JDBC组件库.一个SQL Parser. 支持所有JDBC兼容的数据库,包括O ...

  7. c#.net配置mysql数据库连接池_C#MySQL连接池

    我正在使用C#多线程应用程序并使用 MySQL与整个应用程序的单一连接.但是当两个或多个线程同时尝试访问数据库时,我得到以下错误: There is already an open DataReade ...

  8. php oracle数据库连接池,数据库管理Oracle 连接池信息的修改

    最近项目中用到的Oracle数据库在服务器上是建了多个表空间供不同系统使用,两个系统同时在使用过程中,正在开发的一个项目在测试运行时,时不时就出现连接池满了,连接不上的问题,为此查了下怎么修改Orac ...

  9. druid连接池mysql5.7_Spring Boot 使用Druid连接池整合Mybatis-Plus连接Mysql数据库

    一.连接池 在普通的数据库访问程序中,客户程序得到的连接对象是物理连接,调用连接对象的close()方法将关闭连接,而采用连接池技术,客户程序得到的连接对象是连接池中物理连接的一个句柄,调用连接对象的 ...

  10. javaweb使用 数据库连接池 DBCP,实现对数据库驱动使用优化,多个 action共用一个数据库连接

    本文着重理解DBCP以及连接池基本运行原理(步骤) 首先我们要知道在连接数据库时 如果频繁的对数据库进行连接,然后又将它释放,对项目的访问效率是一种绝对的降低, 因为在这个过程中,连接(校验密码用户名 ...

最新文章

  1. PoE供电中功率损耗问题
  2. mysql查询当前use的数据库
  3. Fabric 学习笔记-架构初探
  4. 【Python Flask】SQLAlchemy增删改查总结;不重复查询某一列
  5. FAT32和NTFS的区别
  6. 在leangoo里怎么添加泳道?
  7. [数据结构] 左偏树
  8. java视频教程 设计模式,Gof设计模式视频课程(Java实现)
  9. db2数据库常见问题处理
  10. SQL Server 2008 远程过程调用失败的问题解决方法
  11. 在Windows7 系统上部署DNS服务器
  12. 数据分析利器 —— 列式储存数据库
  13. 进入51.com个人主页
  14. 118 Servlet_1 _Tomcat服务器
  15. ubuntu18.0404 aws 云服务器启动和登陆 windows 虚拟机
  16. SMA SAMBA NFS 共享文件
  17. 【LSSVM分类】基于matlab灰狼算法优化LSSVM分类(多输入多分类)【含Matlab源码 1558期】
  18. UCOSii的任务切换
  19. 2022-2028年全球与中国固体拦截器行业发展趋势及投资战略分析
  20. 蒙牛200亿奥运营销赌得有点大

热门文章

  1. PCB SQL SERVER 枚举分割函数(枚举值分解函数)
  2. Java Map在遍历过程中删除元素
  3. vue.js把mounted里面的变量传到data里面
  4. Sublime Text 3中配置Python3的开发环境
  5. 磁盘阵列 RAID 技术原理详解
  6. Qt: 非阻塞时间延迟;
  7. 在sqlserver sql语句中查找速度快
  8. curl模拟http请求
  9. Python编码格式导致的csv读取错误
  10. Windows PowerShell是啥?看完本文你就懂它了