‘关于数据库连接池大家都听说过或者用过,但真正的了解有多少呢?

  • 数据连接池如何启用?有哪些主要的参数?
  • 为什么要使用连接池?
  • 如何关闭连接池?
  • 如何在不开启新的连接池情况下切换当前数据库?
  • 连接池的生命周期?
  • 当数据库服务器强制关闭连接时会怎么样?

==============================================================================================================================

首先说明一下测试环境:

数据库版本:SQL SERVER 12.0.2269.0 [Microsoft SQL Server 2014 Enterprise (64-bit)]

C#版本: Microsoft Visual C# 2015 14.0.25431

客户端版本:System.Data 4.0.0

首先创建一个数据库访问类,便于测试:

    public class DbAccepter
{
/// <summary>
/// 数据库连接
/// </summary>
private SqlConnection _conn = new SqlConnection(); /// <summary>
/// 数据库连接字符串
/// </summary>
private String _connectionString = ""; /// <summary>
/// 数据库连接字符串
/// </summary>
public string ConnectionString
{
get
{
return _connectionString;
} set
{
_connectionString = value;
_conn.ConnectionString = _connectionString;
}
} public DataTable GetData(string sql)
{
string sss = _conn.State.ToString();
using (SqlCommand cmd = new SqlCommand(sql, _conn))
{
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
DataSet ds = new DataSet();
_conn.Open();
adapter.Fill(ds);
_conn.Close();
return ds.Tables[0];
}
}
}
}

1.如何开启连接池?

只需要连接字符串中加入对应的选项即可:

private static String _connectionString = "pooling=true;connection lifetime=5;min pool size = 2;max pool size=4; 
Data Source = 127.0.0.1; Initial Catalog = tempdb; User ID = test; Password=Sm5lAXQiZ10L";

注意里面和连接池有关的参数:

pooling=true; --表示开启连接池(默认为开启)

min pool size = 2 --最小连接池大小:即什么也没执行初次连接的时候先和数据库服务建立n个连接

max pool size=4 --最大连接池大小:允许建立的最大连接数,是在需要的时候建立。

举例说明:min pool size = 2;max pool size=4 ;

点击按钮时调用以下代码执行数据库脚本。

 try
{
info.Clear();
for (int i = 0; i < num.Value; i++)
{
Thread th = new Thread(GetCurrentDbName);
th.Start();
}
}
catch (Exception ex)
{
listboxAdd(ex.Message);
}

这里的GetCurrentDbName方法是创建数据库连接然后执行一段SQL脚本,获取当前数据库的名称然后延时3S,所以每次执行SQL的时间都约为3秒

select db_name();
waitfor delay '00:00:03'; --延迟3秒

这里我们先将并发数设为1,在初次建立连接时会创建2个连接。

可以在数据库中进行查看:

select * from sysprocesses where hostname='xxx' and loginame='test'

2. 那连接池是和有什么有关呢?

在同一个进程中,只和连接字符串有关,只要连接字符串一样就会使用同一个连接池。

这里我们将连接字符串改为下图(只修改了最小数据池):

执行指令后,再观察一下数据库的连接信息:

我们发现会多出一个连接信息,可以会怀疑是不是使用的同个连接池。你可以将并发数改为4.

可以看到,这时的连接数变为6,之前的连接字符串占用了两个,修改后的占用了4个。因为连接池的大小限制为4,所以说明确实是使用了两个连接池。

当我们的并发请数大于最大连接池数会怎么样?这里我们修改一下之前的程序代码,记录线程调用方法执行的起止时间

9个线程的执行截止时间,可以看出前四的截止时间基本相同,中间的四个大约比前4个晚3S。最后一个比中间四个晚3S。

说明开始有4个线程的数据库请求获取到连接池资源,其它线程等待。

这4个线程执行完成后,另4个线程获的连接池资源,最后一个线程等待真到再次释放连接池。

那我们再看一下数据库的连接数仍然为4。说明有多个并行请求时,超过连接池的部分将等待。等待多久会超时呢???

结论是如果想使用连接池,必须使用相同的连接字符串,必须一字不差(我并没有全部测试)。

3.如何使用相同的连接池访问不同的数据库?

在实际开发中我们会访问同一个服务器中的多个数据库,但又不想创建过多的连接。如果访问不同的库使用不同的连接字符串,那就会产生多个连接池。

如这样:

pooling=true;connection lifetime=10;min pool size = 2;max pool size=4; Data Source = 127.0.0.1; Initial Catalog = tempdb; User ID = test; Password=Sm5lAXQiZ10L

pooling=true;connection lifetime=10;min pool size = 2;max pool size=4; Data Source = 127.0.0.1; Initial Catalog = master; User ID = test; Password=Sm5lAXQiZ10L

这时有两个办法:

1.在SQL语句中指定数据库名称(不太靠谱)

2.不要重新创建连接,而是使用的相同的连接字符串创建连接后再切换数据库。实现代码如下:

  using (SqlCommand cmd = new SqlCommand(sql, _conn))
{
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
DataSet ds = new DataSet();
_conn.Open(); //这时指向的是tempdb
_conn.ChangeDatabase("master"); //切换数据库
adapter.Fill(ds);
_conn.Close();
return ds.Tables[0];
}
}

关于SQLSERVER数据库连接池的更多相关文章

  1. C#数据库连接池 MySql SqlServer

    查阅了一天的资料来学习MySql数据库连接池,终于在一篇博文上找到了,自己也整理了一下,希望对大家有用处 1. 建立连接池 using MySql.Data.MySqlClient; using Sy ...

  2. 数据库连接池:Druid

    转自: http://www.cnblogs.com/windlaughing/p/3287501.html Java连接数据库方法概述 java.sql提供了一些接口和类,用于支持数据库增删改查等相 ...

  3. Java中数据库连接池原理机制的详细讲解以及项目连接数据库采用JDBC常用的几种连接方式

    连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...

  4. Java数据库连接池

    转载过来的,最近在做一个小网站,准备使用这种方法.     Java jdbc数据库连接池总结! 1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及, ...

  5. java配置数据库连接池的方法步骤

    java配置数据库连接池的方法步骤 java配置数据库连接池的方法步骤,需要的朋友可以参考一下   先来了解下什么是数据库连接池数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vecto ...

  6. 使用c#数据库连接池

    摘自: http://www.wxphp.com/wxd_0fetn2bw2548fsc2ak8h_1.html 导读:使用C#数据库连接池,连接到数据库服务器通常由几个需要软长时间的步骤组成,必须与 ...

  7. Java jdbc数据库连接池总结!(转)

    1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的 ...

  8. 【Java】数据库连接池技术

    JDBC的问题 在程序中,我们经常要建立与数据库的连接,之后再关闭这个连接.我们知道,数据库连接对象的创建是比较消耗系统性能的,这些频繁的操作势必会消耗大量的系统资源.因此我们需要采用更高效的数据库访 ...

  9. tomcat 7配置数据库连接池,使用SQL Server2005实现

    昨 天看了一些网上的tomcat数据库连接池配置的东西,但是一直没配好,主要原因是网上的文章几乎没有针对tomcat 7进行配置的,而且针对SQL SERVER的也不多,今天上午看了官方的文档,花了一 ...

随机推荐

  1. 继承 派生 super()经典类 新式类

    '''1什么是继承? 继承一种新建类的方式,在python中支持一个儿子继承多个爹 新建的类称为子类的或者派生类 父类有可以称为基类或者超类 子类会‘遗传’父类的属性 2 为什么要用继承 减少代码冗余 ...

  2. js 控制 class 类名(classList) 和 自定义属性(dataset)

    classList 用法: const div = document.querySelector('div') div.classList.add('myclass') // 添加类名 div.cla ...

  3. The History of spring

    Spring的出现  Spring最早出现对早期J2EE规范复杂性的回应 .虽然有些人一直认为Java EE和Spring处于竞争中,但Spring实际上是对Java EE的补充.Spring编程模型 ...

  4. mybatis原理分析学习记录,mybatis动态sql学习记录

    以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...

  5. java中==和equals的区别(转)

    java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(== ...

  6. Demo整合

    1.图片上传:  https://github.com/842549829/WebUploader 2.百度编辑器: https://github.com/842549829/Ueditor 3.安卓 ...

  7. C#操作PDF文件打印

    操作PDF文档时,打印是常见的需求之一.针对不同的打印需求,可分多种情况来进行,如设置静默打印.指定打印页码范围和打印纸张大小.双面打印.黑白打印等等.经过测试,下面将对常见的几种PDF打印需求做一些 ...

  8. 亚马逊(Review、Feedback)差评怎么处理?

    移除亚马逊Review差评,我看也就这三招靠谱点! 亚马逊特别重视review,差评会直接影响到listing的浏览量和销量,甚至还可以摧毁一个账号.遇到一个差的review怎么办?网上看到很多讲移除 ...

  9. mongodb+express+nodejs(登陆退出)

    1.安装expressnpm i -g express(新版本4.X以上要安装express-generator)npm i -g express-generator 2.安装mongodb下载地址h ...

  10. Matlab内嵌图像

    在数值分析中我们通常需要将数据可视化成图像的形式作为我们分析结果的有效性的途径,常用的画图函数有:$\tt plot$,$\tt surf$,$\tt mesh$...当然,我们有时需要多窗口显示图像 ...