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

基于java的数据库连接池(使用了程序设计模式) 基于java的数据库连接池设计与实现 。 使用了程序设计模式的思想编写。 包含工程文件(eclipse) 包含论文(pdf) 包含演示文档 立即下载

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

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;
    }

    @Override
    public void commit() {
        // 模拟提交
    }

    @Override
    public void rollback() {
        // 模拟回滚
    }

    @Override
    public 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<>();


    @Override
    public 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 {

    @Override
    public DataSource getDataSource() {
        return new PooledDatasource();
    }
}

单元测试:

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

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

        // 再次获取连接
        Connection connection1 = datasource.getConnection();
        //connection.close();
    }
}

django drf 框架知识点(一)——serializer序列化器_用法全解 【django drf】序列化器:别名设置,全部参数序列化,自定义字段,只读只写,部分更新 阅读详情

相关推荐

AI工作流革命:从n8n到Sora2,揭秘自动化视频创作的底层逻辑

本文深入探讨了AI工作流在自动化视频创作中的应用,重点介绍了n8n、Coze和Sora2的组合如何实现从链接输入到视频输出的全流程自动化。通过三层架构解析、关键技术模块优化及成本控制策略,这套方案显著提升了视频生产效率,适用于电商、热点追踪等多种场景。

gg901的博客 1087

数据库 -- 由数据库连接池引出的三种设计模式

笔记摘要:      这里首先对数据库连接池的优化进行了说明,同时自己编写了一个数据库连接池,在实际开发中,为了获取标准的数据源,我们需要去实现javax.sal.DataSource接口,      在实现过程中对于链接对象的close方法进行了不同的实现,以便在关闭close的时候,将连接对象放回连接池,而不是关闭掉,针对这一问题,提供了3种不同的解决      方案,涉及了3种设计模式

light_sky的专栏 5709

ADS许可证配置全攻略:从破解文件放置到环境变量设置(实测有效版)

本文详细介绍了ADS许可证配置的全流程,包括环境准备、全新安装、破解文件部署和环境变量设置等关键步骤。针对常见的安装和授权问题,提供了实测有效的解决方案,帮助工程师快速完成ADS的配置与优化。

websocket5live的博客 379

结构型设计模式之享元模式

享元模式(Flyweight Pattern)又称为轻量级模式,是对象池的一种实现。属于结构型模式。主要用于减少创建对象的数量,以减少内存占用和提高性能。其本质是缓存共享对象,降低内存消耗。

积跬步,至千里。 548

别再为淘宝滑块发愁了!一个Python脚本自动获取x5sec cookie的保姆级教程

本文提供了一套完整的Python自动化解决方案,帮助开发者轻松应对淘宝滑块验证码问题。通过模拟浏览器行为、精准识别滑块缺口位置和生成拟人化移动轨迹,脚本能够自动获取关键的x5sec cookie,显著提升爬虫效率。教程涵盖环境配置、验证机制分析、代码实现及反检测策略,是解决淘宝滑块验证的实用指南。

weixin_30300225的博客 575

UE5.5使用ControlRig实现MetaHumanNPC看向玩家

本文介绍了在虚幻引擎中实现NPC自然看向玩家的技术方案。通过MetaHuman的ControlRig系统,采用面部动画曲线+全身动画Montage的表演方式,结合ControlRig驱动CTRL_lookat控制器实现视线追踪。

平常心 1302

C#设计模式之---享元模式

享元模式(Flyweight Pattern)是一种结构型模式,是运用共享技术有效的支持大量细粒度的对象。它使用共享对象,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似对象;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量对象。通常对象中的部分状态是可以分享。Flyweight模式需要认真考虑如何能细化对象,以减少处理的对象数量,从而减少存留对象在内存或其他存储设备中的占用量。String常量池、数据库连接池、缓冲池等等都是享元模式的应用。

风清扬的专栏 1098

matianl:SAP 最详细的权限管理解析

上文所说的系统自带权限对象与权限字段仅能满足有限的需要,其权限审核的逻辑也是系统硬编码了的,我们能做的只是是否启用某项权限对象的检查(使用SU22)。如果需要自定义,通过SU20、SU21定义即可。

matinal 當冬夜漸暖 。公众号:matinal 2155

面试九 设计模式

单例模式通常被归类为,因为它主要关注如何创建对象的实例,以及如何确保在整个应用程序生命周期中只有一个实例存在。

leimeili的博客 924

用户视角下的vfsglobal预约困境:从注册到登录的全流程避坑指南

本文详细解析了vfsglobal签证预约系统从注册到登录的全流程操作,帮助用户避开常见技术陷阱。针对IP限制、DNS解析、浏览器缓存等登录障碍提供实用解决方案,并揭示账号管理的隐藏规则与支付环节的延时处理技巧,助力用户高效完成签证预约。

ol78901234的博客 871

【OpenClaw企业级智能体实战】第09篇:OpenClaw金融投研实战:17个场景+完整代码,打造专属数字研究员

金融投研面临信息过载、流程重复、数据安全合规三大核心痛点,OpenClaw作为本地部署的新一代AI智能体,凭借“长期记忆+主动执行+数据不出域”的优势,成为券商分析师集体追捧的效率工具。本文基于8家头部券商公开研报,拆解OpenClaw在金融投研的17个核心应用场景(信息处理、研报撰写、量化策略、流程自动化),详解原理、技术选型、实操流程,并提供可直接运行的完整代码与执行结果。文章兼顾新手入门与进阶提升,强调安全隔离部署与幻觉防范,读者可按步骤搭建专属投研智能体,将信息处理、数据整理等重复工作效率提升80%

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 675

享元模式-实现数据库线程池

享元模式实现数据库连接池

weixin_44753581的博客 305

深入浅出:使用Python爬取链家二手房数据

在数据驱动的时代,房地产数据作为社会经济的重要指标,一直是数据分析师、投资者和研究人员关注的焦点。链家作为国内领先的房产中介平台,其二手房数据具有较高的真实性和时效性。然而,官方API的访问限制和数据获取的门槛,让很多初学者望而却步。本文将带你从零开始,使用Python编写一个符合robots.txt规范的链家二手房爬虫,获取标题、户型、价格等信息。文章不仅会提供完整代码,还会深入讲解反爬策略、请求头伪装、数据解析、异常处理等实战技术。目录前言:为什么要写这篇博客?一、爬虫前的准备:法律与道德。

2201_76125261的博客 90

设计模式-单例模式

1、单例模式定义 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。 这样的模式有几个好处: 1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。 2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。 3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员

TCY666A的博客 1136

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深入理解JAVA线程池

深入理解JAVA线程池 前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担。线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory。即便没有这样的情况,大量的线程回收也会给GC带来很大的压力。 为了避免重复的创建线程,线程池的出现可以让线程进行复用。通俗点讲,当有工作来,就会向线程池拿一个线程,当工...

SuperMan程序人生(关注微信公众号) 2516

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

数据库连接池、DAO设计模式和MVC设计模式

JDBC一、数据库连接池1.1 基础1.2 数据库连接池_C3P01.3 数据库连接池_Druid二、更新与查询工具类的实现 一、数据库连接池 1.1 基础 概念 数据库连接池是一个容器(集合),存放数据库连接的容器。 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。 好处 节约资源 用户访问高效 实现 标准接口:DataSource(javax.sql包下) javax.sql.D

璃尔 ° 的博客 937

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++ 设计模式原理与实战大全-架构师需备课程

C++属于难学易用的工程开发语言,C++繁复的语法往往使得开发人员过于强调细节而缺乏软件体系结构的大局观。特别需要指出的是,缺乏面向对象的软件设计能力是制约从业人员从开发者向设计者转变的重要因素。设计模式是来源于工业实践的重要开发经验,它实际上是面向对象的数据结构,掌握设计模式是掌握面向对象设计的根本要求,该课程基于C++语言讲解设计模式。

【源码分析设计模式 7】Integer中的享元模式

一、基本概念 说到享元模式,第一个想到的应该就是池技术了,String常量池、数据库连接池、缓冲池等等都是享元模式的应用,所以说享元模式是池技术的重要实现方式。 比如我们每次创建字符串对象时,都需要创建一个新的字符串对象的话,内存开销会很大,所以如果第一次创建了字符串对象“Flyweight”,下次再创建相同的字符串“Flyweight”时,只要把它的引用指向“Flyweight”,这样就实现了“Flyweight”字符串在内存中的共享。 举个最简单的例子,网络联机下棋的时候,一台服务器连接了多个客户

学Java,找哪吒 6185

《设计模式》之享元模式

《设计模式》之享元模式

向上的"狼"的博客 306

利用几种设计模式来实现自定义数据库连接池

利用几种设计模式来实现自定义数据库连接池 自定义数据库连接池 核心API DataSource 接口概述 javax.sql.DataSource 接口:数据源(数据库连接池)。Java 官方提供的数据库连接池规范(接口) * 如果想完成数据库连接池技术,就必须实现 DataSource 接口 * 核心功能:获取数据库连接对象:Connection getConnection(); 实现步骤 ① 定义一个类,实现 DataSource 接口。 ② 定义一个容器,用于保存多个 Connection 连接

walker_0312的博客 1054

数据库连接池(设计模式)——数据库

文章转载自:https://blog.youkuaiyun.com/hu_belif/article/details/80812047 一、什么是数据库连接池? 官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全...

1010

通过连接池操作 理解装饰者设计模式 自我理解

装饰者设计模式:用于数据库连接中close方法的增强 自我理解:装饰者设计模式的方法增强,就是自定义一个类去实现我们需要增强的方法的接口,并定义一个成员变量对象去存储我们之前的对象, 那么这个成员变量所有调用的方法就是我们原来接口中的方法,因为成员变量对象 是我们原来对象的副本,然后改写我们要增强的方法即可。 应用: 当我们创建数据库连接池中连接时, 当我们用完我们创建的连接需要将

追风逐日的博客 1753

C3P0和Druid数据库连接池的简单使用;几种设计模式简介;简略介绍自定义数据库连接池注意点

数据库连接池 负责分配、管理和释放数据库连接; 它允许应用程序重复使用一个连接,而不是新建连接,提高了程序的效率; 由于新建数据库连接也是要耗费性能和时间的,当访问量十分巨大的时候,对程序性能的影响就极为显著,为了解决这个问题出现了数据库连接池的技术; C3P0连接池 使用步骤 1、导入jar包; 2、导入配置文件到src目录下;(配置文件会自动导入,但是名字必须是c3p0-config.xml或者c3p0-config-properties) 3、创建C3P0连接池对象; 4、获取连接; 5、使用连接;

weixin_46837969的博客 714

数据库连接池的几种模式

1.Hibernate默认连接池 PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> com.mysql.jdbc.Driver     jdbc:mysql://lo

爱兰河少 1260

设计模式之代理模式(实现自己的数据库连接池)

设计模式之代理模式(实现自己的数据库连接池)

不能说的秘密的博客 4098

java数据库常见面试题目

数据库的索引了解么?介绍一下数据库有哪些优化的方法?讲你自己知道的为什么事务可以优化数据库?Mysql的数据库引擎,区别特点数据连接池采用了什么设计模式?意义是什么?项目用到什么数据库?隔离级别?每个隔离级别各做了什么数据库的索引?mysql不同引擎索引的区别数据库的索引原理索引使用的注意事项数据库的引擎Redis的优势和特点如果成功的用户有10万,redis存不下怎么处理Redis和mysql的...

laotanseu的博客 1845
上一篇: 装饰器模式,感受MyBatis二级缓存的魅力
下一篇: 什么是泛化调用?怎么实现Dubbo的泛化调用?代码怎么写?如果有疑问,请进!!
PromisingGirl-Du
博客等级 码龄9年 1143粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值