`

单例实现连接池

阅读更多
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(); } }
分享到:
评论

相关推荐

    JCO连接池工具类 JCOUtils

    项目中用到的JCOUtils连接池工具类,单例实现

    基于C++实现多线程连接池MySQL源码+项目说明+详细代码注释.zip

    基于C++实现多线程连接池MySQL源码+项目说明+详细代码注释.zip C++ 调用 MYSQL API 连接池 ## environment: * VS2022 * MySQL8.0.27 ## 高并发下频繁处理瓶颈 * 建立通信:`TCP三次握手` * 数据库服务器的`连接认证...

    Python使用redis pool的一种单例实现方式

    主要介绍了Python使用redis pool的一种单例实现方式,结合实例形式分析了Python操作redis模块实现共享同一个连接池的相关技巧,需要的朋友可以参考下

    mysql连接池

    mysql链接池,借鉴可以,实际应用需要修改!供初学者使用。

    设计模式:单例设计模式(全部实现方式)工厂设计模式,抽象工厂模式

    这种模式在一些需要共享状态的场景下非常有用,比如数据库连接池等。单例模式有多种实现方式,其中比较常见的有饿汉式、懒汉式、双重检查锁定等。 工厂设计模式是一种创建型设计模式,它的主要目标是将对象的创建和...

    基于Linux的web服务器

    项目是在Linux下以C++开发语言搭建的Web服务器,服务器可以支持相对数量的客户端并发和及时响应,该项目支持用户注册、登录,访问图片和视频。...使用单例模式和RAII机制实现数据库连接池,减少数据库连接的开销

    GOF23之单例模式

    4、数据库连接池 优点: 1、单例模式只能产生一个实例,减少了系统性能的开销,当一个对象的产生需要比较多的资源时,如“读取配置,产生其他依赖对象”可以通过在应用启动时产生一个单例对象,然后永久驻留内存 2、...

    C++ Linux WebServer服务器

    利用RAII机制实现了数据库连接池,减少数据库连接建立与关闭的开销,同时实现了用户注册登录功能。 增加logsys,threadpool测试单元(todo: timer, sqlconnpool, httprequest, httpresponse) 环境要求 Linux C++14 ...

    NativeSQLPersistence:使用本机 Java 连接池执行本机 SQL。-开源

    包含纯 Java 连接池,可用于胖客户端、Web 应用程序、批处理作业 - 一切基于 Java。 导出功能可用:CSV、HTML、XML、XML-Spreadsheets (Excel) 可用作 XA 和 None-XA 数据源,语句参数可用。 JPA 库用于提供 ...

    SpringBoot整合mqtt实现客户端之间的交互

    SpringBoot整合mqtt实现客户端之间的交互

    网上商城下载、

    采用连接池技术连接数据库并使用JDBC技术提供商业逻辑层对数据库调用,其次在商业逻辑层是用JavaBean技术,提供给表现层或客户端统一的商业逻辑调用接口,其次还在程序中使用了抽象工厂,单例等设计模式。在表现层...

    创建型 结构型 设计型设计模式相关知识

    数据临时存储的地方如静态字典,数据库连接池、线程池、IOC容器实例。   1.1懒汉式 设置构造函数为私有的,避免其他外部类可以对其实例化, 创建静态类来存储实例。 在静态方法中创建实例,避免多个...

    常用开发模式讲解.zip

    这在需要频繁实例化但又耗费大量资源的对象时非常有用,如数据库连接池、配置管理器等。 工厂模式(Factory Pattern) 工厂模式是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建对象的方法。工厂模式...

    基于SSM架构实现的大型分布式购物网站-B2C项目源码+项目说明.zip

    Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。 Druid已经在阿里巴巴部署了超过600个应用,经过多年多生产环境大规模...

    Swoole 分布式通讯框架 SwooleDistributed.zip

    目前提供便利的还有异步的Redis连接池,你可以方便简单的使用redis异步服务而不用担心连接池的问题,我们已经优雅的解决了。但值得注意的是所有的异步服务都只允许在worker进程中调用,task进程只能调用同步服务。...

    WebServer:C ++ Linux Web服务器服务器

    利用RAII机制实现了数据库连接池,减少了数据库连接建立与关闭的开销,同时实现了用户注册登录功能。增加logsys,threadpool测试单元(待办事项:计时器,sqlconnpool,httprequest,httpresponse)环境要求Linux C ...

    java面试题

    请写一个java程序实现线程连接池功能? 122 84.13. 编一段代码,实现在控制台输入一组数字后,排序后在控制台输出; 122 84.14. 列出某文件夹下的所有文件; 123 84.15. java调用系统命令实现删除文件的操作; 123 ...

    java设计模式【之】享元模式【源码】【场景:多缓存可选模式】

    java设计模式【之】享元模式【源码】【场景:多缓存可选模式】 ... * 使用场景:String 类型,连接池 * Integer.valueOf() 、Long.valueOf() * 当数字范围超出, short 1字节 (-128 、+127),生成模式为 new 新对象

    Java并发编程原理与实战

    实战:简易数据连接池.mp4 线程之间通信之join应用与实现原理剖析.mp4 ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具...

Global site tag (gtag.js) - Google Analytics