300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > C# ado.net数据库连接池 使用长连接访问数据库

C# ado.net数据库连接池 使用长连接访问数据库

时间:2021-09-17 12:30:45

相关推荐

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}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。