关于SQLSERVER数据库连接池

页内导航

  • 1.如何开启连接池?
  • 2. 那连接池是和什么有关呢?
  • 3.如何使用相同的连接池访问不同的数据库?
  • 4.数据库连接池的默认最大和最小值


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

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

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

首先说明一下测试环境:

数据库版本: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];
                }
            }

出处:https://www.cnblogs.com/champaign/p/6548325.html

原文地址:https://www.cnblogs.com/mq0036/p/11614384.html

时间: 2024-10-18 08:55:38

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

Ado.net中SQLServer数据库连接池

相关资源: https://www.cnblogs.com/7qi7/articles/2342494.html https://www.cnblogs.com/lonelyxmas/p/11229038.html MSDN解释 连接到数据库服务器通常由几个需要很长时间的步骤组成. 必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信息,必须由服务器对连接进行身份验证,必须运行检查以便在当前事务中登记,等等. 实际上,大多数应用程序仅使用一个或几个不同的连接配

C#数据库连接池 MySql SqlServer

查阅了一天的资料来学习MySql数据库连接池,终于在一遍博文上找到了,自己也整理了一下,希望对大家有用处 1. 建立线程池 1 using MySql.Data.MySqlClient; 2 using System; 3 using System.Collections; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8

Tomcat配置数据库连接池

上篇博文中记录了使用数据库连接池的重要性和如何用java代码自己写一个连接池,网上查了一番 发现原来像tomcat这种服务器自带了连接池,可以通过配置文件直接使用,下面来介绍一下使用方法. 本例为myeclipse+tomcat7.0+sqlserver2008配置数据库连接池 具体步骤: 1. 在server.xml中设置数据源,以sql server 2008数据库为例,如下: 在<GlobalNamingResources> </GlobalNamingResources>节

数据库连接池两种配置方式详解

数据库连接池:   负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏:数据库连接池原理:   连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象.使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用.而连接的建立.断开都由

【Java】数据库连接池技术

JDBC的问题 在程序中,我们经常要建立与数据库的连接,之后再关闭这个连接.我们知道,数据库连接对象的创建是比较消耗系统性能的,这些频繁的操作势必会消耗大量的系统资源.因此我们需要采用更高效的数据库访问技术. 数据库连接池的概念 在JDBC2.0中提出了数据库连接池技术,它提供了javax.Sql.DataSource(数据源)接口,它负责建立与数据库的连接.通过客户之间共享一组连接,而不是在它们需要的时候为他们新建立连接,这样就可以改善资源的使用,提高应用程序的响应能力. 连接池技术的核心思想

数据库连接池的原理

这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及当下最流行的开源数据库连接池jar包. 一.早期我们怎么进行数据库操作        1.原理:一般来说,java应用程序访问数据库的过程是: ①装载数据库驱动程序: ②通过jdbc建立数据库连接: ③访问数据库,执行sql语句: ④断开数据库连接.        2.代码  // 查询所有用户 [java] view plain copy print? Public void FindAllUsers(){ //1.装载s

java数据库连接池实现原理

一.为什么在连接数据库时要使用连接池 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.  一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下. 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个"池"里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请.使用和释放.对于多于连接池中连接数的并发请求,应该在请求队列

Python实现Mysql数据库连接池

python连接Mysql数据库: Python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接MySQL数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响.因此,实际使用中,通常会使用数据库的连接池技术,来访问数据库达到资源复用的目的. python的数据库连接池包 DBUtils: DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装.DBUtils来

c#与oracle数据库连接池

c#与oracle数据库连接池 在做一个项目,中间要使用webservice和oracle数据库.我在服务端做了用户身份认证,也就是使用session传递用户的登陆信息.在测试时,当用户少的时候,没有问题,但是当大量用户同时访问时,就报错,起初以为是自己的oracle连接部分有问题,几经确认,终于发现了是连接池的问题. 以下是从别人的博客中摘抄的,不敢造次,收录如下: "连接根据连接字符串以及用户标识来建立池连接.因此,如果使用网站上的基本身份验证或 Windows 身份验证以及集成的安全登录,