mysql++ Connect
mysqlpp:: Connect类型主要负责连接事宜
mysqlpp::OpeitonalExceptions
查看源码发现OptionalExceptions就是一个表示“是否需要抛出异常”的变量的包装。在Connection类型的内容,会在出现错误的时候调用OpetionalExceptions.throw_exceptions( )方法来查看是否需要使用异常的手段来表示错误。
mysqlpp::Connection
这个类型是用户程序能够看到的少数几个类型,它所包含的主要的方法就是“连接/断开”,“创建/删除/选择数据库",”查看table数据行数“,“创建Query对象”,”关闭mysql服务等操作“。
该类可以返回一个mysqlpp::Query类型,主要负责查询操作。另外,查看mysqlpp::Query源码发现它的构造函数必定需要一个mysqlpp::Connection,也就是说mysqlpp::Query的所有操作,其实也就是再次调用mysqlpp::Connection的对应方法,在由Connection调用mysqlpp::DBDriver来处理操作。
连接池
对于一个简单的数据库应用,对于数据库的访问不是很频繁,这时在需要访问数据库时,新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销。但是对于一个复杂的数据库应用,情况就完全不同了,频繁的建立、关闭连接,会极大的减低系统的性能,因为对于连接的使用成了系统性能的瓶颈。数据库连接池的基本原理是在内部对象池中维护一定数量的数据库连接,并对外暴露数据库连接获取和返回方法。用户使用完后将连接返回,此时连接并没有关闭,而是由连接池管理器回收,并为下一次使用做好准备。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。。这项技术能明显提高对数据库操作的性能。
mysqlpp::ConnectionPool
此类主要维护一个双向链表std::list<ConnectionInfo> PoolT,结构体内容包含:连接对象,是否在使用,上次使用时间,既然是链表就很容易的知道连接池当前的连接数及对连接增加删除操作
virtual Connection* exchange(const Connection* pc); //
virtual Connection* grab(); //从连接池获取一个连接,如果没有则创建一个
Connection* safe_grab(); //从连接池获取一个可用的连接
virtual void release(const Connection* pc); //将一个连接置为未使用状态
void shrink() //从连接池删除未使用的连接
连接池的使用
mysqlpp::ScopedConnection
通过构造函数从连接池中获取一个Connection,析构函数将Connection对象重新放到连接池。
此类中维护了一个指向Connection指针,可以执行Connection的操作
MysqlConnectPool.h
#ifndef _MYSQL_CONNECT_POOL_H_ #define _MYSQL_CONNECT_POOL_H_ #include <mysql++/mysql++.h> #include <string> class MysqlConnectPool : public mysqlpp::ConnectionPool { public: MysqlConnectPool(std::string dbname, std::string serverip, std::string user, std::string passwd, int port, std::string charset) :m_dbname(dbname) ,m_server_ip(serverip) ,m_user(user) ,m_password(passwd) ,m_charset(charset) ,m_port(port) { m_max_idle_time = 300; } virtual ~MysqlConnectPool() { clear(); } const std::string& getDBName() const { return m_dbname; } const std::string& getServerIP() const { return m_server_ip; } const std::string& getUser() const { return m_user; } const std::string& getPassword() const { return m_password; } const std::string& getCharset() const { return m_charset; } int getPort() const { return m_port; } void setMaxIdleTime(int max_idle) { m_max_idle_time = max_idle; } virtual mysqlpp::Connection* grab() { return mysqlpp::ConnectionPool::grab(); } virtual void release(const mysqlpp::Connection* pc) { mysqlpp::ConnectionPool::release(pc); } protected: virtual mysqlpp::Connection* create() { mysqlpp::Connection* conn = new mysqlpp::Connection(true); mysqlpp::SetCharsetNameOption* pOpt = new mysqlpp::SetCharsetNameOption(m_charset.c_str()); conn->set_option( pOpt ); conn->connect(m_dbname.empty() ? 0 : m_dbname.c_str(), m_server_ip.empty() ? 0 : m_server_ip.c_str(), m_user.empty() ? 0 : m_user.c_str(), m_password.empty() ? "" : m_password.c_str(), m_port); return conn; } virtual void destroy(mysqlpp::Connection* cp) { delete cp; } virtual unsigned int max_idle_time() { return m_max_idle_time; } private: std::string m_dbname; std::string m_server_ip; std::string m_user; std::string m_password; std::string m_charset; int m_port; int m_max_idle_time; }; #endif
#include <memory> #include <mysql++/ssqls.h> #include <iostream> #include <fstream> #include <vector> #include <iostream> #include <iostream> #include "MysqlConnectPool.h" std::shared_ptr<MysqlConnectPool> db_pool = nullptr; std::string db_name = "test"; std::string db_ip = "127.0.0.1"; std::string db_user = "root"; std::string db_passwd = "123456"; int db_port = 3306; std::string db_charset = "utf8"; int main() { db_pool = std::make_shared<MysqlConnectPool>(db_name, db_ip, db_user, db_passwd, db_port, db_charset); for (int i = 0; i < 10; i++) { try { mysqlpp::ScopedConnection conn(*db_pool); mysqlpp::Query query = conn->query(); //................................ } catch (const mysqlpp::Exception& e) { std::cout << "error:" << e.what() << "\n"; return false; } } return 0; }