本篇内容综合广大网友提供内容,笔者经过整理,对数据库连接池原理和实现过程做个很系统的并且通俗易懂的分析讲解,以及手写一个连接池实现过程作为演示。

一、早期通过JDBC方式操作数据库

我们先来看早期使用JDBC的方式操作数据库的过程,这里以mysql数据库为例讲解

JDBC操作数据库原理:一般来说,java应用程序访问数据库的过程是:

  ①装载数据库驱动程序;

  ②通过jdbc建立数据库连接;

  ③访问数据库,执行sql语句;

  ④断开数据库连接。

1、具体的代码实现步骤

创建数据库配置文件db.properties ,配置文件内容如下:

#连接数据库的url,test表示数据库名,useUnicode=true表示使用Unicode字符集
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8;
#用户名
user=root
#密码
password=root
#MySQL数据库加载驱动
driverClass=com.mysql.jdbc.Driver

定义一个使用jdbc连接数据库的工具类JdbcUtil.java

public class JdbcUtil{//定义全局变量private static String url = null;private static String user = null;private static String password = null;private static driverClass = null;//读取配置文件内容,放在静态代码块中就行,因为只需要加载一次就可以了static{try{Properties props = new Properties();//使用类路径加载的方式读取配置文件//读取的文件路径要以“/”开头,使用"/"开头会直接定位到工程的src路径下InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties");//加载配置文件props.load(in);//读取配置文件信息url = props.getProperty("url");user = props.getProperty("user");password = props.getProperty("password");driverClass = props.getProperty("driverClass");//动态注册mysql驱动程序Class.forName(driverClass);System.out.println("成功加载MySQL驱动程序");}catch(Exception e){e.printStackTrace();System.out.println("mysql驱动程序注册失败!!!");}}//获取连接对象Connectionpublic static Connection getConnection(){try{//要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象return DriverManager.getConnection(url,user,password);}catch(SQLException e){e.printStackTrace();//抛出运行时异常throw new RuntimeException();}}//关闭连接的方法,后打开的先关闭public static void close(Connection conn,Statement stmt,ResultSet rs){//关闭ResultSet对象if(rs != null){try{//关闭rs,设置rs=null,因为java会优先回收值为null的变量rs.close();rs = null;}catch(SQLException e){e.printStackTrace();throw new RuntimeException();}}//关闭Statement对象,因为PrepareStatement和CallableStatement都是Statement的子接口,所以这里只需要有关闭Statement对象的方法就可以了if(stmt != null){try{stmt.close();stmt = null;}catch(SQLException e){e.printStackTrace();throw new RuntimeException();}}//关闭Connection对象if(conn != null){try{conn.close();conn = null;}catch(SQLException e){e.printStackTrace();throw new RuntimeException();}}}
}

到此,这是一个完整的使用JDBC方式操作数据库的过程,下面我们新建一个测试类TestConn.java 测试一下

package demo;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import utils.JdbcUtil;public class TestConn {public static void main(String[] args) {// TODO Auto-generated method stubConnection conn = JdbcUtil.getConnection();try {Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM user") ;//使用结果集(ResultSet)对象的访问方法获取数据:while(rs.next()){   String name = rs.getString("name") ; System.out.println(name);String pass = rs.getString(1);//此方法比较高效,列是从左到右编号的,并且从列1开始 System.out.println(pass);} //操作完成以后关闭JDBC对象,要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反: //关闭顺序1、关闭记录集,2、关闭声明,3、关闭连接对象JdbcUtil.close(conn, stmt, rs);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

2、分析

程序开发过程中,存在很多问题:首先,每一次web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉不出系统有多大的开销。可是对于现在的web应用,尤其是大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。在这种情况下,频繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的甚至会造成服务器的崩溃。不是危言耸听,这就是制约某些电子商务网站发展的技术瓶颈问题。其次,对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。

上述的用户查询案例,如果同时有1000人访问,就会不断的有数据库连接、断开操作:

通过上面的分析,我们可以看出来,“数据库连接”是一种稀缺的资源,为了保障网站的正常使用,应该对其进行妥善管理。其实我们查询完数据库后,如果不关闭连接,而是暂时存放起来,当别人使用时,把这个连接给他们使用。就避免了一次建立数据库连接和断开的操作时间消耗。原理如下:

二、技术演进出来的数据库连接池

由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理。我们知道,对于共享资源,有一个很著名的设计模式:资源池(resource pool)。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。

我们自己尝试开发一个连接池,来为上面的查询业务提供数据库连接服务:

①   编写class 实现DataSource 接口

②   在class构造器一次性创建10个连接,将连接保存LinkedList中

③   实现getConnection  从 LinkedList中返回一个连接

④   提供将连接放回连接池中方法

1、实现mysql数据库连接池代码

public class MyDataSource implements DataSource {//链表实现栈结构privateLinkedList<Connection> dataSources = new LinkedList<Connection>();//无参构造器,初始化连接数量public MyDataSource() {//一次性创建10个连接for(int i = 0; i < 10; i++) {try {//1、获取数据库连接对象Connection conn = JdbcUtil.getConnection();//2、将连接加入连接池中dataSources.add(con);} catch (Exception e) {e.printStackTrace();}}}@Overridepublic Connection getConnection() throws SQLException {//取出连接池中一个连接final Connection conn = dataSources.removeFirst(); //删除第一个连接返回return conn;}//将连接放回连接池public void releaseConnection(Connection conn) {dataSources.add(conn);}
}

这就是数据库连接池的原理,它大大提供了数据库连接的利用率,减小了内存吞吐的开销。我们在开发过程中,我们只关注我们的业务代码的开发,就不需要再关心数据库连接的问题,自然有数据库连接池帮助我们处理。但连接池需要考虑的问题不仅仅如此,还有更多问题需要考虑,在下一节内容中具体分享。

数据库连接池技术带来的优势:

1. 资源重用

由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。

2. 更快的系统响应速度

数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。

3. 新的资源分配手段

对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术,几年钱也许还是个新鲜话题,对于目前的业务系统而言,如果设计中还没有考虑到连接池的应用,那么…….快在设计文档中加上这部分的内容吧。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。

4. 统一的连接管理,避免数据库连接泄漏

在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。一个最小化的数据库连接池实现.

数据库连接池原理以及好处相关推荐

  1. 数据库连接池原理和使用

    数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏 ...

  2. Golang 侧数据库连接池原理和参数调优

    Golang 侧数据库连接池原理和参数调优 文章目录 Golang 侧数据库连接池原理和参数调优 数据库连接池 数据库连接池的设计 Go 的数据库连接池 Go 数据库连接池的设计 建立连接 释放连接 ...

  3. 传统方式连接数据库的弊端和数据库连接池原理

    本次博客带领大家学习传统方式连接数据库的弊端和数据库连接池原理. 传统获取Connection问题分析 传统的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要 ...

  4. python多线程并发访问数据库连接池原理以及代码

    现状 在工作中难免会使用数据库,为了能够高效并发访问数据库,数据库连接池必不可少,由于本站copy模式盛行,导致数据库连接池被错误使用,遇到错误甚至追求能跑通就行. 本文就python版本的数据库链接 ...

  5. java jdbc close原理_JDBC数据库连接池原理

    JDBC是java数据库连接的简称.它是一种用于实行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成.其相关的API都在java.sql.*包下 ...

  6. hikaricp 连接池分析_SpringBoot 2.0 中 HikariCP 数据库连接池原理解析

    作为后台服务开发,在日常工作中我们天天都在跟数据库打交道,一直在进行各种CRUD操作,都会使用到数据库连接池.按照发展历程,业界知名的数据库连接池有以下几种:c3p0.DBCP.Tomcat JDBC ...

  7. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析

    作为后台服务开发,在日常工作中我们天天都在跟数据库打交道,一直在进行各种CRUD操作,都会使用到数据库连接池.按照发展历程,业界知名的数据库连接池有以下几种:c3p0.DBCP.Tomcat JDBC ...

  8. 数据库连接池原理及常用连接池介绍

    一.背景介绍 1.1 什么是连接池 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个. 1.2 为什么要使用连接池 数据库连接是一种关键的有 ...

  9. jsp获取连接池的实时连接数_数据库连接池原理分析及模拟实现

    数据库访问 访问数据库主要有以下几个步骤: 加载数据库驱动 创建数据库连接 执行访问操作并处理执行结果 关闭连接,释放资源 在每一次请求数据库都要经历上述过程,创建连接和释放资源也都是些重复性的动作, ...

最新文章

  1. debian10 Unable to correct problems, you have held broken packages.
  2. ORA-16629: database reports a different protection
  3. leetcode算法题--队列的最大值
  4. 【ThinkPHP系列篇】ThinkPHP框架的介绍和搭建(一)
  5. 安装SQL2005 29506错误码的解决方案
  6. datagridview滚动条自动滚动_掘金上摸鱼的新发现,无限滚动(infinitescroll)
  7. c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。...
  8. 机器学习之LDA主题模型算法
  9. linux uniq 命令详解
  10. linux编译c代码错误,linux - 使用ASAN时如何解决错误“无法运行C编译程序” - 堆栈内存溢出...
  11. QTP教程入门到高级(转)
  12. 信号峰峰值Vpp与功率和dbm的换算
  13. 进销存管理系统是什么?能给企业带来哪些好处?
  14. 《操作系统原理及应用》题库-选择题
  15. 解决eclipse mars2中不能设置tomcat8.5
  16. matlab2018a出现error8怎么办
  17. 人工智能——课程论文
  18. 三种加快计算机启动速度的办法,电脑开机慢怎么解决?四种提速方法,前三种方法不花钱就能提速!...
  19. Android学习——Shortcut
  20. 0705第七讲标准模版库

热门文章

  1. UML2工具——用例图篇(实例操作步骤)
  2. python+nodejs+java+vue顾家装修网站
  3. 诺基亚手机是怎么分平台的?
  4. 三星SCH-I739官方原版ROM下载及刷机教程
  5. ACE框架理解(一)
  6. 用自编码器对数据进行降维
  7. 有什么好用的文件共享软件
  8. C语言输出123456互不相同的三位数组合1/2
  9. 给硬件工程师的入门课-电子工程师常用网站
  10. 企微管家营销红包:给客户发红包,给客户群发红包均支持