数据库访问

访问数据库主要有以下几个步骤:

  1. 加载数据库驱动
  2. 创建数据库连接
  3. 执行访问操作并处理执行结果
  4. 关闭连接,释放资源

在每一次请求数据库都要经历上述过程,创建连接和释放资源也都是些重复性的动作,当请求量比较大时,资源是个很大的浪费。如何优化呢,可以使用连接池。

连接池

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

原理分析

数据库连接是访问数据库必须的,可以在系统初始化时提前创建一定数量的连接,保存起来,当有创建连接的请求过来时,就直接拿出来,标记为使用中(避免与其他请求拿到同一个),使用完后,再放回连接池中。过程如下

  1. 系统在启动时初始化连接池;
  2. 向连接池请求可用的数据库连接;
  3. 如果没有获取到可用的数据库连接,并且连接池中连接的数量小于最大连接数,则按照规定的步长给连接池中添加连接,然后再获取,如果连接池中的数量已经到了最大连接数还没有获取到可用的连接,则等待其他请求释放了连接后再获取;
  4. 使用获取到的数据库连接请求数据库;
  5. 将数据库连接放回连接池,供其他连接使用;

简单模拟实现

/** * 连接池对象 */public class Pool { private String driver = null;//数据库驱动 private String url = null;//连接地址 private String username = null;//用户 private String password = null;//密码 //初始化连接数 private static int initSize = 2; //池中最大连接数 private static int maxSize = 5; //每次创建的连接数 private static int stepSize = 2; //超时时间 private static int timeout = 2000; //用来保存创建的数据库连接 private List connectionPool = new ArrayList(); private Lock lock = new ReentrantLock(); public Pool(String driver, String url, String username, String password) throws Exception { this.driver = driver; this.url = url; this.username = username; this.password = password; //创建连接池时初始化initSize个数据库连接放入池中 resizePool(initSize); } /** * 初始化连接池 * @param num 初始时按照initSize给池中添加连接,其他时候按照stepSize给池中加 */ private void resizePool(int num) throws Exception { //池中现有的连接数 int currentNum = connectionPool.size(); //池中的连接数不能超过设置的最大连接数 if (maxSize < currentNum + num) { num = maxSize - currentNum; } //创建连接放入池中 for(int i=0; i 0){ //获取一个空闲的数据库连接 conn = getFreeConnFromPool(); //没有获取到连接 while(conn == null){ //隔2秒 重新获取 System.out.println(Thread.currentThread().getName() + " 等待获取连接"); Thread.sleep(2000); conn = getFreeConnFromPool(); } } return conn; } /** * 从连接池中获取空闲的连接 * @return */ private Connection getFreeConnFromPool() throws Exception { Connection conn = null; //获取可用的连接 conn = findAvailableConn(); //没有获取到可用的连接 if(conn == null){ //重新添加数据库连接到连接池中 resizePool(stepSize); //获取可用的连接 conn = findAvailableConn(); } return conn; } /** * 获取一个可用的连接 * @return * @throws Exception */ private Connection findAvailableConn() throws Exception { Connection conn = null; if(connectionPool.size() > 0){ for(PooledConnection cip : connectionPool){ if(!cip.isBusy()){ conn = cip.getConn(); cip.setBusy(true);//获取后将当前连接状态标记为 执行 //判断当前连接是否可用 if(!conn.isValid(timeout)){ //conn.isValid如果连接未关闭且有效,则返回true //当前连接池连接的数据库连接有问题,创建一个新的数据库连接代替它 conn = createConnection(); cip.setConn(conn); } break; } } } return conn; } /** * 把连接返回连接池 * 把连接返回给连接池就是把状态标记为‘闲’,可以让其他请求使用 */ public void returnConnToPool(Connection conn){ for (PooledConnection cip : connectionPool) { if (cip.getConn() == conn) { cip.setBusy(false);//设置为空闲 System.out.println(Thread.currentThread().getName() + " 释放了连接"); break; } } }}/** * 连接池中的连接对象 */public class PooledConnection { //数据库连接 private Connection conn; //用于标识当前数据库连接的状态 true:执行 false:空闲 private boolean busy; public PooledConnection(Connection conn) { this.conn = conn; } // 此处省略get set方法}

测试

public class App { public static void main(String[] args) throws Exception { //创建一个连接池 Pool pool = new Pool("com.mysql.jdbc.Driver

jsp获取连接池的实时连接数_数据库连接池原理分析及模拟实现相关推荐

  1. mysql连接池和最大连接数_数据库连接池和mysql的最大连接数的区别

    什么叫做数据库连接池 连接池的作用是什么? 数据库连接池,简称dbcp database connection pool 存在意义: 数据库的连接是非常耗费系统资源的,一个应用通常都是需要与数据库打交 ...

  2. weblogic连接池不释放问题解决_数据库连接池引起的FullGC问题,看我如何一步步排查、分析、解决...

    作者:sneak 链接https://juejin.im/post/5ef800636fb9a07e66233884 来源:掘金 问题现象 在某个工作日,突然收到线上的服务告警,有大量的请求延时产生, ...

  3. jsp获取连接池的实时连接数_一篇看懂数据库连接池概念、原理、运行机制

    概述 数据库连接池是负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个.那么其中的运行机制又是怎样的呢?今天主要介绍一下数据库连接池原理和常用的连接池. ...

  4. c#打开数据库连接池的工作机制_数据库连接池-tomcat-jdbc使用笔记

    现在 主流的数据库连接池有:Proxool.C3P0.DBCP.tomcat-jdbc.Druid.其中tomcat-jdbc是tomcat服务器比较可靠的 数据库连接池. Tomcat 在 7.0 ...

  5. gc问题mysql连接池_数据库连接池引起的FullGC问题,看我如何一步步排查、分析、解决...

    问题现象 在某个工作日,突然收到线上的服务告警,有大量的请求延时产生,查看线上服务发现基本上都是获取数据库连接超时,而且影响时间只有3~4秒钟,服务又恢复了正常.隔了几分钟之后,又出现了大量的告警,还 ...

  6. mysql连接池的原理_数据库连接池的实现及原理

    对于一个简单的数据库应用,由于对于数据库的访问不是很频繁.这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销.但是对于一个复杂的数据库应用,情况 ...

  7. 数据库连接数和数据库连接池的连接数区别?

    1.数据库连接数,也就是一个数据库,最多能够同时 接受 多少个 客户的连接. 2.在没有数据库连接池 的情况下, 一个客户,每次访问, 就要创建一个 数据库连接, 执行 SQL, 获取结果, 然后关闭 ...

  8. eclipse链接mysql数据池配置_Tomcat+mysql+eclipse数据库连接池配置

    一.开发工具 1.tomcat版本:tomcat5.5.27 2.mysql版本:mysql 5.1 3.数据库驱动程序:mysql-connector-java-5.1.9 4.eclipse版本: ...

  9. jsp获取连接池的实时连接数_PHP进阶教程-实现一个简单的MySQL连接池

    ​什么是连接池? 顾名思义,连接池就是一堆预先创建好的连接,跟容器会有点像.连接池主要是在某种需要网络连接的服务,提前把连接建立好存起来,然后存放在一个池子里面,需要用到的时候取出来用,用完之后再还回 ...

最新文章

  1. 新 IDE 出现,程序员迎来危机?
  2. mysql 新增更新_MySQL新增数据,存在就更新,不存在就添加(转帖加实测)
  3. GridView:根据单元格的值给单元格着色
  4. ios 重复引用 静态库_Swift 制作静态库
  5. Something about WMI
  6. MATLAB IIR滤波器设计函数buttord与butter
  7. 工作中那些有用的工具
  8. 【车牌识别】基于matlab APP模板匹配车牌识别(桂贵京粤苏渝)【含Matlab源码 217期】
  9. 人工智能ai算法_AI算法比您想象的要脆弱得多
  10. matlab二重定积分_matlab求二重积分
  11. 基于单片机智能药盒控制系统设计(含论文)
  12. 高德地图JS--批量规划步行路线 优化
  13. 《iOS成长之路》开放订阅,和故胤道长 、张嘉夫 、onevcat、叶孤城、没故事的卓同学等技术大牛共同成长
  14. MyBatisCodeHelper-Pro2.8.2
  15. 【Arduino】PTC热敏电阻的介绍和应用
  16. html 用户列表,用户列表.html
  17. 数据分析: kaggle比赛 - 销量预测
  18. 中国工程院院士刘韵洁:中国未来网络创新环境CENI的探索
  19. Redis数据类型——hash
  20. 服务器 进 pe系统安装系统安装系统,用U盘安装系统之PE安装.doc

热门文章

  1. LeetCode 30. Substring with Concatenation of All Words
  2. Webpack学习大纲
  3. python argparse 入门
  4. JS History
  5. javascript 函数,数组,document.write()
  6. c#之 quartz的学习
  7. Spark2.2(三十九):如何根据appName监控spark任务,当任务不存在则启动(任务存在当超过多久没有活动状态则kill,等待下次启动)...
  8. loj10157. 「一本通 5.2 例 5」皇宫看守
  9. 循环数组的动态规划问题
  10. GMQ区块链生态系统平行链,未来将应用于众多产业