讲享元设计模式,顺便~学会了数据库连接池,

2024-03-06 22:12

本文主要是介绍讲享元设计模式,顺便~学会了数据库连接池,,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

设计模式-详细说明享元模式设计,保准一听就会,不会你来打我

1.前言

今天呢,我们来说下享元模式,享元模式是结构型模式,我的感觉,结构型模式都是相对比较简单的设计模式,这个也是,之前手写Mybatis时有学习了解数据库连接池的设计,非常精彩,其中就运用了咱们这节说的设计模式,享元模式。

2.什么是享元模式

享元模式: 对一些共享对象进行复用的思想,这样减少内存使用提高资源性能,像我们使用redis进行缓存处理的,线程池,数据源连接池都是享元模式,享元模式其实是一个思想,一般会和工厂模式或其他经常使用的设计模式搭配使用。

那根据这种设计理念我们自己实现个数据库连接池,当然是伪代码哈,毕竟数据库连接池的业务比较庞大和复杂,我们这个就是简单实现,但也能够让你理解到数据库连接池的代码设计和思路。

之所以选择数据库连接池的原因是,数据库连接池使用是连接,连接的创建会有很大消耗,所以就出现个池子作共享操作,谁用谁从池子里取连接,不用了就送回池子里,所以这是个典型的享元模式设计思想。

3.代码设计

因为我们知道数据库连接池,最主要有连接,还有数据源,以及数据源工厂,那么用户可以通过数据源工厂连接数据源,根据数据源获取连接。

3.1 Connection

首先我们定义连接接口,Connection,定义连接的提交、回滚、关闭方法。

import java.sql.SQLException;/*** @Author df* @Description:* @Date 2024/3/2 16:05*/
public interface Connection {void commit();void rollback();void close();
}

然后就是连接的实现,DefaultConnection实现Connection接口,回滚和提交就不写代码了,因为说的是数据库连接池,连接池的处理会有创建连接和回收连接,那么什么时候回收连接呢,就是连接关闭的时候,所以在关闭连接的方法里我们调用了回收连接pooledDatasource.pushConnection(this);

由于连接池需要在池数据源里操作,所以我们需要通过构造方法把PooledDatasource传入进来,这样回收连接时可以调用PooledDatasource的回收方法。代码如下

/*** @Author df* @Description:* @Date 2024/3/2 16:31*/
public class DefaultConnection implements Connection {private PooledDatasource pooledDatasource;public DefaultConnection(PooledDatasource pooledDatasource) {this.pooledDatasource = pooledDatasource;}@Overridepublic void commit() {// 模拟提交}@Overridepublic void rollback() {// 模拟回滚}@Overridepublic void close() {pooledDatasource.pushConnection(this);}
}

3.2 DataSource

接着我们在定义数据源接口,DataSource,定义获取连接方法。

/*** @Author df* @Description: 数据源接口* @Date 2024/3/2 16:19*/
public interface DataSource {Connection getConnection();
}

然后重点来了,定义有池化的数据源,然后实现DataSource接口,

1.这里首先我们定义了两个全局变量activeConnectionPool(活跃连接池列表)和idleConnectionPool(空闲连接池列表)字如其意,一个放活跃连接状态的连接,一个放空闲状态的连接,在用户获取连接时就是活跃的,不使用关闭连接就是空闲的。

2.在获取连接时,先获取空闲连接池里有连接没,如果有直接取出来,返回,并删除列表这个连接即可,如果没有空闲连接则创建连接,创建连接以后放入活跃连接池中。

3.pushConnection(回收连接方法),当关闭连接调用到这里时,把当前连接从活跃连接池移除,然后放入空闲连接池里。当然真实的肯定是要更复杂的,如果大家感兴趣呢,可以去我的博客Mybatis专栏或者B站去看啦。

手写Mybatis五-全网最详细的讲解数据源连接池,内容有点长,关注不迷路,不会你打我!_哔哩哔哩_bilibili

/*** @Author df* @Description: 有池化资源* @Date 2024/3/2 16:22*/
public class PooledDatasource implements DataSource {protected final List<Connection> activeConnectionPool = new ArrayList<>();protected final List<Connection> idleConnectionPool = new ArrayList<>();@Overridepublic Connection getConnection() {if (!idleConnectionPool.isEmpty()) {return idleConnectionPool.remove(0);}// 模拟获取连接Connection connection = new DefaultConnection(this);activeConnectionPool.add(connection);return connection;}protected void pushConnection(Connection connection) {// 移除活跃池activeConnectionPool.remove(connection);// 放入空闲池idleConnectionPool.add(connection);}
}

3.3 DatasourceFactory

连接接口有啦,数据源接口有啦,那现在就差个入口啦,我们定义数据源工厂接口DatasourceFactory,定义的获取数据源方法就OK啦。


/*** @Author df* @Description: 数据源工厂接口* @Date 2024/3/2 17:08*/
public interface DatasourceFactory {DataSource getDataSource();
}

 然后池化数据源工厂PooledDatasourceFactory,实现DatasourceFactory接口,再获取数据源的时候实例化有池化数据源。

/*** @Author df* @Description: 池化数据源工厂* @Date 2024/3/2 17:07*/
public class PooledDatasourceFactory implements DatasourceFactory {@Overridepublic DataSource getDataSource() {return new PooledDatasource();}
}

单元测试:

怎么样,其实还是蛮简单的,大家可以打断点调试下就都明白啦。

/*** @Author df* @Description: 测试享元模式* @Date 2024/3/2 17:12*/
public class TestApi {@Testpublic void test_flyweight() {// 实例化数据源工厂DatasourceFactory datasourceFactory = new PooledDatasourceFactory();// 通过工厂获取数据源DataSource datasource = datasourceFactory.getDataSource();// 通过数据源获取连接Connection connection = datasource.getConnection();// 连接关闭connection.close();// 再次获取连接Connection connection1 = datasource.getConnection();//connection.close();}
}

这篇关于讲享元设计模式,顺便~学会了数据库连接池,的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/781524

相关文章

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们