JUC:实现一个简易的数据库连接池(享元模式)

主要是学习享元模式。  

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享尽可能多的对象来最小化内存使用和提高性能。在该模式中,对象被分为两种状态:内部状态和外部状态。

  • 内部状态(Intrinsic State):内部状态是对象可以共享的状态,它存储在享元对象内部,并且不随环境的变化而改变。因此,可以被多个对象共享。

  • 外部状态(Extrinsic State):外部状态是对象的上下文相关的状态,它取决于对象被使用的环境,并且无法共享。客户端需要在使用享元对象时提供外部状态。

        享元模式的核心思想是将对象中共享的状态提取出来,存储在一个共享池中,当需要创建对象时,首先检查是否存在具有相同内部状态的对象。如果存在,则直接返回共享对象,否则创建新对象并加入共享池中。

        这种方式可以有效地减少内存消耗,特别是当需要创建大量相似对象时。典型的应用场景包括文本编辑器中的字符对象、游戏中的粒子对象等。

        在实现享元模式时,需要注意对内部状态和外部状态的管理,以及线程安全等问题。

        预先创建好一批连接,放入连接池。一次请求到达后,从连接池获取连接,使用完毕后再还回连接池,

        这样既节约了连接的创建和关闭时间,也实现了连接的重用,不至于让庞大的连接数压垮数据库。


package com.数据库连接池;import java.sql.*;
import java.util.Map;
import java.util.Properties;
import java.util.Random;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerArray;public class test {public static void main(String[] args) {Pool pool = new Pool(3);for (int i = 0; i < 5; i++) {new Thread(() -> {Connection conn = pool.borrow();try {Thread.sleep(new Random().nextInt(1000)); // 模拟使用随机的时间后,进行归还} catch (InterruptedException e) {e.printStackTrace();}pool.free(conn);}).start();}}
}class Pool {// 连接池大小private final int poolSize;// 连接对象数组private Connection[] connections;// 连接状态,线程安全的private AtomicIntegerArray states;public Pool(int poolSize) {this.poolSize = poolSize;this.connections = new Connection[poolSize];this.states = new AtomicIntegerArray(new int[poolSize]);for (int i = 0; i < poolSize; i++) {connections[i] = new MockConnection();}}// 借连接public Connection borrow() {while (true) {for (int i = 0; i < poolSize; i++) {if (states.get(i) == 0) {if (states.compareAndSet(i, 0, 1)) { // cas成功才return,不要直接set,防止多线程读写分离System.out.println(Thread.currentThread().getName() + "借到了连接");return connections[i];}}}// 没有空闲连接,进入等待System.out.println(Thread.currentThread().getName() + "没有空闲连接,进入等待");synchronized (this) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}// 归还连接public void free(Connection connection) {for (int i = 0; i < poolSize; i++) {if (connections[i] == connection) {states.set(i, 0); // 这里不用cas,归还线程一定是唯一拥有它的线程System.out.println(Thread.currentThread().getName() + "释放了连接");// 通知如果有再wait中的线程synchronized (this) {this.notifyAll();}break;}}}
}
// 不用真的去连接,随便实现一下Connection用来测试即可
class MockConnection implements Connection{// 这里省略了,太长了
}

比较简单,可自行拓展,就不再多描述了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/603902.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

13.3.1 配置 Android 开发环境(windows)

目录 1. 安装 JDK 及其环境配置 1. 安装 JDK 2. JDK 环境配置 3. JDK的配置验证 2. 安装 Android Studio (2023版本) 为了学习 Xposed 框架&#xff0c;记录安装 JDK 及其环境配置和安装 Android Studio (2023版本)。 1. 安装 JDK 及其环境配置 1. 安装 JDK 安装链接&a…

从零开始:一步步学习爬虫技术的实用指南(一)

从零开始&#xff1a;一步步学习爬虫技术的实用指南&#xff08;一&#xff09; Urllib1.什么是互联网爬虫2.爬虫核心3.爬虫的用途4.爬虫的分类4.1 通用爬虫&#xff1a;4.1 聚焦爬虫&#xff1a; 5.反爬手段5.1 User‐Agent&#xff1a;5.2.代理IP5.3.验证码访问5.4.动态加载网…

2007-2022年上市公司企业绿色创新效率数据

2007-2022年上市公司企业绿色创新效率数据&#xff08;仅结果&#xff09; 1、时间&#xff1a;2007-2022年 2、指标&#xff1a;stkcd、year、绿色科技研发效率、绿色成果转化效率 3、来源&#xff1a;上市公司年报、上市公司社会责任报告、上市公司网站信息 4、计算方法&…

代码随想录-力扣刷题-总结笔记02

代码随想录&#xff1a;代码随想录力扣&#xff1a;力扣 (LeetCode) 全球极客挚爱的技术成长平台 代码随想录-力扣刷题-总结笔记01代码随想录-力扣刷题-总结笔记02 目录 01、代码随想录 00、其他 ArrayList转数组 07、二叉树 7.0、递归法 7.1、二叉树的层序遍历模板 7.2…

(Python)根据经纬度从数字高程模型(DEM)文件获取高度

基本介绍 在地理信息系统&#xff08;GIS&#xff09;和遥感中&#xff0c;数字高程模型&#xff08;Digital Elevation Model&#xff0c;简称DEM&#xff09;是一种表示 地表或地形高程信息的重要数据。DEM数据通常以栅格&#xff08;raster&#xff09;形式存在&#xff0…

牛客 2024春招冲刺题单 ONT82 腐烂的苹果【中等 BFS Java,Go】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/54ab9865ce7a45968b126d6968a77f34 思路 广度优先搜索。首先找到2坐标集合&#xff0c;然后每次往四周为1的坐标扩展参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数…

【C++】用红黑树封装map和set

我们之前学的map和set在stl源码中都是用红黑树封装实现的&#xff0c;当然&#xff0c;我们也可以模拟来实现一下。在实现之前&#xff0c;我们也可以看一下stl源码是如何实现的。我们上篇博客写的红黑树里面只是一个pair对象&#xff0c;这对于set来说显然是不合适的&#xff…

基于51单片机轮胎胎压监测系统—数码管显示

基于51单片机轮胎胎压监测系统 &#xff08;仿真&#xff0b;程序&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.MPX4115压力传感器胎压检测&#xff1b; 2.ADC0832进行模数转换后&#xff0c;51单片机处理控制&#xff1b; 3.数码管显示胎压&#xff…

C++——优先级队列

前言&#xff1a;这篇文章我们继续来分享一个c的容器——优先级队列。 一.理解优先级 何为优先级一说&#xff1f;实际上就是有顺序的意思。 优先级队列&#xff0c;即有顺序的队列&#xff0c;是一个无需我们自己进行排序操作&#xff0c;在数据传入时就会由容器自己排好序的…

javaWeb网上零食销售系统

1 绪 论 目前&#xff0c;我国的网民数量已经达到7.31亿人&#xff0c;随着互联网购物和互联网支付的普及&#xff0c;使得人类的经济活动进入了一个崭新的时代。淘宝&#xff0c;京东等网络消费平台功能的日益完善&#xff0c;使得人们足不出户就可以得到自己想要的东西。如今…

P3397 地毯(二维差分)

题目描述 在 n n n\times n nn 的格子上有 m m m 个地毯。 给出这些地毯的信息&#xff0c;问每个点被多少个地毯覆盖。 输入格式 第一行&#xff0c;两个正整数 n , m n,m n,m。意义如题所述。 接下来 m m m 行&#xff0c;每行两个坐标 ( x 1 , y 1 ) (x_1,y_1) (…

(WSI分类)WSI分类文献小综述 2024

2024的WSI分类。 Multiple Instance Learning Framework with Masked Hard Instance Mining for Whole Slide Image Classification &#xff08;ICCV2024&#xff09; 由于阳性组织只占 Gi- gapixel WSI 的一小部分&#xff0c;因此现有的 MIL 方法直观上侧重于通过注意力机…