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();
}
}
分享到:
相关推荐
本资源"Qt单例模式MySQL连接池.rar"提供了一个使用Qt框架并结合C++单例模式实现的MySQL数据库连接池模板,旨在优化Qt数据库开发的效率。 首先,我们来理解一下“单例模式”。单例模式是一种设计模式,它确保一个类...
* JedisPool:JedisPool 是一个连接池类,负责管理与 Redis 服务器的连接。 * JedisCommands:JedisCommands 是一个命令接口,定义了可以在 Redis 服务器上执行的命令。 工程文件包 在连接 Redis 集群时,我们需要...
本文将详细解析一个基于Apache Commons DBCP实现的数据库连接池单例模式代码。 #### 二、基础知识回顾 1. **连接池**:连接池是一种用于管理数据库连接的技术,它预先创建一定数量的数据库连接并存储在一个池中,当...
### 单实例模式数据库连接池 #### 概述 单实例模式数据库连接池是一种软件设计模式,主要用于提高数据库访问效率并降低系统资源消耗。在该模式下,整个应用程序仅创建一个数据库连接池实例,所有数据库操作共享这...
这些方法的实现会依赖于数据库连接池的API,如JDBC的DataSource接口,以及单例模式下的全局连接池实例。 总结起来,Java自定义连接池和单例模式的结合,可以创建一个高效、稳定的数据库访问层。通过BaseDao类,我们...
单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在IT行业中,尤其是在处理...理解并正确实现单例模式,合理配置和使用数据库连接池,对于提升应用程序的性能和稳定性至关重要。
在实际应用中,为了更好地管理和优化数据库连接,通常会使用连接池(如C3P0、HikariCP、Apache DBCP等),它们能够复用已有的连接,避免频繁创建和销毁连接,提高系统性能。 总的来说,这个Java单例模式的数据库...
在实际应用中,连接池技术可以和其它技术结合使用,例如,J2EE 的 EJB 技术可以和连接池技术结合使用,实现高效的数据库访问。 在使用连接池技术时,需要注意以下几个问题: 1. 并发问题:为了使连接管理服务具有...
设计模式是一种在特定情境下解决问题的通用可复用方案,例如工厂模式可以用于创建数据库连接,单例模式可以保证连接池在整个应用程序中只有一个实例,代理模式则可以用于管理数据库连接的获取和释放。通过合理运用...
在Java中,我们可以通过创建一个管理连接的类来实现连接池。这个类通常包含以下几个核心组件: 1. **连接参数**:如数据库驱动类名(driver)、数据库URL、用户名(user)和密码(password)等,这些是与特定数据库...
可以设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建时读取一个资源文件,其中资源文件中存放着多个数据库的 url 地址、用户名、密码等信息。 * 事务处理:我们知道,事务具有原子性,此时...
本篇文章将详细介绍如何在Python中利用`redis`库实现一个基于单例模式的Redis连接池。 首先,我们需要导入`redis`库,它提供了Python与Redis服务器通信的接口。在下面的代码中,我们定义了一个类`RedisDBConfig`,...
解决多数据库服务器和多用户问题可以设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建时读取一个资源文件,其中包含了不同的数据库连接信息。 Java JDBC 数据库连接池的优点包括: 1. 提高...
- 选择高效的连接池实现,如HikariCP,它的性能通常优于其他传统连接池。 - 适当调整连接池大小,过大可能导致资源浪费,过小可能引起连接等待。 - 开启连接验证,定期检查并移除失效的连接。 在实际应用中,...
7. **代码设计模式**: 可能会涉及到单例模式来确保连接池实例的唯一性,以及工厂模式来创建和管理数据库连接。 8. **版本控制(Git)**: 文件名中的"efea7c1"是Git版本控制系统中的一个提交哈希,可能意味着该代码...
- 设计单例模式的连接池管理类,根据配置文件中的数据库信息动态创建和管理不同的连接池。 3. **连接的创建与回收** - 连接池需要有效地创建连接(如使用线程安全的初始化方法)并确保连接在不再使用时被正确地...
在本项目中,可能会应用到工厂模式(用于创建数据库连接)、单例模式(确保数据库连接池在整个应用中只有一个实例)和代理模式(为数据库连接提供一个接口,便于管理和监控)等。 数据库连接池的核心是管理数据库...