mysql c++ driver(连接池)

匿名 (未验证) 提交于 2019-12-02 22:06:11

头文件:

#pragma once #include <string> #include <list> #include <thread> #include <mutex> #include <cppconn\driver.h> #include <cppconn\exception.h> #include <cppconn\resultset.h> #include <cppconn\statement.h> #include <cppconn\sqlstring.h>  using namespace std; using namespace sql;  class MysqlConnPool { public:     ~MysqlConnPool();     shared_ptr<Connection> getConn();     void releaseConn(shared_ptr<Connection> conn);     static MysqlConnPool *ins();  private:     shared_ptr<Connection> createConnection(); //创建一个连接     void initConnPool();     MysqlConnPool(const char *url, const  char *user, const char *password, int maxSize); //构造方法     list<shared_ptr<Connection>> connList;     mutex lock; //线程锁     static MysqlConnPool *connPool;     Driver *driver;     SQLString url;     SQLString user;     SQLString pwd;     int poolSize;  };

源文件:

#include "stdafx.h" #include "MysqlConnPool.h"  MysqlConnPool *MysqlConnPool::connPool =  new MysqlConnPool("tcp://192.168.1.99:3306", "chuer", "123456", 10);  MysqlConnPool::MysqlConnPool(const char * url, const char * user, const char * password, int maxSize) {     this->url = url;     this->user = user;     this->pwd = password;     this->poolSize = maxSize;     this->driver = get_driver_instance();     initConnPool(); }  void MysqlConnPool::initConnPool() {     for (int i = 0; i < this->poolSize; ++i) {         connList.push_back(createConnection());     } }  shared_ptr<Connection> MysqlConnPool::createConnection() {     //建立连接     try {         Connection *conn = driver->connect(this->url, this->user, this->pwd);         shared_ptr<Connection> conSpt(conn);         return conSpt;     } catch (exception &e) {         cout << "createConnection error:" << e.what() << endl;     } }   MysqlConnPool *MysqlConnPool::ins() {     return connPool; }   shared_ptr<Connection> MysqlConnPool::getConn() {     cout << "pool size:" << connList.size() << endl;     lock.lock();     if (connList.size() > 0){         shared_ptr<Connection> conn = connList.front();         connList.pop_front();         if (conn->isClosed())  {             conn.reset();             return createConnection();         }          lock.unlock();         return conn;     } else {         lock.unlock();         return createConnection();     } }  void MysqlConnPool::releaseConn(shared_ptr<Connection> conn) {     if (conn->isClosed()) {         conn.reset();         lock.lock();         connList.push_back(createConnection());         lock.unlock();     } else {         connList.push_back(conn);     } }  MysqlConnPool::~MysqlConnPool() {     while (connList.size() > 0) {         shared_ptr<Connection> con = connList.front();         con.reset();         connList.pop_front();     }     delete connPool; } 
void testConn(){     MysqlConnPool *pool = MysqlConnPool::ins();      try {         shared_ptr<Connection> con = pool->getConn();          /* 连接 MySQL 数据库 test  */         con->setSchema("game");         cout << "con.isClosed() :" << con->isClosed() << endl;          shared_ptr<Statement> stmt(con->createStatement());         shared_ptr<ResultSet>  res(stmt->executeQuery("select * from user"));         cout << "row count:" << res->rowsCount() << endl;          while (res->next()) {             cout << "id:" << res->getInt("id") << " name:" << res->getString("name").c_str() << endl;         }          pool->releaseConn(con);     } catch (sql::SQLException &e) {         cout << "ERR:" << e.what() << endl;;     }      cout << endl; }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!