C# ado.net数据库连接池,使用长连接访问数据库
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数据库连接池,使用长连接访问数据库相关推荐
- 数据库连接池之自定义连接池(mysql)
数据库连接池之自定义连接池(mysql) 上一篇博文是"基于mysql的JDBC的增删改查的封装":点击可查看 今天本仙在昨天JDBC封装增删改查的基础上实现自定义的数据库连接池: ...
- 针对数据库连接池到DRDS连接探活的优化
简介: 针对数据库连接池到DRDS连接探活的优化 1. 问题背景 近期在给某专有云客户进⾏云产品应⽤性能优化分析时,发现了⼀个有趣的关于DRDS使⽤层⾯的问题,这⾥给⼤家分享⼀下. 使⽤过DRDS产品 ...
- pdo sqlite_ sqlite2 pdo_mysql_PHP数据库连接篇,PDO连接sqlite数据库,Sqlite安装使用说明!(PHP+Sqlite2和PHP+Sqlite3)...
PHP+Sqlite2和PHP+Sqlite3 PHP数据库连接篇,PDO连接sqlite数据库,Sqlite安装使用说明! SQLite是一种轻量级的关系型数据库,可以内嵌在我们的应用程序中一起发布 ...
- 必须知道的ADO.NET 数据库连接池
http://www.cnblogs.com/liuhaorain/archive/2012/02/19/2353110.html 题外话 通过前几章的学习,不知道大家对ADO.NET有一定的了解了没 ...
- 数据库连接池和Tomcat连接池的配置问题
在做系统优化的时候师哥给我们提了一个连接池的概念,问我们有没有配置,我对这个概念一无所知,于是进行了一些研究,连接池有很多,比如WCF.EF还有数据库.CAS也可以配连接池,这些连接池用通俗的语言来说 ...
- 数据库连接池 ( 四 ) Druid 连接池
3.2.Druid 连接池 Druid:Druid不仅是一个数据库连接池,还包含一个ProxyDriver.一系列内置的JDBC组件库.一个SQL Parser. 支持所有JDBC兼容的数据库,包括O ...
- c#.net配置mysql数据库连接池_C#MySQL连接池
我正在使用C#多线程应用程序并使用 MySQL与整个应用程序的单一连接.但是当两个或多个线程同时尝试访问数据库时,我得到以下错误: There is already an open DataReade ...
- php oracle数据库连接池,数据库管理Oracle 连接池信息的修改
最近项目中用到的Oracle数据库在服务器上是建了多个表空间供不同系统使用,两个系统同时在使用过程中,正在开发的一个项目在测试运行时,时不时就出现连接池满了,连接不上的问题,为此查了下怎么修改Orac ...
- druid连接池mysql5.7_Spring Boot 使用Druid连接池整合Mybatis-Plus连接Mysql数据库
一.连接池 在普通的数据库访问程序中,客户程序得到的连接对象是物理连接,调用连接对象的close()方法将关闭连接,而采用连接池技术,客户程序得到的连接对象是连接池中物理连接的一个句柄,调用连接对象的 ...
- javaweb使用 数据库连接池 DBCP,实现对数据库驱动使用优化,多个 action共用一个数据库连接
本文着重理解DBCP以及连接池基本运行原理(步骤) 首先我们要知道在连接数据库时 如果频繁的对数据库进行连接,然后又将它释放,对项目的访问效率是一种绝对的降低, 因为在这个过程中,连接(校验密码用户名 ...
最新文章
- PoE供电中功率损耗问题
- mysql查询当前use的数据库
- Fabric 学习笔记-架构初探
- 【Python Flask】SQLAlchemy增删改查总结;不重复查询某一列
- FAT32和NTFS的区别
- 在leangoo里怎么添加泳道?
- [数据结构] 左偏树
- java视频教程 设计模式,Gof设计模式视频课程(Java实现)
- db2数据库常见问题处理
- SQL Server 2008 远程过程调用失败的问题解决方法
- 在Windows7 系统上部署DNS服务器
- 数据分析利器 —— 列式储存数据库
- 进入51.com个人主页
- 118 Servlet_1 _Tomcat服务器
- ubuntu18.0404 aws 云服务器启动和登陆 windows 虚拟机
- SMA SAMBA NFS 共享文件
- 【LSSVM分类】基于matlab灰狼算法优化LSSVM分类(多输入多分类)【含Matlab源码 1558期】
- UCOSii的任务切换
- 2022-2028年全球与中国固体拦截器行业发展趋势及投资战略分析
- 蒙牛200亿奥运营销赌得有点大