单例实现连接池

单例模式的多数据库连接池完整版 单例模式的多数据库连接池完整版 可同时支持目前市面上各种流行的数据库连接 包中自带doc描述,和MSSQL2005的连接示例。 下载后即可用! 立即下载
Java code
package fx.sql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * * 此内部类定义了一个连接池.它能够根据要求创建新连接,直到预定的最大连接数为止. * * 在返回连接给客户程序之前,它能够验证连接的有效性. * * @author FX * */ public class DBConnectionPool { /** * 传说中的连接池 */ private List<Connection> freeConnections =
new ArrayList<Connection>(); private Connection con = null; private int connect = 0; // 使用的连接数 private int maxConn; // 最大连接 @SuppressWarnings("unused") private String name; // 连接池名字 private String driver; // 驱动 private String url; // 数据库连接地址 private String user; // 用户名 private String password;// 密码 /** * 有惨构造创建连接池 * * @param driver * @param name * @param URL * @param user * @param password * @param maxConn */ public DBConnectionPool(String name, String driver, String URL, String user, String password, int maxConn) { this.name = name; this.driver = driver; this.url = URL; this.user = user; this.password = password; this.maxConn = maxConn; poolInfo(); } /** * 显示准备创建连接池的信息 */ private void poolInfo() { Connection conn = this.newConnection(); freeConnections.add(conn); for (int i = 0; i < this.maxConn - 1; i++) { Connection freeConn = conn; freeConnections.add(freeConn); } } /** * 用完,释放连接 * * @param con * 释放一个连接 */ public synchronized void freeConnection(Connection con) { this.freeConnections.add(con); this.connect--; } /** * 从连接池中获取一个可用连接 * * 当无法从池中获取可用连接时,新创建一个连接 * * @return 返回连接对象 */ public synchronized Connection getConnection() { if (this.freeConnections.size() > 0) { con = this.freeConnections.get(0); /** * 当在池中取出一个连接后,删除此连接 */ this.freeConnections.remove(0); /** * 当取出的连接为null时,递归调用自己,直到获得一个可用连接为止 */ if (con == null) con = getConnection(); } else { con = newConnection(); } if (this.maxConn == 0 || this.maxConn < this.connect) { /** * 等待 超过最大连接时 */ con = null; } if (con != null) { this.connect++; } return con; } /** * 释放全部连接 * */ public synchronized void release() { Iterator<Connection> allConns = this.freeConnections.iterator(); while (allConns.hasNext()) { Connection conn = (Connection) allConns.next(); try { if (null != conn) { conn.close(); } conn = null; } catch (SQLException e) { e.printStackTrace(); } } this.freeConnections.clear(); } /** * 创建一个数据库连接对象 * * @return 返回数据库连接 */ private Connection newConnection() { try { Class.forName(driver); } catch (ClassNotFoundException e2) { e2.printStackTrace(); } try { con = DriverManager.getConnection(url, user, password); } catch (SQLException e1) { e1.printStackTrace(); System.exit(0); } return con; } }

 

Java code
package fx.sql; import java.sql.Connection; import java.sql.SQLException; import java.util.Enumeration; import java.util.Hashtable; import fx.toolkit.Evn; /** * 连接池的管理类,负责读取配置连接池的文件,并创建连接池 * * 从池中获取,释放连接 * * @author FX * */ public class DBConnectionManager { /** * 唯一数据库连接池管理实例类 * * 使用单例模式创建 */ private static DBConnectionManager instance; /** * 连接池的集合, */ private Hashtable<String, DBConnectionPool> pools =
new Hashtable<String, DBConnectionPool>(); /** * 得到唯一实例管理类 * * @return 一个连接池的管理类 */ public static synchronized DBConnectionManager getInstance() { if (instance == null) { instance = new DBConnectionManager(); } return instance; } /** * 只允许内部实例化管理类 */ private DBConnectionManager() { this.init(); } /** * 加载驱动程序 */ private void init() { Evn evn = new Evn("/db.properties"); String name = evn.getProperty("name"); String driver = evn.getProperty("driver"); String url = evn.getProperty("url"); String user = evn.getProperty("user"); String password = evn.getProperty("password"); int maxConn = Integer.parseInt(evn.getProperty("maxConn")); DBConnectionPool pool = new DBConnectionPool(name, driver, url, user, password, maxConn); pools.put(name, pool); } /** * 根据连接池的名字得到一个连接 * * @param name * 连接池的名称 * @return 池中的一个可用连接 */ public Connection getConnection(String name) { DBConnectionPool pool = null; Connection con = null; pool = pools.get(name); try { con = pool.getConnection(); } catch (Exception e) { e.printStackTrace(); } return con; } /** * 释放一个连接 * * @param name * 连接池的名称 * @param con * 将要是释放的连接对象 */ public synchronized void freeConnection(String name, Connection con) { DBConnectionPool pool = pools.get(name);// 根据连接池名称得到连接池 if (pool != null) pool.freeConnection(con);// 释放连接 } /** * 释放所有连接 */ public synchronized void release() { Enumeration<DBConnectionPool> allpools = pools.elements(); while (allpools.hasMoreElements()) { DBConnectionPool pool = allpools.nextElement(); if (pool != null) pool.release(); } pools.clear(); } public static void main(String[] args) throws SQLException { DBConnectionManager manager = new DBConnectionManager(); Connection conn = manager.getConnection("fxConnPool"); conn.close(); } }
PCIe 6.0实战指南:从链路训练到信号完整性的避坑手册 本文是一份针对PCIe 6.0硬件工程师的实战避坑指南。文章深入解析了从NRZ到PAM4调制带来的信号完整性挑战,详细拆解了链路训练(LTSSM)的复杂过程与调试方法,并提供了从信道仿真到实验室实测(如使用Keysight示波器进行眼图与误码率分析)的完整信号完整性闭环验证策略,帮助工程师解决高速率下的链路不稳定与降速问题。 阅读详情

相关推荐

brother的PT-9800PCN标签打印机二次开发

本来想通过esc/p指令打印标签,但是无奈能找到的资料太少,而且打电话给客服,也没有sample可以提供参考,后来客服说使用template功能的话,打印很方便。于是下载手册学习了一下, 先下载P-touch Editor软件,制作标签模板。 制作的模板就是普通的标签,不需要连接数据库之类的,模板里有3个object,分别是文本1,文本2,条形码3。这个很关键,后面的代码传送数据,就是按这...

3563

单例模式---数据库连接池应用实例

最近做了项目中的数据库连接的优化工作,用到了数据库连接池,便想起了用单例模式来

老王的博客 1964

STM32F407单一定时器输出4路不同频率及占空比的PWM波

STM32F407单一定时器输出4路不同频率及占空比的PWM波

qq_43868701的博客 4917

单例模式的连接池模板

因为在项目中,要使用到多数据源,且对该项目框架不熟悉,故写出用连接池操作其它的数据库 该模板是查阅API文档,自己手写完成。大大简化了操作的复杂性。具体可看代码 代码: package com.ces.component.issuetable.action; import org.apache.commons.dbcp.BasicDataSource; import org.apache.com...

mufeng 719

【异常】Coze/扣子 Workflow 调用报 4200 错误深度解析

Coze API 的。

奶爸的编程之路,也就一周冷个三天 299

java 连接池 单例_连接池 ----单例模式

packagecom.phone.shuyinghengxie;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.List;importorg.junit.Test;public classCo...

weixin_33260057的博客 317

Vue - 最新详细实现滑块拖动拼图验证,网站登录验证滑块验证功能,拖动滑块到图片缺口的位置即为成功,滑块验证安全检测(详细示例代码,一键复制运行)

您一定见过很多系统都“配备”了滑块验证、拼图验证、找不同等,本质上都是为了验证登录系统的是人还是机器(代码),如下图所示效果: 您打开项目根目录,终端执行如下命令:拼图式拖动滑块验证 验证拖动滑块验证,滑动拼图/图片点选验证 接下来,在中加入以下代码: 如下图所示: 更多配置示例和参数详见官方文档,以下便是如上效果图的代码:.........

🏆 前端领域优质创作者 1万+

单例模式和连接池

经常看见把SQL的连接写成单例模式,就认为可以节省内存开支和优化连接速度,更有认为这样会让数据库连接在高并发的情况下造成锁。其实并未真正体会到单例的使用场景。 从连接数据库上来说,单例模式连接数据库分为两部分: 得到数据库的认证和服务器信息-Datasource 连接数据库-Connecting 其实singleton只发生在第一步Datasource,只形成一个数据库配置实例。至于第二步Connecting和单例没有任何关系,而在高并发出现锁的时候推荐使用连接池才是正道。 只有把Connecting写

nibuyaoshiwang的博客 1380

滑模控制算法(SMC)讲解-案例(附C代码)

该文章介绍了滑模控制算法的原理实现步骤,特点及关键问题,最后以车辆控制案例来讲解滑模控制的整个步骤实现

heda3的博客 4111

需求跟踪详解

需求跟踪是指在软件项目开发过程中,建立并维护需求与项目各阶段工作产物(如设计文档、代码模块、测试用例等)之间对应关系的过程。它不仅记录需求从提出到实现的完整路径,还能反映需求变更时对各阶段工作的影响范围,是连接用户期望与实际软件开发产出的桥梁。

跟佟格湾一起学习计算机知识吧~ 1422

python redis连接池单实例_Python使用redis pool的一种单例实现方式

本文实例讲述了Python使用redis pool的一种单例实现方式。分享给大家供大家参考,具体如下:为适应多个redis实例共享同一个连接池的场景,可以类似于以下单例方式实现:import redisclass RedisDBConfig:HOST = '127.0.0.1'PORT = 6379DBID = 0def operator_status(func):'''''get operato...

weixin_39739234的博客 338

CloudCompare源码分析之CCCoreLib模块:ICP算法(阅读经典)

CloudCompare源码分析之CCCoreLib模块:ICP算法(阅读经典)

dayuhaitang1的博客 2549

java 连接池 单例_java-单例不利于获得JDBC连接吗?连接池有什么好的实现吗?

我使用单例模式为独立应用程序获取jdbc连接.代码如下.public static synchronized MysqlConnect getDbCon() {if ( db == null ) {db = new MysqlConnect();}return db;}但是我在很多讨论中都发现单身人士不利于建立联系.是真的吗并建议使用连接池.谁能给我一个好的使用连接池的实现,而不是上面的代码?解决...

weixin_31299543的博客 249

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

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

Devexpress16.2.6破解工具

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

Redis单例实现连接池工具类

jedisPool依赖apache-commons-pool.jar包 JedisPoolUtil代码: package com.atguigu.redis.test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisPoolUtil { priv

forrest420的专栏 564

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Apache DBCP数据库连接池使用Demo

简介 Apache DBCP是一个封装良好数据库连接池。本文给出了一个配置文件Demo和连接池的单例封装。 连接池单例封装 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

阿刚 2493

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java的单例模式实现从配置文件获取信息和单例实现mysql的数据库连接池

java的单例模式实现从配置文件获取信息 package lm; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Properties; public class ConfigFile { static publ...

weixin_43865381的博客 668

单例数据库连接池的创建

package com.csair.soc.shuffle; import java.beans.PropertyVetoException; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; impo

595

单例实践中如何优化mysql_用单例模式实现一个数据库连接池

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户的数据库应用系统进行性能和风险评估,参与配合进行数据压测演练,提供数据库优化方面专业建议,在业务高峰期与用户共同保障数据库系统平...

weixin_29698317的博客 186

java单例模式的实现(饿汉式vs懒汉式,数据库连接池)

饿汉式实现 懒汉式实现 饿汉式和懒汉式的区别 单例的使用 单例模式的应用场景 数据库连接池:数据库连接池是单例,控制连接数等信息,不够再扩容

aliven1的博客 1115

python 单例模式实现多线程共享连接池

我们经常使用数据库连接池,但那是有时候有些库并没有实现线程安全的连接池,这个时候,该如何自己封装?多进程和多线程甚至协程模式下,如何控制数据库连接数量或者是socket连接数。这个问题很有意义。 该文章后续仍在不断的更新修改中, 请移步到原文地址http://dmwan.cc 首先,多进程,通常的做法是每个进程实例化一个连接池,为什么不共享一个池,因为多进程和多线程同步的开销不...

weixin_42250528的博客 533

单例模式的五种实现方式(饿汉式、懒汉式、DCL懒汉式、静态内部类式、枚举单例)、优缺点比较

单例模式的五种实现方式,分别为:饿汉模式、懒汉模式、DCL懒汉式、静态内部类单例、枚举单例,下面一一介绍每种方式 一、饿汉式 饿汉模式,可以想象一个很饿的人,需要立马吃东西,饿汉模式便是这样,在类加载时就创建对象,由于在类加载时就创建单例,因此不存在线程安全问题 //懒汉式 public class SingletonDemo1 { //私有化构造器 private Singlet...

baolingye的博客 3106

httpclient 单例封装

import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.Map; import net.sf.json.JSONObject; impor...

edwardnb的博客 2639
上一篇: c3p0, dbcp 开源的连接池开源连接使用
下一篇: 两个字母搞定J2EE通用分页标签(二)
flash7783
博客等级 码龄20年 2粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值