摘自: http://www.wxphp.com/wxd_0fetn2bw2548fsc2ak8h_1.html

  1. 导读:使用C#数据库连接池,连接到数据库服务器通常由几个需要软长时间的步骤组成,必须与服务器进行初次连接,必须分析连接字符串信息,必须由服务器对连接进行身份验证,大部份的应用程序都是使用一个或几个不同的连接配置,当应用程序的数据量和访问量大的时候,许多相同的连接将反复地被打开和关闭,从而会引起数据库服务器效率低下甚至引发程序崩溃,我们可以在ADO.NET中使用称为连接池的优化方法来管理维护连接,C#
  2.  
  3. 使用c#数据库连接池使用C#数据库连接池
  4.  
  5. 连接到数据库服务器通常由几个需要软长时间的步骤组成。必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次连接,必须分析连接字符串信息,必须由服务器对连接进行身份验证,等等。
  6.  
  7. 实际上,大部份的应用程序都是使用一个或几个不同的连接配置。当应用程序的数据量和访问量大的时候,这意味着在运行应用程序的过程中,许多相同的连接将反复地被打开和关闭,从而会引起数据库服务器效率低下甚至引发程序崩溃。为了确保应用程序的稳定和降低性能成本,我们可以在ADO.NET中使用称为连接池的优化方法来管理维护连接。
  8.  
  9. C#数据库连接池可以减少创建连接的次数。定义最小连接数(固定连接数),当用户在连接上调用Open,连接池就会检查池中是否有可用的连接。如果发现有连接可用,会将该连接返回给调用者,而不是创建新连接。应用程序在该连接上调用Close时,连接池会判断该连接是否在最小连接数之内,如果“是”会将连接回收到活动连接池中而不是真正关闭连接,否则将烧毁连接。连接返回到池中之后,即可在下一个Open调用中重复使用。
  10.  
  11. 创建C#数据库连接池
  12.  
  13. 以下示例使用C#连接SQL数据库:
  14.  
  15. . class DbConn
  16.  
  17. . {
  18.  
  19. . //usingSystem.Data;
  20.  
  21. . //usingSystem.Data.SqlClient;
  22.  
  23. . private const int MaxPool=;//最大连接数
  24.  
  25. . private const int MinPool=;//最小连接数
  26.  
  27. . private const bool Asyn_Process=true;//设置异步访问数据库
  28.  
  29. . //在单个连接上得到和管理多个、仅向前引用和只读的结果集(ADO.NET2.0)
  30.  
  31. . private const bool Mars=true;
  32.  
  33. . private const int Conn_Timeout=;//设置连接等待时间
  34.  
  35. . private const int Conn_Lifetime=;//设置连接的生命周期
  36.  
  37. . private string ConnString="";//连接字符串
  38.  
  39. . private SqlConnection SqlDrConn=null;//连接对象
  40.  
  41. .
  42.  
  43. . public DbConn()//构造函数
  44.  
  45. . {
  46.  
  47. . ConnString=GetConnString();
  48.  
  49. . SqlDrConn=new SqlConnection(ConnString);
  50.  
  51. . }
  52.  
  53. .
  54.  
  55. . private string GetConnString()
  56.  
  57. . {
  58.  
  59. . return"server=localhost;"
  60.  
  61. . +"integratedsecurity=sspi;"
  62.  
  63. . +"database=pubs;"
  64.  
  65. . +"MaxPoolSize="+MaxPool+";"
  66.  
  67. . +"MinPoolSize="+MinPool+";"
  68.  
  69. . +"ConnectTimeout="+Conn_Timeout+";"
  70.  
  71. . +"ConnectionLifetime="+Conn_Lifetime+";"
  72.  
  73. . +"AsynchronousProcessing="+Asyn_Process+";";
  74.  
  75. . //+"MultipleActiveResultSets="+Mars+";";
  76.  
  77. . }
  78.  
  79. .
  80.  
  81. . public DataTable GetDataReader(string StrSql)//数据查询
  82.  
  83. . {
  84.  
  85. . //当连接处于打开状态时关闭,然后再打开,避免有时候数据不能及时更新
  86.  
  87. . if(SqlDrConn.State==ConnectionState.Open)
  88.  
  89. . {
  90.  
  91. . SqlDrConn.Close();
  92.  
  93. . }
  94.  
  95. . try
  96.  
  97. . {
  98.  
  99. . SqlDrConn.Open();
  100.  
  101. . SqlCommandSql Cmd=new SqlCommand(StrSql,SqlDrConn);
  102.  
  103. . SqlDataReader SqlDr=SqlCmd.ExecuteReader();
  104.  
  105. . if(SqlDr.HasRows)
  106.  
  107. . {
  108.  
  109. . DataTable dt=new DataTable();
  110.  
  111. . //读取SqlDataReader里的内容
  112.  
  113. . dt.Load(SqlDr);
  114.  
  115. . //关闭对象和连接
  116.  
  117. . SqlDr.Close();
  118.  
  119. . SqlDrConn.Close();
  120.  
  121. . returndt;
  122.  
  123. . }
  124.  
  125. . returnnull;
  126.  
  127. . }
  128.  
  129. . catch(Exception ex)
  130.  
  131. . {
  132.  
  133. . System.Windows.Forms.MessageBox.Show(ex.Message);
  134.  
  135. . return null;
  136.  
  137. . }
  138.  
  139. . finally
  140.  
  141. . {
  142.  
  143. . SqlDrConn.Close();
  144.  
  145. . }
  146.  
  147. . }
  148.  
  149. . }
  150.  
  151. 通过调用SqlDrConn.Open()方法打开连接,这时候连接池就会初始化并建立设定的最小连接数。想更清楚了解到连接池的状况可以通过SQL的查询分析器执行存储过程sp_Who,它会列出当前的数据库进程,查看loginnamedbname可以区分用户的连接信息,但要注意的是登录查询分析器本身会使用两个连接,所以最好用另一个用户名登录查询分析器。使用此方法还有一个麻烦地方就是要经常按“执行查询”以更新进程信息。还有另一种方法个人认为
  152.  
  153. 较好的,通过控制面板→管理工具→性能,右击添加计算器,性能对象选择SQlServerGeneralStatistics(常规统计)然后计算器选择UserConnections(用户连接)最后按“添加”就可以实时查看当前连接数。
  154.  
  155. 到了这里,连接池已经实现了,但问题往往会出现在运行过程中。如连接池的连接数满了该怎样处理?在这里我们应该合理设置连接字符串中的ConnectTimeout属性和ConnectionLifetime属性(上面有解释)延长等待时间,尽可能地在每次使用完连接之后调用Close方法关闭连接。但从中也有没法避免的,当连接数满了并且申请连接的时间超过设置连接等待的时间时,程序将会引发InvalidOperationExceptio异常,我们可以通过捕获此异常向用户界面提示“系统正忙,请稍后再连接??”之类的信息来缓解这种情况。此外,也有另一种方法来解决这种情况,就是利用ADO.NET2.0新特性“异步进程”,对数据库进行异步操作,确保连接能够及时调用Close方法关闭连接,这样能大大减少正在使用的连接数。 使用方法:在连接字符串中加上AsynchronousProcessing=true表示使用异步处理操作。 当应用程序不再需要用到连接池的时候可以使用ClearPoolClearAllPools方法清空连接池也可作重置连接池使用,方法如下:
  156.  
  157. SqlConnection.ClearPool(SqlConnection connection)清空关联的连接池
  158.  
  159. SqlConnection.ClearAllPools()清空所有连接池
  160.  
  161. 调用上述方法,如果连接正在使用,连接池会做相应标记,等连接关闭时自动烧毁。 小结C#数据库连接池
  162.  
  163. 优点:当数据库操作和访问频繁的时候,减少创建连接和打开连接所耗的时间,提升数据库服务器的性能。
  164.  
  165. 缺点:数据库连接池中可能存在着多个没有被使用的连接一直连接着数据库,这意味着资源的浪费。

使用c#数据库连接池的更多相关文章

  1. Java第三方数据库连接池库-DBCP-C3P0-Tomcat内置连接池

    连接池原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定连接池 ...

  2. .数据库连接池技术:DBCP和C3P0

    数据库连接池技术:DBCP和C3P0 1.什么是数据库连接池 已知的方法是需要访问数据库的时候进行一次数据库的连接,对数据库操作完之后再释放这个连接,通常这样业务是缺点很明显的: 用户每次请求都需要向 ...

  3. [转]阿里巴巴数据库连接池 druid配置详解

    一.背景 java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色 ...

  4. 数据库连接池c3p0学习

    这里只记录c3p0的数据源,不会涉及到其它方面和别的数据库连接池的对比 配置文件主要的实现方式有三种: 1.手写代码去加载一个配置文件 创建一个config.properties文件如下: drive ...

  5. <十四>JDBC_c3p0数据库连接池

    配置文件:c3p0-config.xml <!-- Hibernate官方推荐使用的数据库连接池即c3p0;dbcp是Tomcat在数据源中使用 --><c3p0-config> ...

  6. <十三>JDBC_dbcp数据库连接池

    配置文件:jdbc.properties username=rootpassword=kkdriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://1 ...

  7. c3p0数据库连接池的使用详解

    首先,什么是c3p0?下面是百度百科的解释: C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Sp ...

  8. Mybatis-update - 数据库死锁 - 获取数据库连接池等待

    最近学习测试mybatis,单个增删改查都没问题,最后使用mvn test的时候发现了几个问题: update失败,原因是数据库死锁 select等待,原因是connection连接池被用光了,需要等 ...

  9. 从零开始学 Java - 数据库连接池的选择 Druid

    我先说说数据库连接 数据库大家都不陌生,从名字就能看出来它是「存放数据的仓库」,那我们怎么去「仓库」取东西呢?当然需要钥匙啦!这就是我们的数据库用户名.密码了,然后我们就可以打开门去任意的存取东西了. ...

  10. java web学习总结(十六) -------------------数据库连接池

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

随机推荐

  1. [物理学与PDEs]书中出现的符号及其意义汇总

    1. 标量 $\ve_0$: $=8.85419\times 10^{-2}C^2/(N\cdot m^2)$ 真空中的介电常数 $\ve$: 介电常数 $\ve_r$: $=1+\chi_e$ 相对 ...

  2. 手动编译Jsp文件

    手动模拟Tomcat编译jsp文件 Tomcat编译jsp文件的配置路径是在%tomcat_home%/conf/web.xml中,有这样一段代码 <servlet> <servle ...

  3. android:gravity 和 android:layout_Gravity属性

    LinearLayout有两个非常相似的属性: android:gravity 与android:layout_gravity. 他们的区别在于: android:gravity 属性是对该view中 ...

  4. Ubuntu配置网络命令(转载)

    From:http://blog.csdn.net/ithomer/article/details/6264881 以eth0为例   1. 以DHCP方式配置网卡 编辑文件: /etc/networ ...

  5. java多线程之AtomicInteger

    AtomicInteger原子操作实现同步 package Thread.Common; import java.util.Timer; import java.util.TimerTask; imp ...

  6. C++学习44 格式化输出,C++输出格式控制

    在输出数据时,为简便起见,往往不指定输出的格式,由系统根据数据的类型采取默认的格式,但有时希望数据按指定的格式输出,如要求以十六进制或八进制形式输出一个 整数,对输出的小数只保留两位小数等.有两种方法 ...

  7. C#下的Redis 学习

    Redis作为世界上最快的分布式NoSQL的数据存储,在高性能构架中离不开他的身影 Centos下安装Redis wget http://download.redis.io/redis-stable. ...

  8. 如何判断VS.NET设计时?

    方法一: if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv") //...Then ...

  9. 安装和卸载windows程序

    安装windows service通常有两种工具 1.Framework目录下的installutil.exe工具.2.visual studio命令行工具 在这里我要说的是当我们使用的系统是64位的 ...

  10. html 去掉input 获取焦点时的边框

    html中,当input标签获取焦点的时候(例如,当光标放在input框中准备输入值时), input标签外围会出现边框,有的时候我们需要去掉这个边框,可以使用css的outline:none;属性将 ...