一个简单的数据库连接池示例

news/2025/1/16 2:54:13/

等待超时模式

就是超过时间后执行我设定的逻辑,通过定义一个等待持续时间T,超时时间就是now+T,如果未来时间比now+T晚,就是超时了,采用判断语句来进行判断。

数据库连接池

模拟从连接池中获 取、使用和释放连接的过程,而客户端获取连接的过程被设定为等待超时的模式,也就是在 1000毫秒内如果无法获取到可用连接,将会返回给客户端一个null。设定连接池的大小为10 个,然后通过调节客户端的线程数来模拟无法获取连接的场景。

连接池的定义

通过构造函数初始化连接的最大上限,通过一个双向队列 、来维护连接,调用方需要先调用fetchConnection(long)方法来指定在多少毫秒内超时获取连接, 当连接使用完成后,需要调用releaseConnection(Connection)方法将连接放回线程池

 代码

package test730;import java.sql.Connection;
import java.util.LinkedList;
/*
线程池的实现*/
public class ConnectionPool {private LinkedList<Connection> pool = new LinkedList<Connection>();//线程初始化构造函数,确定线程池的大小public ConnectionPool(int initialSize){if (initialSize>0){for (int i = 0; i < initialSize; i++) {pool.addLast(ConnectionDriver.createConnection());}}}//释放连接方法public void releaseCoonnection(Connection connection){if (connection != null){synchronized (pool){//释放后归还,并唤醒其他需要建立连接的线程pool.addLast(connection);pool.notifyAll();}}}//在mills内无法获取到链接,将会返回nullpublic  Connection fetchConnection(long mills) throws InterruptedException{synchronized (pool){// 如果超时时间小于等于0,表示不设定超时if (mills<=0){// 当连接池为空时,线程将会在此处等待直到连接池中有可用的连接while (pool.isEmpty()){pool.wait();}// 从连接池中移除并返回第一个连接return pool.removeFirst();}else {// 设置未来的时间点,用于计算剩余等待时间long future = System.currentTimeMillis() + mills;long remaining = mills;// 当连接池为空且剩余等待时间大于0时,线程将会等待while ( pool.isEmpty() && remaining>0){// 线程等待指定的时间(remaining),直到有连接可用pool.wait(remaining);// 更新剩余等待时间remaining = future - System.currentTimeMillis();}// 从连接池中移除并返回第一个连接(如果连接池中有连接的话)Connection result = null;if (!pool.isEmpty()){result = pool.removeFirst();}return result;}}}
}

package test730;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.util.concurrent.TimeUnit;public class ConnectionDriver {// 内部类 ConnectionHandler 实现 InvocationHandler 接口static class  ConnectionHandler implements InvocationHandler{// 重写 invoke 方法,用于处理方法调用public  Object invoke(Object proxy, Method method,Object[] args)throws Throwable{// 如果调用的方法是 "commit"if (method.getName().equals("commit")){// 让当前线程暂停 100 毫秒TimeUnit.MILLISECONDS.sleep(100);}return  null;}}// 创建连接的静态方法public static final Connection createConnection(){// 使用 Proxy.newProxyInstance 创建一个动态代理对象return (Connection) Proxy.newProxyInstance(ConnectionDriver.class.getClassLoader(),new Class<?>[] {Connection.class},new ConnectionHandler());}
}


http://www.ppmy.cn/news/1503238.html

相关文章

大模型重塑软件研发,从辅助编程到多 Agent 协同还有多远?| 新程序员

【导读】当编程成为最高频的 AI 应用场景&#xff0c;代码大模型的技术与产品发展之路该怎么走&#xff1f;本文作者从大模型软件研发的三大阶段和四大技术难点出发&#xff0c;分析了 AI 如何提升编程效率&#xff0c;并预测了未来软件研发工具的形态&#xff0c;终极目标是实…

第八章 内存马分析-java01-nacos

一、概要 问题 1 nacos 用户密码的密文值作为 flag 提交 flag{密文} 问题 2 shiro 的key为多少 shiro 的 key 请记录下来 &#xff08;备注请记录下&#xff0c;可能有用&#xff09; 问题 3 靶机内核版本为 flag{} 问题 4 尝试应急分析&#xff0c;运行 get_flag 然后尝试…

JVM:栈上的数据存储

文章目录 一、Java虚拟机中的基本数据类型 一、Java虚拟机中的基本数据类型 在Java中有8大基本数据类型&#xff1a; 这里的内存占用&#xff0c;指的是堆上或者数组中内存分配的空间大小&#xff0c;栈上的实现更加复杂。 Java中的8大数据类型在虚拟机中的实现&#xff1a;…

鉴源实验室·HTTP协议网络安全攻击

作者 | 李芷若 上海控安可信软件创新研究院工控网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 背 景 随着互联网的迅猛发展&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&…

阿里云服务器 Ubuntu18.04 安装 mysql8.0并允许外部连接

参考教程&#xff1a; 官网教程 参考教程一 首先彻底删除mysql5.7 dpkg --list|grep mysql #查看 sudo apt-get remove mysql-common #卸载 sudo apt-get autoremove --purge mysql-server-5.7 #版本自己修改 dpkg -l|grep ^rc|awk {print$2}|sudo xargs dpkg -P #清除残留数…

OD C卷 - 体育场找座位

体育场找座位 &#xff08;100&#xff09; 体育场有一排座位&#xff08;已有落座观众&#xff09;&#xff0c;观众之间必须至少一个空位才允许落座&#xff1b;在不移动现有观众座位的情况下&#xff0c;最多还能坐下多少人&#xff1f; 输入描述&#xff1a; 数组表示每个…

基于望获实时Linux和飞腾E2000Q CPU的全国产工控解决方案

随着智能制造和工业4.0浪潮的席卷&#xff0c;工业生产对控制系统提出了前所未有的挑战——高精度、高实时性和高可靠性的需求如同三座大山&#xff0c;横亘在行业发展之路上。然而&#xff0c;环顾当前市场&#xff0c;高性能的国产化工业控制解决方案仍显稀缺&#xff0c;进口…

力扣刷题-图论-岛屿类问题-集合实现(c++实现)

我的老师&#xff1a;力扣链接这道题题解中最高赞的回答nettee&#xff0c;从这篇题解中我学到了dfs框架以及解决思路&#xff0c;并独立完成了该题解里的几道习题本人刷题的习惯是学会一个板子&#xff0c;然后之后的同类题都机械的用这个板子去做&#xff0c;最好不做创新&am…