数据库连接池使用(一):使用C#数据库连接池
一、导读
使用C#数据库连接池,连接到数据库服务器通常由几个需要软长时间的步骤组成:
1、必须与服务器进行初次连接;
2、必须分析连接字符串信息;
3、必须由服务器对连接进行身份验证;
4、必须建立物理通道(例如套接字或命名管道);
大部份的应用程序都是使用一个或几个不同的连接配置,当应用程序的数据量和访问量大的时候,许多相同的连接将反复地被打开和关闭,从而会引起数据库服务器效率低下甚至引发程序崩溃,我们可以在ADO.NET中使用称为连接池的优化方法来管理维护连接。
C#数据库连接池可以减少创建连接的次数,定义最小连接数(固定连接数),当用户在连接上调用Open,连接池就会检查池中是否有可用的连接。如果发现有连接可用,会将该连接返回给调用者,而不是创建新连接。应用程序在该连接上调用Close时,连接池会判断该连接是否在最小连接数之内,如果“是”会将连接回收到活动连接池中而不是真正关闭连接,否则将烧毁连接。连接返回到池中之后,即可在下一个Open调用中重复使用。
二、创建C#数据库连接池
以下示例使用C#连接SQL Server 数据库:
class DbConn
{
private const int MaxPool=;//最大连接数
private const int MinPool=;//最小连接数
private const bool Asyn_Process=true;//设置异步访问数据库
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()清空所有连接池
调用上述方法,如果连接正在使用,连接池会做相应标记,等连接关闭时自动烧毁。
三、小结
优点:当数据库操作和访问频繁的时候,减少创建连接和打开连接所耗的时间,提升数据库服务器的性能。
缺点:数据库连接池中可能存在着多个没有被使用的连接一直连接着数据库,这意味着资源的浪费。
转载链接:http://www.cnblogs.com/wuyifu/p/4221614.html
数据库连接池使用(一):使用C#数据库连接池的更多相关文章
- 浅谈线程池(上):线程池的作用及CLR线程池
原文地址:http://blog.zhaojie.me/2009/07/thread-pool-1-the-goal-and-the-clr-thread-pool.html 线程池是一个重要的概念. ...
- 网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别
1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2 ...
- Mysql线程池系列一:什么是线程池和连接池( thread_pool 和 connection_pool)
thread_pool 和 connection_pool 当客户端请求的数据量比较大的时候,使用线程池可以节约大量的系统资源,使得更多的CPU时间和内存可以高效地利用起来.而数据库连接池的使用 ...
- Java-线程池专题(什么是线程池,如何使用,为什么要用)
1.什么是线程池: java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池 多线程技术主要解决处理 ...
- Java第三方数据库连接池库-DBCP-C3P0-Tomcat内置连接池
连接池原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定连接池 ...
- python——有一种线程池叫做自己写的线程池
这周的作业是写一个线程池,python的线程一直被称为鸡肋,所以它也没有亲生的线程池,但是竟然被我发现了野生的线程池,简直不能更幸运~~~于是,我开始啃源码,实在是虐心,在啃源码的过程中,我简略的了解 ...
- 浅谈线程池(中):独立线程池的作用及IO线程池
原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...
- 开源数据库连接池之Tomcat内置连接池
本篇介绍几种开源数据库连接池,同时重点讲述如何使用Tomcat服务器内置的数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数 ...
- java线程池与五种常用线程池策略使用与解析
背景:面试中会要求对5中线程池作分析.所以要熟知线程池的运行细节,如CachedThreadPool会引发oom吗? java线程池与五种常用线程池策略使用与解析 可选择的阻塞队列BlockingQu ...
- python---基础知识回顾(十)进程和线程(py2中自定义线程池和py3中的线程池使用)
一:自定义线程池的实现 前戏: 在进行自定义线程池前,先了解下Queue队列 队列中可以存放基础数据类型,也可以存放类,对象等特殊数据类型 from queue import Queue class ...
随机推荐
- Python3.5 学习八
#动态导入 官方建议import importlibimport_str="lib.aa"lib=importlib.import_module(import_str)obj=li ...
- Atcoder Tenka1 Programmer Contest 2019题解
传送门 \(C\ Stones\) 最后肯定形如左边一段白+右边一段黑,枚举一下中间的断点,预处理一下前缀和就可以了 int main(){ // freopen("testdata.in& ...
- Binary Indexed Tree-307. Range Sum Query - Mutable
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...
- Graph-684. Redundant Connection
In this problem, a tree is an undirected graph that is connected and has no cycles. The given input ...
- grub覆盖mbr引导系统
grub覆盖mbr引导系统 0.个人PC,WIN 7 + Kali,easybcd 不起作用,需要制作 kali 安装盘 PS:推荐使用 universal usb installer 制作. 方案一 ...
- 深度了解git工具
今天给大家介绍一个深度了解git的学习视频,视频讲的挺好的,可以听听. 深度了解git学习视频
- VM下--Linux根分区磁盘扩容
转载请注明源出处:http://www.cnblogs.com/lighten/p/6825938.html 1.缘由 由于需要对虚拟机中的软件进行升级,执行yum update的时候,整个更新包在8 ...
- jython实现java运行python代码
Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现.最近的一个项目需要将python代码转换成java实现,所以用了一 ...
- redis报Cannot allocate memory错误
昨天16:27开始将dp的日志使用ELK处理,当时redis使用内存的量不是很大,100M多点,结果今天早上到了一看xshell被关掉了,赶紧将各服务启动起来,elasticsearch启动没有问题, ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(一):Kitty 系统介绍
在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 温馨提示: 有在演示环境删除数据的童鞋们,如果可以的话,麻烦动动小指,右键头像 ...