zoukankan      html  css  js  c++  java
  • 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);
                }
            }
     
            //查询,获取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     }
  • 相关阅读:
    jsonp跨域请求
    jQuery之异步Ajax请求使用
    table表格cellspacing与cellpadding属性
    常用正则匹配
    插入数据显示 Duplicate entry '4913' for key 'user_id'
    事件驱动模型 IO多路复用 阻塞IO与非阻塞IO select epool
    python 协程
    python 进程 线程
    python 并发socketserver模块
    python 网络 socket
  • 原文地址:https://www.cnblogs.com/KQNLL/p/8478160.html
Copyright © 2011-2022 走看看