4.1进行网站建设与推广wordpress主题模板收费会员系统
web/
2025/10/9 0:57:03/
文章来源:
4.1进行网站建设与推广,wordpress主题模板收费会员系统,流程页面设计,陕西建设厅网站首页为什么要用数据库连接池#xff1f;
我们的网站允许用户注册#xff0c;在没有池的情况下#xff0c;假设只有一个人#xff0c;那么流程就是#xff0c;用户点击注册#xff0c;通过socket将用户的账号和密码发送到服务器#xff0c;然后就需要创建MySQL数据库连接
我们的网站允许用户注册在没有池的情况下假设只有一个人那么流程就是用户点击注册通过socket将用户的账号和密码发送到服务器然后就需要创建MySQL数据库连接然后插入数据插入完毕后销毁该连接然而当用户很多时这个设计就会花费大量的时间在数据库连接的创建和释放上。为了避免这种情况引入池的概念在程序初始化的时候集中建立多个数据库连接并集中管理供程序使用更见安全和可靠。
池是一组资源的机会这组资源在服务器启动之初就被完全创建好并初始化池是资源的容器实现对资源的复用。是一种用空间换时间的技术。当系统开始处理客户请求的时候如果需要相关资源直接从池中获取无需动态分配当服务器处理完一个客户连接口将相关资源放回池中无需执行系统调用来释放资源。
如何设计
class connection_pool
{
public:MYSQL *GetConnection(); //获取数据库连接bool ReleaseConnection(MYSQL *conn); //释放连接int GetFreeConn(); //获取连接void DestroyPool(); //销毁所有连接//单例模式static connection_pool *GetInstance();void init(string url, string User, string PassWord, string DataBaseName, int Port, int MaxConn, int close_log); private:connection_pool();~connection_pool();int m_MaxConn; //最大连接数int m_CurConn; //当前已使用的连接数int m_FreeConn; //当前空闲的连接数locker lock; //互斥锁listMYSQL * connList; //连接池sem reserve;public:string m_url; //主机地址string m_Port; //数据库端口号string m_User; //登陆数据库用户名string m_PassWord; //登陆数据库密码string m_DatabaseName; //使用数据库名int m_close_log; //日志开关
};
在init函数中完成了对各个数据库连接的初始化并将连接存储到list中
void connection_pool::init(string url, string User, string PassWord, string DBName, int Port, int MaxConn, int close_log)
{m_url url;m_Port Port;m_User User;m_PassWord PassWord;m_DatabaseName DBName;m_close_log close_log;for (int i 0; i MaxConn; i){MYSQL *con NULL;con mysql_init(con);if (con NULL){LOG_ERROR(MySQL Error);exit(1);}con mysql_real_connect(con, url.c_str(), User.c_str(), PassWord.c_str(), DBName.c_str(), Port, NULL, 0);if (con NULL){LOG_ERROR(MySQL Error);exit(1);}connList.push_back(con);m_FreeConn;}reserve sem(m_FreeConn);m_MaxConn m_FreeConn;
}
下面是从池中获取一个连接的函数
bool connection_pool::ReleaseConnection(MYSQL *con)
{if (NULL con)return false;lock.lock();connList.push_back(con);m_FreeConn;--m_CurConn;lock.unlock();reserve.post();return true;
}
可以看到先调用wait函数reserve是信号量如果值1那么将值-1如果为0就会陷入阻塞。成功获得信号量后获得互斥锁然后将池中的list的头取出来更新相关的数据后释放锁。
释放连接时也是类似的上锁然后将连接添加进池中更新数据后释放锁。
而作者为了实现池的RAII设计了connectionRAII类
class connectionRAII{public:connectionRAII(MYSQL **con, connection_pool *connPool);~connectionRAII();private:MYSQL *conRAII;connection_pool *poolRAII;
};
需要说明由于数据库连接本身就是指针因此通过有参构造对传入的参数进行修改时需要用双指针。 如图所示*A的值是0x00000004;*B的值是C的实际内容那么也就是说*A之后得到0x00000008是实际资源的地址现在还要解引用一次才能得到实际值。
下面的代码是获得池中的一个连接以及将连接还回去的代码。
connectionRAII::connectionRAII(MYSQL **SQL, connection_pool *connPool){*SQL connPool-GetConnection();conRAII *SQL;poolRAII connPool;
}connectionRAII::~connectionRAII(){poolRAII-ReleaseConnection(conRAII);
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/89354.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!