c++ 实现数据库连接池
来源:互联网 发布:月光砖厂淘宝店 编辑:程序博客网 时间:2024/06/11 10:33
c++ 实现数据库连接池
自己尝试用c++ 新标准实现了数据库连接池,代码简化了很多。
思路:
将数据库的连接当作一个对象添加进list队列中,在连接池创建的时候就建立好队列,并添加自定义大小的连接对象,连接对象用智能指针来管理(现代c++中不应该出现delete语句),避免类似内存泄漏等内存问题,智能指针上用lambda表达式注册了delete删除函数来释放连接资源,及时归还,(其中用了std::move来转移list中的对象所有权到函数里的临时智能指针对象,当离开作用域时,自动释放。)
关于数据库连接池介绍可以看下面两篇文章:
浅析数据库连接池(一)
浅析数据库连接池(二)
代码:
mysql_connect.h
<code class="language-c++ hljs cpp has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#ifndef _MYSQL_CONNECTION_</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#define _MYSQL_CONNECTION_</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//c++</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <iostream></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <string></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <list></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <memory></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <functional></span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//mysql driver</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <mysql_driver.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <mysql_connection.h></span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//mysql execute</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <cppconn/driver.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <cppconn/statement.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <cppconn/prepared_statement.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <cppconn/resultset.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <exception></span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//thread mutex </span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <mutex></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">namespace</span> sql;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> delFunc = <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::function<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>(Connection*)>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> ConnectionPool{ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>: <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//获取数据库连接池对象 static单例模式</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> ConnectionPool* getInstance(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//得到一条连接</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">auto</span> getConnect()-><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shared_ptr</span><Connection>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//归还一条连接</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">auto</span> retConnect(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shared_ptr</span><Connection> &ret)-><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>; ~ConnectionPool(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span>: ConnectionPool(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> name, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> pwd, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> nurl, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> maxSize); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化连接池</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">auto</span> initConnectPool(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> initialSize)-><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//毁坏连接池</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">auto</span> destoryPool()-><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//destory one connection</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">auto</span> destoryOneConn()-><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//扩大数据库连接池</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">auto</span> expandPool(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> size)-><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//缩小数据库连接池</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">auto</span> reducePool(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> size)-><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//add conn</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">auto</span> addConn(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> size)-><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>: <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//get size</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">auto</span> getPoolSize()-><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span>: <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> username; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//帐号</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> password; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//密码</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> url; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//连接url</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> poolSize; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//pool size</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//存放所有连接</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">list</span><<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shared_ptr</span><Connection></span>> conList; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> ConnectionPool *pool;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//连接池对象</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::mutex lock;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//锁</span> Driver *driver;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//mysql driver</span>};<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#endif</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li></ul>
mysql_connect.cpp
<code class="language-c++ hljs cpp has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <stdio.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <stdlib.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <assert.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include "mysql_connect.h"</span>ConnectionPool*ConnectionPool::pool = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nullptr</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//private</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//构造函数</span>ConnectionPool::ConnectionPool(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> name, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> pwd, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> nurl, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> maxSize): username(name), password(pwd), url(nurl), poolSize(maxSize){ <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//得到mysql驱动</span> driver = get_driver_instance(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//开始初始化大小一半</span> initConnectPool(poolSize/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>);}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//析构函数</span>ConnectionPool::~ConnectionPool(){ destoryPool();}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//得到连接池大小</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>ConnectionPool::getPoolSize(){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> conList.size();}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//增加连接</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>ConnectionPool::addConn(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> size){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < size; ++i) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建连接</span> Connection *conn = driver->connect(url, username, password); <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shared_ptr</span><Connection> sp(conn, [](Connection *conn){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">delete</span> conn; }); conList.push_back(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::move(sp)); }}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化连接池</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>ConnectionPool::initConnectPool(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> initialSize){ <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//加锁,增添一个连接</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::lock_guard<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::mutex> locker(lock); addConn(initialSize);}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//销毁一个连接</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>ConnectionPool::destoryOneConn(){ <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//智能指针加std::move转移一个连接的“所有权”,当出作用域时,自动调用关闭connect</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shared_ptr</span><Connection> &&sp = <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::move(conList.front()); sp->close(); --poolSize;}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//销毁整个连接池</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> ConnectionPool::destoryPool(){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">auto</span> &conn : conList) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//依次转移所有权,出作用域时,关闭连接,出作用域时智能指针自动释放</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shared_ptr</span><Connection> &&sp = <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::move(conList.front()); sp->close(); }}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//扩大连接池</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>ConnectionPool::expandPool(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> size){ <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::lock_guard<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::mutex> locker(lock); addConn(size); poolSize += size;}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//缩小连接池</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>ConnectionPool::reducePool(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> size){ <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::lock_guard<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::mutex> locker(lock); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//减小的大小不能超过存储的大小</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(size > poolSize) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < size; i++) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//sp point new object, old object release</span> destoryOneConn(); } poolSize -= size;}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//public</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//得到连接池实例</span>ConnectionPool*ConnectionPool::getInstance(){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(pool == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nullptr</span>) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//3306是mysql占用的端口,其实创建40个连接</span> pool = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ConnectionPool(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"root"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"********"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"tcp://127.0.0.1:3306"</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">40</span>); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> pool;}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//得到一个连接</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shared_ptr</span><Connection>ConnectionPool::getConnect(){ <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::lock_guard<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::mutex> locker(lock); <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shared_ptr</span><Connection> sp = conList.front(); conList.pop_front(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> sp;}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//归还一个连接</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>ConnectionPool::retConnect(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shared_ptr</span><Connection> &ret){ <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::lock_guard<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::mutex>locker(lock); conList.push_back(ret);}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li><li style="box-sizing: border-box; padding: 0px 5px;">118</li><li style="box-sizing: border-box; padding: 0px 5px;">119</li><li style="box-sizing: border-box; padding: 0px 5px;">120</li><li style="box-sizing: border-box; padding: 0px 5px;">121</li><li style="box-sizing: border-box; padding: 0px 5px;">122</li><li style="box-sizing: border-box; padding: 0px 5px;">123</li><li style="box-sizing: border-box; padding: 0px 5px;">124</li><li style="box-sizing: border-box; padding: 0px 5px;">125</li><li style="box-sizing: border-box; padding: 0px 5px;">126</li><li style="box-sizing: border-box; padding: 0px 5px;">127</li><li style="box-sizing: border-box; padding: 0px 5px;">128</li><li style="box-sizing: border-box; padding: 0px 5px;">129</li><li style="box-sizing: border-box; padding: 0px 5px;">130</li><li style="box-sizing: border-box; padding: 0px 5px;">131</li><li style="box-sizing: border-box; padding: 0px 5px;">132</li><li style="box-sizing: border-box; padding: 0px 5px;">133</li><li style="box-sizing: border-box; padding: 0px 5px;">134</li><li style="box-sizing: border-box; padding: 0px 5px;">135</li><li style="box-sizing: border-box; padding: 0px 5px;">136</li></ul>
try.cpp
<code class="language-c++ hljs cpp has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <stdio.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <stdlib.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <assert.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <mysql_connect.h></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <unistd.h></span>ConnectionPool *pool = ConnectionPool::getInstance();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> argc, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> *argv[]){ <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shared_ptr</span><Connection>con; Statement *state; ResultSet *result; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//获得一个连接</span> con = pool->getConnect(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//获得一个数据库连接对象</span> state = con->createStatement(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//使用XL_db这个数据库</span> state->execute(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"use XL_db"</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//查询语句</span> result = state->executeQuery(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"select * from UserInfo;"</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(result->next()) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> id = result->getInt(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"uid"</span>); <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> name = result->getString(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"password"</span>); <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span> << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"id:"</span> << id << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" name:"</span> << name << <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::endl; } sleep(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>); pool->retConnect(con); <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span> << pool->getPoolSize() << <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::endl; sleep(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> EXIT_SUCCESS;}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li></ul>
我自己进行了测试,创建数据库连接池,调用一个对象,然后执行数据库连接,查询出了结果,然后归还一个连接。
创建连接池前
创建连接池后
Id 792是我调用的那个连接,然后执行查询操作,所以db显示的是连接上XL_db。
这个是自己写的一个简单的数据库连接池,可以参考下,如果要使用的话还需要自己改改。
这些××池之类,比如线程池,进程池,连接池等原理都差不多,就是先创建一批对象,然后一个队列里保存,需要的时候来取,用完归还就行,然后通过c++11新特性等我们能提升性能和安全性以及程序的简介性,比如刚才说的std::move和智能指针,lambda等。
0 0
- C实现PHP的mysql数据库连接池
- 纯c语言实现数据库连接
- 基于Mysql Connector(C++)的数据库连接池的实现
- 基于Mysql Connector(C++)的数据库连接池的实现
- 基于Mysql Connector(C++)的数据库连接池的实现
- 基于Mysql Connector(C++)的数据库连接池的实现
- Mysql Connector(C++)的数据库连接池的实现
- java实现数据库连接池
- 数据库连接池实现原理
- 自己实现数据库连接池
- Java数据库连接池实现
- 自己实现数据库连接池
- 数据库连接池-DataSource实现
- JAVA数据库连接池实现
- 数据库连接池实现
- 数据库连接池实现原理
- Java 数据库连接池 实现
- JAVA数据库连接池实现
- ImportError: No module named win32api
- 不一定会执行finally代码块的两个例子
- Android 5.1_ActivityManagerService 系列学习计划
- 输出数字三角阵
- I/O流的梳理和小结
- c++ 实现数据库连接池
- Bower文件无效:Name must be lowercase
- 选择排序
- 负载均衡sesion共享
- 设计模式--Singleton模式
- 中国剩余定理
- 设置延时执行
- ss加速器-Shadowsocks完全是垃圾, 9快钱的套餐根本没法用, 客服的回答更绝
- 系统架构设计之微服务(Microservice)