数据库连接池DBPool分析(一):简介
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
剛剛畢業(yè)的本科生,在研究了公司的框架之后,自己花了三天的時(shí)間用C++實(shí)現(xiàn)了簡(jiǎn)單的數(shù)據(jù)庫(kù)連接池,包括了Mysql。正在加入Redis的支持。請(qǐng)?jiān)L問(wèn)我的github:https://github.com/adairjun/DBPool
概述
所謂池的概念,就是一次性向系統(tǒng)申請(qǐng)多個(gè)資源并保存下來(lái),等到程序需要向系統(tǒng)申請(qǐng)資源的時(shí)候,就直接向池當(dāng)中去申請(qǐng)。相當(dāng)于在執(zhí)行程序和系統(tǒng)資源之間加了一層。
有高人云:“計(jì)算機(jī)科學(xué)領(lǐng)域的任何問(wèn)題, 都可以通過(guò)添加一個(gè)中間層來(lái)解決”
那么這個(gè)池作為中間層解決了什么問(wèn)題呢?
1,性能的提升:數(shù)據(jù)庫(kù)連接是一種極耗系統(tǒng)資源的操作,尤其是在多層結(jié)構(gòu)的應(yīng)用環(huán)境中,這種資源的耗費(fèi)對(duì)系統(tǒng)性能影響尤為明顯。我實(shí)習(xí)的時(shí)候,部門經(jīng)理告訴我,框架性能的壓力大部分集中在數(shù)據(jù)庫(kù)的IO上,這是在他review我的代碼的時(shí)候說(shuō)的,當(dāng)時(shí)我寫(xiě)的數(shù)據(jù)庫(kù)接口訪問(wèn)Mysql,本來(lái)可以一條SELECT語(yǔ)句查詢出結(jié)果,再使用循環(huán)將結(jié)果寫(xiě)入到vector當(dāng)中,但是我卻是在循環(huán)當(dāng)中使用了SELECT語(yǔ)句,導(dǎo)致了多次查詢。經(jīng)理告訴我相同功能的查詢語(yǔ)句,由于打開(kāi)關(guān)閉數(shù)據(jù)庫(kù)連接的次數(shù)不同導(dǎo)致兩個(gè)查詢語(yǔ)句耗費(fèi)的時(shí)間差別很大。
2,內(nèi)存碎片(memory fragmentation)的問(wèn)題,這個(gè)是對(duì)于內(nèi)存池來(lái)說(shuō)的。
3,線程池,減少線程創(chuàng)建的開(kāi)銷,而且在請(qǐng)求到達(dá)時(shí)候線程已經(jīng)存在了,所以無(wú)意中也消除了線程創(chuàng)建所帶來(lái)的延遲。這樣,就可以立即為請(qǐng)求服務(wù),使應(yīng)用程序響應(yīng)更快。
用到的庫(kù)
1,libmysqlclient-dev mysql的API
2,hiredis redis的API 需要在github上下載:https://github.com/redis/hiredis
3,boost 準(zhǔn)標(biāo)準(zhǔn)庫(kù)
4,gtest google的測(cè)試框架:https://github.com/google/googletest
使用DBPool的configure.sh這個(gè)腳本可以快速安裝需要的庫(kù):
這個(gè)腳本當(dāng)中的rootness()這個(gè)函數(shù)借鑒了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
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://my.oschina.net/adairjun/blog/511560
總結(jié)
以上是生活随笔為你收集整理的数据库连接池DBPool分析(一):简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java虚拟机7:内存分配原则
- 下一篇: linux安装和配置 mysql、red