什么是数据库连接池?

当系统使用JDBC技术访问数据库时会创建一个connection对象,而该对象的创建过程是非常消耗资源的,并且创建对象的时间也特别长,假设系统一天有1万次的访问量,那么一天就会有1万个connection对象被创建,这极大的浪费数据库的资源,而且可能造成数据库服务器内存溢出,宕机。

为了解决以上问题,就引入了数据库连接池,它主要用来分配、管理、释放数据库的连接。系统启动的时候,数据库连接池首先会创建若干个(该数量可配置)connection对象,并将这些对象放入池中,当系统需要connection对象时,
数据库连接池会从池中分配一个事先创建好的connection对象给系统,当系统使用完毕或超时后,数据库连接池会将该connection对象重新放入池中。
这样就减少了创建connection对象所耗费的资源和时间,可以提高数据库操作的性能。

下图为数据库连接池原理图:

模拟编写一个数据库连接池

因为要用到数据库,所以需要将之前编写的JDBC相关的代码和jar包拷贝过来,创建一个SimpleConnectionPool类,里面需要实现下面三个功能:

1. 初始化一个数据库连接池,并向里面添加10个数据库连接;
2. 从连接池中获取连接;
3. 当程序用完连接后,需要将该连接重新放入连接池中。

需要注意:数据库连接池要保证线程安全!

  1. /**
  2. * 1. 初始化一个数据库连接池,并向里面添加10个数据库连接;
  3. * 2. 从连接池中获取连接;
  4. * 3. 当程序用完连接后,需要将该连接重新放入连接池中。
  5. */
  6. public class SimpleConnectionPool {
  7.  
  8. //创建一个存放连接的池子,注意要保证线程安全
  9. //因为要频繁的对数据库连接池取出和存放操作,所以使用LinkedList池子
  10. public static LinkedList<Connection> pool = (LinkedList<Connection>) Collections.synchronizedList(new LinkedList<Connection>());
  11.  
  12. //在类加载后向数据库连接池中存放10个数据库连接
  13. static {
  14.  
  15. try {
  16. for (int i = 0; i < 10; i++) {
  17. Connection con = DBUtil.getConnection();
  18. pool.add(con);
  19. }
  20. } catch (SQLException e) {
  21. e.printStackTrace();
  22. }
  23.  
  24. }
  25.  
  26. //从连接池中获取连接
  27. public static Connection getConnectionFromPool(){
  28. Connection con = null;
  29. //判断池子中是否还有连接对象
  30. if(pool.size()>0){
  31. con = pool.removeFirst();
  32. }else{
  33. //此时说明数据库连接池中没有可用的连接了
  34. throw new RuntimeException("服务器忙,请稍后再试");
  35. }
  36. return con;
  37. }
  38.  
  39. //当程序用完连接后,需要将该连接重新放入连接池中
  40. public static void release(Connection con){
  41. pool.addLast(con);
  42. }
  43.  
  44. }
  1. public class DBUtil {
  2.  
  3. private static String driverClass="com.mysql.jdbc.Driver";
  4. private static String url="jdbc:mysql://127.0.0.1:3306/map?useUnicode=true&amp;characterEncoding=utf-8";
  5. private static String userName="root";
  6. private static String password="root";
  7.  
  8. static{
  9. try {
  10. //加载驱动
  11. Class.forName(driverClass);
  12. } catch (ClassNotFoundException e) {
  13. // TODO Auto-generated catch block
  14. e.printStackTrace();
  15. }
  16. }
  17.  
  18. public static Connection getConnection() throws SQLException{
  19. return DriverManager.getConnection(url, userName, password);
  20. }
  21.  
  22. }

欢迎关注微信公众号【Java典籍】,收看更多Java技术干货!

  ▼微信扫一扫下图↓↓↓二维码关注

 

mysql通俗易懂的数据库连接池原理及模拟实现的更多相关文章

  1. Java数据库连接池原理与简易实现

    1.什么是数据库连接池 我们现在在开发中一定都会用到数据库,为了提高我们的系统的访问速度,数据库优化是一个有效的途径.我们现在开发中使用数据库一般都要经历以下的四个步骤:(1)加载数据库的驱动类,(2 ...

  2. JAVA和C#中数据库连接池原理与应用

    JAVA和C#中数据库连接池原理 在现在的互联网发展中,高并发成为了主流,而最关键的部分就是对数据库操作和访问,在现在的互联网发展中,ORM框架曾出不穷, 比如:.Net-Core的EFCore.Sq ...

  3. JDBC数据库连接池原理

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

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

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

  5. 【MySQL】自定义数据库连接池和开源数据库连接池的使用

    数据库连接池的概念 数据库连接背景 数据库连接是一种关键的.有限的.昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性 ...

  6. 数据库连接池原理 与实现(动脑学院Jack老师课后自己的练习有感)

    第一步: 首先创建一个数据库连接池的接口: 数据库连接池接口有两个主要的方法,其中一个getConnection();  通过数据库连接池返回给用户封装的数据库连接对象 createConnectio ...

  7. Java中数据库连接池原理机制的详细讲解

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

  8. Java中数据库连接池原理机制的详细讲解(转)

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

  9. DBCP数据库连接池原理分析

    在比较大的项目中,需要不断的从数据库中获取数据,Java中则使用JDBC连接数据库,但是获取数据库的连接可是相当耗时的操作,每次连接数据库都获得 .销毁数据库连接,将是很大的一个开销.为了解决这种开销 ...

随机推荐

  1. ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用

    本文简要说一下ASP.NET Core 在Docker中部署以及docker-compose的使用  (ASP.NET Core 系列目录). 系统环境为CentOS 8 . 打个广告,求职中.. 一 ...

  2. Linux下zkui的安装

    前提:部署好java环境 1.拉取安装包 git clone https://github.com/DeemOpen/zkui.git 2.进入zkui目录 cd zkui/ 3.使用mvn命令进行编 ...

  3. 在Mac OSX上运行Windows应用程序

    在Mac OSX中,借助wine,不需要安装虚拟机也可以运行Window应用程序. wine是一个在Linux和UNIX之上的,WIndows3.x和Windows APIs的实现.是运用API转换技 ...

  4. SpringBoot整合MybatisPlus3.X之逻辑删除(三)

    pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...

  5. @ConditionalOnProperty注解

    一 源码解析 查看ConditionalOnProperty的源码 package org.springframework.boot.autoconfigure.condition; import j ...

  6. markdown 入门教程(完整版)

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 1. 标题 Markdown支持6种级别的标题,对应html标签 h1 ~ h6 ...

  7. SpringBoot项目集成socketIo实现实时推送

    netty-socketio maven依赖 <dependency> <groupId>com.corundumstudio.socketio</groupId> ...

  8. 一篇文章让你彻底理解java中抽象类和接口

    目录 1.我所理解的抽象类 2.我所理解的接口 3.抽象类和接口本质区别 相信大家都有这种感觉:抽象类与接口这两者有太多相似的地方,又有太多不同的地方.往往这二者可以让初学者摸不着头脑,无论是在实际编 ...

  9. MIT线性代数:17.正交矩阵和Cram-Schmidt正交化

  10. netty源码解析(4.0)-28 ByteBuf内存池:PooledByteBufAllocator-把一切组装起来

    PooledByteBufAllocator负责初始化PoolArena(PA)和PoolThreadCache(PTC).它提供了一系列的接口,用来创建使用堆内存或直接内存的PooledByteBu ...