写了一个简单的数据库连接池

保姆级教程:手把手教你用INCA V7.2新建工程并完成首次观测标定(附A2L文件处理技巧) 本文提供INCA V7.2新建工程及完成首次观测标定的详细教程,涵盖A2L文件处理技巧、硬件配置和参数标定等关键步骤。通过实战案例解析,帮助工程师快速掌握ECU观测标定技术,提升汽车电子开发效率。 阅读详情

发布一个k8s部署视频:https://edu.youkuaiyun.com/course/detail/26967

课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。

腾讯课堂连接地址https://ke.qq.com/course/478827?taid=4373109931462251&tuin=ba64518

第二个视频发布  https://edu.youkuaiyun.com/course/detail/27109

腾讯课堂连接地址https://ke.qq.com/course/484107?tuin=ba64518

介绍主要的k8s资源的使用配置和命令。包括configmap,pod,service,replicaset,namespace,deployment,daemonset,ingress,pv,pvc,sc,role,rolebinding,clusterrole,clusterrolebinding,secret,serviceaccount,statefulset,job,cronjob,podDisruptionbudget,podSecurityPolicy,networkPolicy,resourceQuota,limitrange,endpoint,event,conponentstatus,node,apiservice,controllerRevision等。

第三个视频发布:https://edu.youkuaiyun.com/course/detail/27574

详细介绍helm命令,学习helm chart语法,编写helm chart。深入分析各项目源码,学习编写helm插件


————————————————------------------------------------------------------------------------------------------------------------------

 

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class ConnectionPool {
	private static  ConcurrentHashMap<String,ConnectionEntity> idelConnections=null;
	private static  ConcurrentHashMap<String,ConnectionEntity> activeConnections=null;
	private static int initSize;
	private static int maxSize;
	private static AtomicInteger idelSize=new AtomicInteger(0);
	private static AtomicInteger activeSize=new AtomicInteger(0);
	private static ConnectionPool instance=null;
	private static Lock lock= new ReentrantLock();
	private  Object object=new Object();
	private ConnectionPool(int initSize,int maxSize){
		this.initSize=initSize;
		this.maxSize=maxSize;
		idelConnections=new ConcurrentHashMap<String,ConnectionEntity>();
		activeConnections=new ConcurrentHashMap<String,ConnectionEntity>();
		initConnections();
		new DetectFailConnection().start();
	}
	
	public  ConnectionEntity getConnection() throws InterruptedException, SQLException{
	    lock.lock();
	    try{
			if(idelSize.get()>0){
				if(idelConnections.size()<=0){
					throw new RuntimeException("");
				}
				String key=idelConnections.entrySet().iterator().next().getKey();
				ConnectionEntity entity=idelConnections.entrySet().iterator().next().getValue();
				entity.setStatus(Connection_Status.active);
				idelConnections.remove(key);				
				idelSize.decrementAndGet();
				if(entity.getConnection().isClosed()){
					return getConnection();
				}
				activeConnections.put(key, entity);
				activeSize.incrementAndGet();
				return entity;
			}
	    }finally{
	    	lock.unlock();
	    }
	    
	    if(activeSize.get()>maxSize){
	    	throw new RuntimeException("活跃数量大于最大值");
	    }
	    if(activeSize.get()==maxSize){
	    	synchronized (object) {
	    		object.wait();
			}
	    	
	    }
	    
	    Connection conn=OracleUtils.getConnection();
	    String id=UUID.randomUUID().toString();
	    ConnectionEntity entity=new ConnectionEntity();
	    entity.setId(id);
	    entity.setConnection(conn);
	    entity.setStatus(Connection_Status.active);
	    activeConnections.put(id, entity);
	    activeSize.incrementAndGet();
	    return entity;
	}
	
	
	
	public  void releaseConnection(String id) throws SQLException{
		if(idelSize.get()==maxSize){
			OracleUtils.closeConnection(activeConnections.remove(id).getConnection());
		}else{
			ConnectionEntity entity=activeConnections.remove(id);
			entity.setStatus(Connection_Status.idel);
			idelConnections.put(id, entity);
			idelSize.incrementAndGet();
			activeSize.decrementAndGet();
			synchronized (object) {
				object.notify();
			}
			
		}
	}
	
	private void initConnections(){
		for(int i=0;i<this.initSize;i++){
			ConnectionEntity entity=new ConnectionEntity();
			String id=UUID.randomUUID().toString();
			entity.setId(id);
			entity.setConnection(OracleUtils.getConnection());
			entity.setStatus(Connection_Status.idel);
			idelConnections.put(id, entity);
			idelSize.getAndAdd(1);
		}
	}
	
	public int getIdelSize(){
		return this.idelSize.get();
	}
	
	public int getActiveSize(){
		return this.activeSize.get();
	}
	
	public static ConnectionPool getInstance(int initSize,int maxSize){
		if(initSize<0||maxSize<1){
			throw new RuntimeException("initSize必须不小于0,maxsize必须大于等于1");
		}
		if(initSize>maxSize){
			initSize=maxSize;
		}
		synchronized (ConnectionPool.class) {
			if(instance==null){
				instance=new ConnectionPool(initSize,maxSize);
			}
		}
		return instance;
	}
	
	public  static class ConnectionEntity{
		private String id;
		private Connection connection;
		private Connection_Status status;
		
		public Connection getConnection() {
			return connection;
		}
		public void setConnection(Connection connection) {
			this.connection = connection;
		}
		public Connection_Status getStatus() {
			return status;
		}
		public void setStatus(Connection_Status status) {
			this.status = status;
		}
		public String getId() {
			return id;
		}
		public void setId(String id) {
			this.id = id;
		}
		
		
		
	}
	
	private enum Connection_Status{
		idel,active,close
	}
	
	class DetectFailConnection extends Thread{
		@Override
		public void run() {
			Iterator<String> itIdel=idelConnections.keySet().iterator();
			while(itIdel.hasNext()){
				String key =itIdel.next();
				ConnectionEntity entity=idelConnections.get(key);
				try {
					if(entity.getConnection().isClosed()){
						idelConnections.remove(key);
						idelSize.decrementAndGet();
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			
			Iterator<String> itActive=activeConnections.keySet().iterator();
			while(itActive.hasNext()){
				String key=itActive.next();
				ConnectionEntity entity=activeConnections.get(key);
				try {
					if(entity.getConnection().isClosed()){
						activeConnections.remove(key);
						activeSize.decrementAndGet();
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

测试用例

 


public class TestConnectionPool extends TestCase {
	private ConnectionPool pool=null;
	@Override
	protected void setUp() throws Exception {
		pool=ConnectionPool.getInstance(3, 10);
	}
	
	public void testGetConnection() throws InterruptedException, SQLException{
		Assert.assertEquals(0,pool.getActiveSize());
		Assert.assertEquals(3,pool.getIdelSize());
		ConnectionEntity entity=pool.getConnection();
		ConnectionEntity entity1=pool.getConnection();
		ConnectionEntity entity2=pool.getConnection();
		Assert.assertEquals(3,pool.getActiveSize());
		Assert.assertEquals(0,pool.getIdelSize());
		pool.releaseConnection(entity.getId());
		pool.releaseConnection(entity1.getId());
		pool.releaseConnection(entity2.getId());
		Assert.assertEquals(0,pool.getActiveSize());
		Assert.assertEquals(3,pool.getIdelSize());
		final CountDownLatch latch=new CountDownLatch(5);
		for(int i=0;i<5;i++){
			new Thread(){
				public void run() {
					try {
						
						ConnectionEntity entity=pool.getConnection();
						latch.countDown();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}catch (SQLException e) {
						e.printStackTrace();
					}
				};
			}.start();
		}
		
		latch.await();
		Assert.assertEquals(5,pool.getActiveSize());
		Assert.assertEquals(0,pool.getIdelSize());
		
		final CountDownLatch latch2=new CountDownLatch(5);
		for(int i=0;i<5;i++){
			new Thread(){
				public void run() {
					try {
						for(int i=0;i<20;i++){
							ConnectionEntity entity=pool.getConnection();
							pool.releaseConnection(entity.getId());
						}
						latch2.countDown();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}catch (SQLException e) {
						e.printStackTrace();
					}
				};
			}.start();
		}
		
		latch2.await();
		System.out.println(1);
	}
}

 

 

 

 

 

新手必看:Infineon Memtools烧录配置全流程(附常见错误解决方案) 本文为嵌入式开发新手提供了Infineon AURIX开发环境搭建与Memtools烧录的全流程实战指南。详细解析了ADS、DAS和Memtools三大核心工具的角色与协同关系,并重点讲解了Memtools的图形界面配置步骤、烧录操作流程,以及针对“无法连接设备”、“编程失败”等常见错误的系统性排查与解决方案,帮助开发者快速上手并规避典型陷阱。 阅读详情

相关推荐

WGCNA加权基因共表达网络分析(1)简介、原理

WGCNA简介 WGCNA(Weighted Gene Co-Expression Network Analysis, 加权基因共表达网络分析),鉴定表达模式相似的基因集合(module),解析基因集合与样品表型之间的联系,绘制基因集合之间的调控网络并鉴定关键调控基因 WGCNA适用于复杂的转录组数据(样本数目较多) 研究不同器官/组织类型和不同阶段的发育调控、生物和非生物胁迫的不同时间响应机制 WGCNA原理 原理概要 1.构建基因共表达网络:先构建基因共表达网络,通常利用两两基因之间的表达模式来计算

qq_44520665的博客 3万+

MySql数据库之审计(开启log+设置init-connect实现无插件审计)

目录 一、查询审计配置情况 二、永久开启审计 三、临时开启审计 四、设置init-connect 1、创建用于存放连接日志的数据库和表 2、授权某个用户拥有对审计表的select和insert权限 3、设置init_connect参数 五、验证 六、番外 注:有关MySql数据库的其他操作请参见MySql目录进行查找。 一、查询审计配置情况 show global vari...

地球太危险了吧 5658

第四篇:关于python程序打包的问题-找不到fsspec

这个问题困扰了我将近两天的时间一直找不到什么好的办法,甚至打算放弃。主要原因是身边没有可以述说的人,也没有可以请教的人。正在想要放弃的时候找到了解决办法。 打包后运行程序是这样的, 大概意思是找不见fsspec这个依赖,刚接触python说实话对于这些第三方库理解不是很到位,我的理解就是:类似于java程序中的jar包,程序找不见了。可怎么让他找见了,刚开始以为我自己没有安装fsspec,在cmd中进行了安装,结果如下图所示 很明显,已经安装并且安装目录都有,跟着网上的一些解决办法,在打包的时候把这.

weixin_47861710的博客 5867

实现一个迷你版的RPC

前言 在实际后台服务开发中,比如订单服务(开发者A负责)需要调用商品服务(开发者B负责),那么开发者B会和A约定调用API,以接口的形式提供给A。通常都是B把API上传到Maven私服,然后B开始写API的实现,A只需要引入API依赖进行开发即可。 动手实现RPC 商品服务工程 注意,我将商品服务的API以及实现分为Maven的2个模块来开发。这里...

weixin_34088838的博客 409

在Window上安装和配置VTK9.x,并在QT项目中调试VTK是否可用

VTK+MSVC+Qt Creator + CMake配置

qq_42279379的博客 1000

在线机器学习(OML-AD)应对时序数据概念漂移的异常检测实战

时序数据异常检测是监控系统健康、识别业务风险的核心技术。其基本原理是通过预测模型学习数据的正常模式,并将预测误差作为异常判定的依据。然而,当数据背后的统计规律随时间发生变化,即发生概念漂移时,传统的静态模型会失效,导致误报和漏报激增。在线机器学习技术通过增量学习,使模型能够随每个新数据点实时微调,为预测式异常检测提供了动态适应能力,从而在数据流持续演化的场景下保持检测的鲁棒性。这种将预测与检测无缝衔接的OML-AD框架,尤其适用于工业监控、金融风控等对实时性与资源效率要求高的领域,有效解决了概念漂移这一核心

weixin_29889665的博客 533

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

连接池定义: package mytestforthread; import java.sql.Connection; import java.util.LinkedList; import javax.sql.PooledConnection; /** * @ClassName: ConnectionPool * @Description: TODO(使用等待超时模式来构造一个简单

梦境迷离 858

Python 爬虫进阶技巧:定时爬虫任务实现无人值守采集

常规爬虫多依赖手动触发脚本运行,单次采集完成后需人工二次启动,无法满足日常周期性数据监控、行情抓取、资讯同步、业务台账定时归档等常态化采集需求。搭建可自主调度、自动启停、周期循环的定时爬虫任务,脱离人工干预实现无人值守全自动采集,是爬虫从临时脚本走向工程化落地的关键一步。schedule 轻量定时库官方文档APScheduler 高级定时框架官方文档Python time 内置模块官方文档Linux crontab 定时任务官方手册。

2503_91057718的博客 1121

ThreadPoolExecutor线程池的getActiveCount

一般大家要获取线程池活动线程数量的时候都会用到getActiveCount这个方法,可是根据java api的描述,其实这个方法获取的活动数目是不准确的。如果用这个方法来控制线程池的关闭是不可控的。我个人觉得一般两种方法。 1.如果线程数量一并放入pool的,并且数量是可知的。那可以使用shutdown和awaitTermination这两个方法配合使用。 2.如果数量是不确定的,即可能随时加

sz464759898的专栏 2万+

电机控制的智慧之眼:全面解析FOC状态观测器

摘要:本文深入探讨磁场定向控制(FOC)中的状态观测器技术,重点分析其在无传感器电机控制中的关键作用。文章详细介绍了滑模观测器(SMO)、扩展卡尔曼滤波(EKF)、龙贝格观测器和高频注入法等主流观测器的工作原理、技术特点及适用场景,其中SMO因结构简单、鲁棒性强成为当前主流方案。同时阐述了观测器与锁相环(PLL)结合的工程实践方案,并针对不同应用场景提供了观测器选型建议。文章还探讨了启动问题处理、参数敏感性等工程挑战的解决方案,以及混合观测器、AI应用等未来发展趋势。这些观测器技术使电机系统在无机械传感器情

汽车软件开发 276

实时数字人SoulX-FlashHead 音视频不对齐解决

【代码】实时数字人SoulX-FlashHead 音视频不对齐解决。

jacke121的专栏 202

java写一个简单的jdbc数据库连接池

                                   java写一个简单的jdbc数据库连接池   一、实现原理 1、声明一个静态的变量 public static Vector&lt;Connection&gt; pools 2、将获取到的 java.sql.Connection 对象添加到 pools 中 3、获取的 Connection 对象将 Vector 池中移...

HaHa_Sir的博客 1492

Unet++改进33:添加ConvolutionalGLU(2024最新改进方法)|紧凑的网络结构和高效的运算

由于残差连接的深度退化效应,许多依赖堆叠层进行信息交换的高效视觉变形模型往往不能形成足够的信息混合,导致视觉感知不自然。为了解决这个问题,在本文中,我们提出了聚合注意力,这是一种基于仿生设计的令牌混合器,它模拟生物中央凹视觉和连续眼运动,同时使特征映射上的每个令牌具有全局感知。此外,我们结合了可学习的令牌,与传统的查询和键交互,这进一步多样化了亲和矩阵的生成,而不仅仅依赖于查询和键之间的相似性。我们的方法不依赖于堆叠进行信息交换,从而有效地避免了深度退化,实现了自然的视觉感知。

AIcurator的博客 685

使用等待超时模式写一个简单的数据库连接池

等待超时模式 假设超时时间是T,那么可以推断出在当前时间 now+T 之后就会超时 定义如下变量 等待持续时间:REMAINING = T 超时时间: FUTURE=now+T 这是仅需要wait(REMAINING)即可,在wait(REMAINING)返回之后将会执行: REMAINING = FUTURE-now. 如果REMAINING小于等于0,表示已经超时,直接退出,否则将继续执行...

cd19930508的博客 383

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

写了一个简单的数据库连接池,请帮忙看一下

我是一个新手,第一次发帖,以前都是看别人的帖子。 我写了一个简单的数据库连接池实现,感觉有很多欠缺的地方,希望各位指点一下。十分感谢。 有四个类: (1)连接池配置对象 Config (2)连接池主类 ConnectionPool (3)Properties读取类 PropertyReader (4)异常类 DBPoolException ConnectionPool.ja...

yy59750901的博客 155

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

手动写一个简单的数据库连接池:

public class DBConnectionPool {     private static int MIN_SIZE = 2;     private static int MAX_SIZE = 5;     private static Vector pool = new Vector();     static {            for(int i=0; i&lt;...

博乐汇 220

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

试着用Java写的一个管理数据库连接的简单数据库连接池

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34341117的博客 131

利用C3P0数据源来作连接池,简单的写一个数据库操作来描述分层思想

1.首先准备C3P0jar包: c3p0-0.9.1.2.jar ,这是我使用的,然后下载对应的数据库驱动jar包,mysql-connector-java-5.1.42-bin.jar,然后再下载一个commons-dbutils-1.4.jar包。 2.建立一个web工程,然后把上述3个包放到web-INFO的lib里去。 3.我这里使用的是数据库是mysql,在数据库里

zyp1987106的博客 437

Java基础--JDBC(数据库连接--使用连接池)

/** * 使用连接池连接数据库 * @author */ public class MyDataSource implements DataSource { //1.创建容器用于放置的Connection对象--因为频繁的操作添加和删除所以使用LinkedList对象 private static LinkedList&lt;Connection&gt; ls = new Link...

ekayun 221

java写数据库连接_Java写的数据库连接池

import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.Driver;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;import java.util.Enumeration;imp...

weixin_30909873的博客 219

实现一个简单的数据库连接池

说明 看到团长公众号的文章,自己参照完成一个简单的数据库连接池 正文 ConnPool 连接池类必须实现javax.sql.DataSource接口 package com.datasource.connpool; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter;

wds的博客 1万+

YOLOv5学习路径:从入门到部署的完整指南

目标检测是计算机视觉的核心任务之一,而YOLOv5凭借其成熟的训练链路和丰富的社区资料,成为初学者和工程实践者的首选框架。理解YOLOv5的工作原理,需要从数据标注、模型配置、损失函数到评价指标建立系统认知,掌握迁移学习与超参数调优的基本方法。在实际应用中,小目标检测、推理速度对比和边缘设备部署是高频需求,例如在树莓派上运行自己训练的模型,需要从环境搭建、数据准备、训练评估到ONNX导出与推理服务化的全流程闭环。本文按入门、拓展、进阶、部署四个阶段,梳理YOLOv5的合理学习顺序,帮助学习者快速实现从数据集

weixin_33912453的博客 330

Hutool - DB 连接池配置集成

在实际开发中,尤其是在高并发场景下,使用连接池来管理数据库连接是非常必要的,它可以显著提高数据库操作的性能和效率。Hutool - DB 支持集成多种常见的连接池,如 HikariCP、Druid 等。下面分别介绍如何将这两种连接池集成到 Hutool - DB 中。

十年磨一剑,java开发各种业务系统 1519

Go database/sql连接池 - 源码学习

引言 Go内置了数据库相关的库 - database/sql,实现数据库操作相关的接口,其中还包含一个很重要的功能 - 连接池,用来实现连接的复用,限制连接的数量,从而最大程度的复用连接,提高性能,避免连接数量失控,导致资源消耗不可控。 本文借Go内置的database/sql库,来一起学习如何一步步设计包含连接池的数据库组件,包括模型抽象、连接复用,以及如何管理连接数。 设计 模型抽象 首先,我们要对解决领域进行抽象。 我们目标是设计一个数据库连接组件,所以第一个对象模型很明确 - 数据库对象, 我们将数

编程是艺术,极致是信仰,分享是连接世界的方式。 1442

java 写一个简单的连接池 (入门)

为什么要有连接池 数据库的连接对象创建工作,比较消耗性能。 如何创建简单的连接池 一开始现在内存中开辟一块空间(集合) , 一开先往池子里面放置 多个连接对象。 后面需要连接的话,直接从池子里面去。不要去自己创建连接了。 使用完毕, 要记得归还连接。确保连接对象能循环利用。 代码实现自定义连接池 /** * 这是一个数据库连接池 * 一开始先往池子里面放10个连接 * * ...

qq_40435621的博客 1028
上一篇: 微软100题21题(要求将其中所有的可能组合列出来)
下一篇: java客户端操作Hbase
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值