dbpool mysql_数据库连接池DBPool分析(四):mysql连接池 mysql_connection_pool

这个class的设计和MysqlObj不一样了,不会像MysqlObj提供Connect函数来进行连接,这里我直接就在构造函数当中创建好池,因为如果再提供一个init之类的函数来创建池的话我觉得与这个class的设计语意违背,毕竟池创建好就能直接使用了。

在构造函数当中使用到了boost的property_tree,目的就是从config里面读取database.xml或者database.json配置文件,从配置文件当中获取到host,user,dbname等等。

做的工作只有一件事情,从配置文件当中读取出的max_connections,说明了池的容量,需要建立这么多的连接数目,然后使用map来保存这个连接,map的first是连接指针,second指的是Mysql连接是否可用,true为可用,false为已经被其他的占用了。

析构函数的话直接轮询map,然后删除掉对应的指针,我现在正在想用shared_ptr来代替掉指针。

getConnection()函数就是说从池当中取出一个连接,就是轮询map,然后查找有用的连接。

这里为了应对多线程使用了锁,使用并非简单的mutex.lock()和mutex.unlock()。我更加喜欢使用RAII方式的unique_lock和lock_guard,但是unique_lock提供了更好的上锁和解锁机制。

releaseConnection()正好和getConnection()是相反的,也是用了unique_lock机制。

#include

#include

#include

#include "mysql_obj.h"

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个数据库连接池,需要考虑以下关键思路: 1. 连接池初始化:在初始化时,需要创建一定数量的数据库连接,并将其保存在连接池中,可以使用Java中的数据结构LinkedBlockingQueue来实现连接池。 2. 连接池的获取:当有请求需要连接数据库时,从连接池中获取连接,如果连接池中已经没有可用的连接,可以根据需要创建新的连接。 3. 连接池的释放:当连接使用完毕后,需要及时将其释放回连接池中,以供其他请求使用。 下面是一个简单的实现连接池的核心代码: ```java public class DBPool { private static ConnectionPool pool; private static final int POOL_SIZE = 10; // 连接池大小 static { pool = new ConnectionPool(POOL_SIZE); } public static Connection getConnection() throws SQLException { return pool.getConnection(); } public static void releaseConnection(Connection conn) { pool.releaseConnection(conn); } private static class ConnectionPool { private BlockingQueue<Connection> queue; public ConnectionPool(int poolSize) { queue = new LinkedBlockingQueue<>(poolSize); for (int i = 0; i < poolSize; i++) { try { Connection conn = createConnection(); queue.offer(conn); } catch (SQLException e) { e.printStackTrace(); } } } public Connection getConnection() throws SQLException { Connection conn = null; try { conn = queue.take(); } catch (InterruptedException e) { e.printStackTrace(); } return conn; } public void releaseConnection(Connection conn) { if (conn != null) { try { queue.put(conn); } catch (InterruptedException e) { e.printStackTrace(); } } } private Connection createConnection() throws SQLException { // 创建数据库连接 return DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456"); } } } ``` 在上面的代码中,我们使用了Java中的BlockingQueue来实现连接池,并在连接池初始化时创建了一定数量的数据库连接。getConnection方法用于获取连接,如果连接池中没有可用连接,该方法会阻塞等待。releaseConnection方法用于将连接释放回连接池中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值