Java code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
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
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
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();
}
}
分享到:
相关推荐
项目中用到的JCOUtils连接池工具类,单例实现
基于C++实现多线程连接池MySQL源码+项目说明+详细代码注释.zip C++ 调用 MYSQL API 连接池 ## environment: * VS2022 * MySQL8.0.27 ## 高并发下频繁处理瓶颈 * 建立通信:`TCP三次握手` * 数据库服务器的`连接认证...
主要介绍了Python使用redis pool的一种单例实现方式,结合实例形式分析了Python操作redis模块实现共享同一个连接池的相关技巧,需要的朋友可以参考下
mysql链接池,借鉴可以,实际应用需要修改!供初学者使用。
这种模式在一些需要共享状态的场景下非常有用,比如数据库连接池等。单例模式有多种实现方式,其中比较常见的有饿汉式、懒汉式、双重检查锁定等。 工厂设计模式是一种创建型设计模式,它的主要目标是将对象的创建和...
项目是在Linux下以C++开发语言搭建的Web服务器,服务器可以支持相对数量的客户端并发和及时响应,该项目支持用户注册、登录,访问图片和视频。...使用单例模式和RAII机制实现数据库连接池,减少数据库连接的开销
4、数据库连接池 优点: 1、单例模式只能产生一个实例,减少了系统性能的开销,当一个对象的产生需要比较多的资源时,如“读取配置,产生其他依赖对象”可以通过在应用启动时产生一个单例对象,然后永久驻留内存 2、...
利用RAII机制实现了数据库连接池,减少数据库连接建立与关闭的开销,同时实现了用户注册登录功能。 增加logsys,threadpool测试单元(todo: timer, sqlconnpool, httprequest, httpresponse) 环境要求 Linux C++14 ...
包含纯 Java 连接池,可用于胖客户端、Web 应用程序、批处理作业 - 一切基于 Java。 导出功能可用:CSV、HTML、XML、XML-Spreadsheets (Excel) 可用作 XA 和 None-XA 数据源,语句参数可用。 JPA 库用于提供 ...
SpringBoot整合mqtt实现客户端之间的交互
采用连接池技术连接数据库并使用JDBC技术提供商业逻辑层对数据库调用,其次在商业逻辑层是用JavaBean技术,提供给表现层或客户端统一的商业逻辑调用接口,其次还在程序中使用了抽象工厂,单例等设计模式。在表现层...
数据临时存储的地方如静态字典,数据库连接池、线程池、IOC容器实例。 1.1懒汉式 设置构造函数为私有的,避免其他外部类可以对其实例化, 创建静态类来存储实例。 在静态方法中创建实例,避免多个...
这在需要频繁实例化但又耗费大量资源的对象时非常有用,如数据库连接池、配置管理器等。 工厂模式(Factory Pattern) 工厂模式是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建对象的方法。工厂模式...
Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。 Druid已经在阿里巴巴部署了超过600个应用,经过多年多生产环境大规模...
目前提供便利的还有异步的Redis连接池,你可以方便简单的使用redis异步服务而不用担心连接池的问题,我们已经优雅的解决了。但值得注意的是所有的异步服务都只允许在worker进程中调用,task进程只能调用同步服务。...
利用RAII机制实现了数据库连接池,减少了数据库连接建立与关闭的开销,同时实现了用户注册登录功能。增加logsys,threadpool测试单元(待办事项:计时器,sqlconnpool,httprequest,httpresponse)环境要求Linux C ...
请写一个java程序实现线程连接池功能? 122 84.13. 编一段代码,实现在控制台输入一组数字后,排序后在控制台输出; 122 84.14. 列出某文件夹下的所有文件; 123 84.15. java调用系统命令实现删除文件的操作; 123 ...
java设计模式【之】享元模式【源码】【场景:多缓存可选模式】 ... * 使用场景:String 类型,连接池 * Integer.valueOf() 、Long.valueOf() * 当数字范围超出, short 1字节 (-128 、+127),生成模式为 new 新对象
实战:简易数据连接池.mp4 线程之间通信之join应用与实现原理剖析.mp4 ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具...