使用c#数据库连接池
摘自: http://www.wxphp.com/wxd_0fetn2bw2548fsc2ak8h_1.html
导读:使用C#数据库连接池,连接到数据库服务器通常由几个需要软长时间的步骤组成,必须与服务器进行初次连接,必须分析连接字符串信息,必须由服务器对连接进行身份验证,大部份的应用程序都是使用一个或几个不同的连接配置,当应用程序的数据量和访问量大的时候,许多相同的连接将反复地被打开和关闭,从而会引起数据库服务器效率低下甚至引发程序崩溃,我们可以在ADO.NET中使用称为连接池的优化方法来管理维护连接,C#
使用c#数据库连接池使用C#数据库连接池
连接到数据库服务器通常由几个需要软长时间的步骤组成。必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次连接,必须分析连接字符串信息,必须由服务器对连接进行身份验证,等等。
实际上,大部份的应用程序都是使用一个或几个不同的连接配置。当应用程序的数据量和访问量大的时候,这意味着在运行应用程序的过程中,许多相同的连接将反复地被打开和关闭,从而会引起数据库服务器效率低下甚至引发程序崩溃。为了确保应用程序的稳定和降低性能成本,我们可以在ADO.NET中使用称为连接池的优化方法来管理维护连接。
C#数据库连接池可以减少创建连接的次数。定义最小连接数(固定连接数),当用户在连接上调用Open,连接池就会检查池中是否有可用的连接。如果发现有连接可用,会将该连接返回给调用者,而不是创建新连接。应用程序在该连接上调用Close时,连接池会判断该连接是否在最小连接数之内,如果“是”会将连接回收到活动连接池中而不是真正关闭连接,否则将烧毁连接。连接返回到池中之后,即可在下一个Open调用中重复使用。
创建C#数据库连接池
以下示例使用C#连接SQL数据库:
. class DbConn
. {
. //usingSystem.Data;
. //usingSystem.Data.SqlClient;
. private const int MaxPool=;//最大连接数
. private const int MinPool=;//最小连接数
. private const bool Asyn_Process=true;//设置异步访问数据库
. //在单个连接上得到和管理多个、仅向前引用和只读的结果集(ADO.NET2.0)
. private const bool Mars=true;
. private const int Conn_Timeout=;//设置连接等待时间
. private const int Conn_Lifetime=;//设置连接的生命周期
. private string ConnString="";//连接字符串
. private SqlConnection SqlDrConn=null;//连接对象
.
. public DbConn()//构造函数
. {
. ConnString=GetConnString();
. SqlDrConn=new SqlConnection(ConnString);
. }
.
. private string GetConnString()
. {
. return"server=localhost;"
. +"integratedsecurity=sspi;"
. +"database=pubs;"
. +"MaxPoolSize="+MaxPool+";"
. +"MinPoolSize="+MinPool+";"
. +"ConnectTimeout="+Conn_Timeout+";"
. +"ConnectionLifetime="+Conn_Lifetime+";"
. +"AsynchronousProcessing="+Asyn_Process+";";
. //+"MultipleActiveResultSets="+Mars+";";
. }
.
. public DataTable GetDataReader(string StrSql)//数据查询
. {
. //当连接处于打开状态时关闭,然后再打开,避免有时候数据不能及时更新
. if(SqlDrConn.State==ConnectionState.Open)
. {
. SqlDrConn.Close();
. }
. try
. {
. SqlDrConn.Open();
. SqlCommandSql Cmd=new SqlCommand(StrSql,SqlDrConn);
. SqlDataReader SqlDr=SqlCmd.ExecuteReader();
. if(SqlDr.HasRows)
. {
. DataTable dt=new DataTable();
. //读取SqlDataReader里的内容
. dt.Load(SqlDr);
. //关闭对象和连接
. SqlDr.Close();
. SqlDrConn.Close();
. returndt;
. }
. returnnull;
. }
. catch(Exception ex)
. {
. System.Windows.Forms.MessageBox.Show(ex.Message);
. return null;
. }
. finally
. {
. SqlDrConn.Close();
. }
. }
. }
通过调用SqlDrConn.Open()方法打开连接,这时候连接池就会初始化并建立设定的最小连接数。想更清楚了解到连接池的状况可以通过SQL的查询分析器执行存储过程sp_Who,它会列出当前的数据库进程,查看loginname、dbname可以区分用户的连接信息,但要注意的是登录查询分析器本身会使用两个连接,所以最好用另一个用户名登录查询分析器。使用此方法还有一个麻烦地方就是要经常按“执行查询”以更新进程信息。还有另一种方法个人认为
较好的,通过控制面板→管理工具→性能,右击添加计算器,性能对象选择SQlServer:GeneralStatistics(常规统计)然后计算器选择UserConnections(用户连接)最后按“添加”就可以实时查看当前连接数。
到了这里,连接池已经实现了,但问题往往会出现在运行过程中。如连接池的连接数满了该怎样处理?在这里我们应该合理设置连接字符串中的ConnectTimeout属性和ConnectionLifetime属性(上面有解释)延长等待时间,尽可能地在每次使用完连接之后调用Close方法关闭连接。但从中也有没法避免的,当连接数满了并且申请连接的时间超过设置连接等待的时间时,程序将会引发InvalidOperationExceptio异常,我们可以通过捕获此异常向用户界面提示“系统正忙,请稍后再连接??”之类的信息来缓解这种情况。此外,也有另一种方法来解决这种情况,就是利用ADO.NET2.0新特性“异步进程”,对数据库进行异步操作,确保连接能够及时调用Close方法关闭连接,这样能大大减少正在使用的连接数。 使用方法:在连接字符串中加上AsynchronousProcessing=true表示使用异步处理操作。 当应用程序不再需要用到连接池的时候可以使用ClearPool或ClearAllPools方法清空连接池也可作重置连接池使用,方法如下:
SqlConnection.ClearPool(SqlConnection connection)清空关联的连接池
SqlConnection.ClearAllPools()清空所有连接池
调用上述方法,如果连接正在使用,连接池会做相应标记,等连接关闭时自动烧毁。 小结C#数据库连接池
优点:当数据库操作和访问频繁的时候,减少创建连接和打开连接所耗的时间,提升数据库服务器的性能。
缺点:数据库连接池中可能存在着多个没有被使用的连接一直连接着数据库,这意味着资源的浪费。
使用c#数据库连接池的更多相关文章
- Java第三方数据库连接池库-DBCP-C3P0-Tomcat内置连接池
连接池原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定连接池 ...
- .数据库连接池技术:DBCP和C3P0
数据库连接池技术:DBCP和C3P0 1.什么是数据库连接池 已知的方法是需要访问数据库的时候进行一次数据库的连接,对数据库操作完之后再释放这个连接,通常这样业务是缺点很明显的: 用户每次请求都需要向 ...
- [转]阿里巴巴数据库连接池 druid配置详解
一.背景 java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色 ...
- 数据库连接池c3p0学习
这里只记录c3p0的数据源,不会涉及到其它方面和别的数据库连接池的对比 配置文件主要的实现方式有三种: 1.手写代码去加载一个配置文件 创建一个config.properties文件如下: drive ...
- <十四>JDBC_c3p0数据库连接池
配置文件:c3p0-config.xml <!-- Hibernate官方推荐使用的数据库连接池即c3p0;dbcp是Tomcat在数据源中使用 --><c3p0-config> ...
- <十三>JDBC_dbcp数据库连接池
配置文件:jdbc.properties username=rootpassword=kkdriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://1 ...
- c3p0数据库连接池的使用详解
首先,什么是c3p0?下面是百度百科的解释: C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Sp ...
- Mybatis-update - 数据库死锁 - 获取数据库连接池等待
最近学习测试mybatis,单个增删改查都没问题,最后使用mvn test的时候发现了几个问题: update失败,原因是数据库死锁 select等待,原因是connection连接池被用光了,需要等 ...
- 从零开始学 Java - 数据库连接池的选择 Druid
我先说说数据库连接 数据库大家都不陌生,从名字就能看出来它是「存放数据的仓库」,那我们怎么去「仓库」取东西呢?当然需要钥匙啦!这就是我们的数据库用户名.密码了,然后我们就可以打开门去任意的存取东西了. ...
- java web学习总结(十六) -------------------数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
随机推荐
- REDHAT6.2配置yum源(64位)(转载)
From:http://www.dedecms8.com/db/php_bc/12322.html 1.删除redhat原有的yum rpm -aq|grep yum|xargs rpm -e --n ...
- Windows 10 中 Eclipse中无法添加Courier New字体的解决方法!
1,打开"C:\Windows\Fonts\"文件夹. 2,鼠标右键"Courier New",随后点击"显示",这样你就可以在Eclips ...
- R %operator% 含义
%foo% is the syntax for a binary operator. In base R: %in%: '"%in%" <- function(x, tabl ...
- Git中的文件状态和使用
(暂存区 即Index In Git) commit 到 local respository的内容,不想push,则使用git reset 将文件状态回转到staged|modified|unstag ...
- 对 HTTP 304 的理解(转-并增加自己的测试)
作者:吴俊杰 性别:男 邮箱:sshroot@126.com 文章类型:原创 博客:http://www.cnblogs.com/voiphudong/ 转自: http://www.cnblogs. ...
- tomcat 部署多个项目的技巧
方法一.在tomcat的根目录下的 conf文件夹下的server.xml文件中的<Host>标签中加入: //docBase: 项目的webRoot path:访问路径 reloadab ...
- [Java] 01 String 内存分析
public class StringTest{ public static void main(String[] args){ String str1 = new String("123& ...
- Quartz.net一个简要示例
下面描述了一个Quartz.net最常用的应用场景,按特定秒数触发执行特定任务. 1.任务要继承自:IJob,在Execute方法中填入自己需要执行的任务. public virtual void E ...
- 自动生成Makefile时,关于Makefile.am编写
最近编译一个项目的程序时,二十几个源代码文件放在六个文件夹中,而且各个文件中头文件互相包含.以前写过编译这样组织的源码的makefile,所以这次也就直接写了. 确实因为各个文件间的头文件互相包含,造 ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(8)-扩展UserDetailsService接口
一个能为DaoAuthenticationProvider提供存取认证库的的类,它必须要实现UserDetailsService接口: public UserDetails loadUserByUse ...