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;u;
        //数据库链接对象
        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);
            }
        }
 
        //查询,获取DataReader
        public  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     }