2019独角兽企业重金招聘Python工程师标准>>>

刚刚毕业的本科生,在研究了公司的框架之后,自己花了三天的时间用C++实现了简单的数据库连接池,包括了Mysql。正在加入Redis的支持。请访问我的github:https://github.com/adairjun/DBPool

概述

所谓池的概念,就是一次性向系统申请多个资源并保存下来,等到程序需要向系统申请资源的时候,就直接向池当中去申请。相当于在执行程序和系统资源之间加了一层。
有高人云:“计算机科学领域的任何问题, 都可以通过添加一个中间层来解决”
那么这个池作为中间层解决了什么问题呢?


1,性能的提升:数据库连接是一种极耗系统资源的操作,尤其是在多层结构的应用环境中,这种资源的耗费对系统性能影响尤为明显。我实习的时候,部门经理告诉我,框架性能的压力大部分集中在数据库的IO上,这是在他review我的代码的时候说的,当时我写的数据库接口访问Mysql,本来可以一条SELECT语句查询出结果,再使用循环将结果写入到vector当中,但是我却是在循环当中使用了SELECT语句,导致了多次查询。经理告诉我相同功能的查询语句,由于打开关闭数据库连接的次数不同导致两个查询语句耗费的时间差别很大。

2,内存碎片(memory fragmentation)的问题,这个是对于内存池来说的。

3,线程池,减少线程创建的开销,而且在请求到达时候线程已经存在了,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。

用到的库

1,libmysqlclient-dev mysql的API
2,hiredis redis的API 需要在github上下载:https://github.com/redis/hiredis
3,boost 准标准库
4,gtest google的测试框架:https://github.com/google/googletest

使用DBPool的configure.sh这个脚本可以快速安装需要的库:
这个脚本当中的rootness()这个函数借鉴了lamp的配置脚本:


#!/bin/bash
# Make sure only root can run our script
function rootness()
{if [[ $EUID -ne 0 ]]; thenecho "Error:This script must be run as root!" 1>&2exit 1fi
}function install_gtest()
{wget https://codeload.github.com/google/googletest/tar.gz/release-1.7.0 tar -zxvf googletest-release-1.7.0.tar.gzcd googletest-release-1.7.0/g++ -isystem ./include -I. -pthread -c ./src/gtest-all.cc               ar -rv libgtest.a gtest-all.ocp -r ./include/gtest/ /usr/local/includecp ./libgtest.a /usr/local/libcd ..rm -rf googletest-release-1.7.0.tar.gz/
}function install_hiredis()
{wget https://codeload.github.com/redis/hiredis/tar.gz/v0.13.3tar -zxvf hiredis-0.13.3.tar.gz cd hiredis-0.13.3/make make install
}rootnessif [ ! `whereis yum | gawk '{print $2}'` = "" ]
thenecho -ne "\033[32m"; echo "*************start install mysql and boost********"; echo -ne "\033[0m"yum -y install mysql-serveryum -y install redisyum -y install mysql-develyum -y install mysql-libsyum -y install boost boost-devel boost-doc
fiif [ ! `whereis apt-get | gawk '{print $2}'` = "" ]
thenecho -ne "\033[32m"; echo "*************start install mysql and boost********"; echo -ne "\033[0m"apt-get -y install mysql-serverapt-get -y install redis-serverapt-get -y install libmysqlclient-devapt-get -y install libmysqld-devapt-get -y install libboost-dev
fiinstall_gtest
install_hiredis

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/adairjun/blog/511560

数据库连接池DBPool分析(一):简介相关推荐

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

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

  2. 数据库连接池,实现及分析

    在我们日常对数据库操作时存在一个问题,要为每次数据操作请求建立一个数据库连接.而每次建立连接都需要花费很多开销,如加载驱动类.注册驱动.获取连接,这样如果在短时间内连接多次,就 会耗费多余的时间(加载 ...

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

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

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

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

  5. Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索

    Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索 简介 在上文中探索了数据库连接池的获取,下面接着初步来探索下数据库连接的关闭,看看其中具体执行了那些操作 连接关闭 下面的具体的代 ...

  6. Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索

    Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索 简介 在上篇文章中,了解了连接池的应用场景和本地运行了示例,本篇文章中,我们尝试来探索下Alibaba Druid数据库连接池的整 ...

  7. JDBC中C3PO数据库连接池详解

    -----------------------------------------------------JDBC中C3PO数据库连接池详解------------------------------ ...

  8. 主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)

    http://developer.51cto.com/art/201807/579402.htm 主流数据库连接池 常用的主流开源数据库连接池有C3P0.DBCP.Tomcat Jdbc Pool.B ...

  9. 线上问题分析系列:数据库连接池内存泄漏问题的分析和解决方案

    前言 本文来自好朋友彪哥整理,实际的生产问题分析,绝对干货~ 一.问题描述 上周五晚上主营出现部分设备掉线,经过查看日志发现是由于缓存系统出现长时间gc导致的.这里的gc日志的特点是: 1.gc时间都 ...

最新文章

  1. pandas使用apply函数:在dataframe数据列(column)上施加(apply)函数
  2. live555工程建立与调试
  3. JavaScript数据结构与算法——栈详解
  4. 求正整数N(N1)的质因数的个数,相同的质因数需要重复计算(java)
  5. vue —— UI组件库
  6. android xml导进数据库,Android通过xml文件配置数据库
  7. sql isnull函数_SQL ISNULL函数
  8. 刘强东卸任京东 CEO,“二号位”徐雷接棒:三大电商巨头“二把手”正式集齐
  9. 移动硬盘(U盘)病毒对数据的破坏
  10. java数组清空能释放jvm内存嘛_JVM面试题汇总
  11. oracle用户删除了可以恢复吗,恢复用户误删除的没备份的Oracle数据文件
  12. 用代码查询ASCII码和Unicode码表序号
  13. 测试用例设计方法-正交试验常用正交表
  14. 已知地球上某两个点的坐标(即经纬度),求两点的实际距离。uniapp实现(实现语法js)
  15. iOS 超好用的本地视频播放器推荐!
  16. 一文了解智能门锁的功能选购和安全性
  17. 封装仿支付宝密码输入效果
  18. 代码统计工具实测点评
  19. Nginx 服务器配置域名证书
  20. Latex 伪代码、三线表与多线表

热门文章

  1. ROS学习(七):ROS launch 文件
  2. linux系统防火墙相关问题及常用命令介绍
  3. 【Eclipse中使用Git之一】把远程仓库的项目,clone到eclipse里面
  4. [bzoj 1954]Pku3764 The xor-longest Path
  5. nginx 安装 虚拟主机
  6. 【系统架构师修炼之道】(13):操作系统基础知识——进程基础知识
  7. 打开组策略时提示inetres.admx管理模板解析出错解决方法
  8. 系统文件打开检测脚本
  9. C语言中struct, union, enum 三大复合数据类型
  10. windows azure之创建虚拟机