ado长连接mysql_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和数据连接,未见异常,程序内存没有变大,数据库会话也只有一个。

数据库操作类

///

///数据库操作类///

classDBHelper

{//长连接是否打开

bool connet = false;public string connstr = "Data Source=ORCL;uid=admin;pwd=jxdflp";//数据库链接对象

private OracleConnection Conn = null;publicDBHelper()

{

InitConnection();

Thread tr=newThread(testConncet);

tr.IsBackground=true;

tr.Start();

}//初始化数据库链接

private voidInitConnection()

{try{//如果连接对象不存在,创建连接

if (Conn == null)

Conn= newOracleConnection(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 voidtestConncet()

{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);

}

}//查询,获取DataReader

public OracleDataReader GetDataReader(stringsqlStr)

{

OracleDataReader read=null;try{

OracleCommand cmd= newOracleCommand(sqlStr, Conn);

read=cmd.ExecuteReader();

}catch(Exception ex)

{

ClassVar.WriteErrorLog(ex.ToString());

}returnread;

}}

界面类

1 public partial classForm1 : Form2 {3

4 DBHelper db;5 publicForm1()6 {7 InitializeComponent();8

9 db = newDBHelper();10 Thread tr = newThread(test);11 tr.IsBackground = true;12 tr.Start();13

14 Thread tr1 = newThread(test2);15 tr1.IsBackground = true;16 tr1.Start();17

18 Thread tr2 = newThread(test3);19 tr2.IsBackground = true;20 tr2.Start();21 }22

23

24 private voidtest()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 voidtest2()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 voidtest3()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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值