单例实现连接池

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(); } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值