`
a7683
  • 浏览: 4600 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类

ConnectionPool的实现

阅读更多

本连接池使用了代理模式,消除了油漆工那种繁琐的编码方式,本来嘛,只是修改一个close方法何必去实现整个Connection类。其中main函数中的Connection c11 = ConnectionPool.getConnection();将会报错(应为连接数超过了最大连接数),去掉改行本连接池将能正常运行了,由于注释比较详细,在这里就不多废话了,请个位看如下代码。

java 代码
  1. package cc.vicp.eden.plug;   
  2.   
  3. import java.sql.*;   
  4. import java.util.*;   
  5. import java.lang.reflect.*;   
  6.   
  7. /**  
  8.  * 连接池类。  
  9.  *   
  10.  * @version 0.12  
  11.  * @author Eden  
  12.  *   
  13.  */  
  14. public abstract class ConnectionPool {   
  15.     /**  
  16.      * 连接池。  
  17.      */  
  18.     private static final LinkedList<ConnectionHandler> pool;   
  19.   
  20.     /**  
  21.      * 最小连接数量,最大连接数量。  
  22.      */  
  23.     private static final int minConn, maxConn;   
  24.   
  25.     /**  
  26.      * 当前连接数量。  
  27.      */  
  28.     private static int curConn;   
  29.   
  30.     /**  
  31.      * 数据库的基本参数。  
  32.      */  
  33.     private static final String className, url, user, password;   
  34.     /**  
  35.      * 静态初始化。  
  36.      */  
  37.     static {   
  38.         // 初始化池。   
  39.         pool = new LinkedList<ConnectionHandler>();   
  40.         // 初始化基本连接信息。   
  41.         minConn = 3;   
  42.         maxConn = 10;   
  43.         curConn = 0;   
  44.   
  45.         className = "com.mysql.jdbc.Driver";   
  46.         url = "jdbc:mysql://localhost/jforum";   
  47.         user = "root";   
  48.         password = "n8NrCwfj";   
  49.   
  50.         // 加载数据库驱动。   
  51.         try {   
  52.             Class.forName(className);   
  53.         } catch (ClassNotFoundException e) {   
  54.             e.printStackTrace();   
  55.         }   
  56.     }   
  57.   
  58.     /**  
  59.      * 得到一个连接。  
  60.      *   
  61.      * @return 连接(Connection)对象。  
  62.      * @throws SQLException  
  63.      */  
  64.     public static Connection getConnection() throws SQLException {   
  65.         // 当前已经使用的连接是否达到或超出最大连接数?   
  66.         if (curConn >= maxConn)   
  67.             // 抛出连接用尽异常。   
  68.             throw new ConnectExhaustException();   
  69.         Connection conn = null;   
  70.         synchronized (pool) {   
  71.             // 连接池内的连接是否有可用连接?   
  72.             if (pool.size() > 0) {   
  73.                 ConnectionHandler handler = null;   
  74.                 // 得到一个连接管理者,并从连接池中移除。   
  75.                 handler = pool.removeFirst();   
  76.                 // 将该连接管理者设为可用。   
  77.                 handler.enabled = true;   
  78.                 // 创建一个连接管理者(以代理方式创建)。   
  79.                 conn = (Connection) Proxy.newProxyInstance(handler.conn   
  80.                         .getClass().getClassLoader(), handler.conn.getClass()   
  81.                         .getInterfaces(), handler);   
  82.             } else {   
  83.                 // 创建一个链接。   
  84.                 conn = DriverManager.getConnection(url, user, password);   
  85.                 // 创建一个连接管理者(以代理方式创建)。   
  86.                 conn = (Connection) Proxy.newProxyInstance(conn.getClass()   
  87.                         .getClassLoader(), conn.getClass().getInterfaces(),   
  88.                         new ConnectionHandler(conn));   
  89.             }   
  90.             // 当前已使用连接数增加1。   
  91.             curConn++;   
  92.         }   
  93.         // 以连接的方式返回连接管理者对象   
  94.         return conn;   
  95.     }   
  96.   
  97.     /**  
  98.      * 连接管理者类。  
  99.      *   
  100.      * @author Eden  
  101.      *   
  102.      */  
  103.     private static class ConnectionHandler implements InvocationHandler {   
  104.         /**  
  105.          * 连接是否可用。  
  106.          */  
  107.         private boolean enabled;   
  108.   
  109.         /**  
  110.          * 连接(Connection)对象。  
  111.          */  
  112.         private Connection conn;   
  113.   
  114.         /**  
  115.          * 构造器。  
  116.          *   
  117.          * @param conn  
  118.          *            连接(Connection)对象。  
  119.          *   
  120.          */  
  121.         public ConnectionHandler(Connection conn) {   
  122.             this.conn = conn;   
  123.             enabled = true;   
  124.         }   
  125.   
  126.         /**  
  127.          * 代理方法,特别对于close方法进行了处理。  
  128.          */  
  129.         public Object invoke(Object proxy, Method method, Object[] args)   
  130.                 throws Throwable {   
  131.             // 该连接管理者是否不可用?   
  132.             if (!enabled)   
  133.                 // 抛出空指针异常   
  134.                 throw new NullPointerException();   
  135.             synchronized (pool) {   
  136.                 // 是否调用了close方法?   
  137.                 if (method.getName() == "close") {   
  138.                     // 已使用连接数是否超出了最小连接数。   
  139.                     if (curConn > minConn) {   
  140.                         // 关闭连接。   
  141.                         conn.close();   
  142.                     } else {   
  143.                         // 将连接管理者设为不可用。   
  144.                         this.enabled = false;   
  145.                         // 将该连接返回连接池中。   
  146.                         pool.add(this);   
  147.                     }   
  148.                     // 当前已使用连接数减少1。   
  149.                     curConn--;   
  150. System.out.println(Thread.currentThread().getName() + " : " + method.getName() + "\ncurConn:" + curConn + "\npool:" + pool.size() + "\n");   
  151.                     // 返回一个空值。   
  152.                     return null;   
  153.                 }   
  154.             }   
  155.             // 正常调用连接的各种方法。   
  156.             return method.invoke(conn, args);   
  157.         }   
  158.   
  159.     }   
  160.   
  161.     /**  
  162.      * 连接用尽异常类。  
  163.      *   
  164.      * @author Eden  
  165.      *   
  166.      */  
  167.     private static final class ConnectExhaustException extends RuntimeException {   
  168.         /**  
  169.          * 版本序列号。  
  170.          */  
  171.         private static final long serialVersionUID = 0L;   
  172.     }   
  173.   
  174.     public static void main(String[] args) throws SQLException,   
  175.             InterruptedException {   
  176.         for (int i = 0; i < 50; i++) {   
  177.             Connection conn = null;   
  178.             try {   
  179.                 conn = getConnection();   
  180.             } catch (ConnectExhaustException e) {   
  181.                 Thread.sleep(1000);   
  182.                 i--;   
  183.                 continue;   
  184.             }   
  185.             new Monitor(conn, "Monitor - " + i);   
  186.         }   
  187.     }   
  188. }   
  189.   
  190. class Monitor extends Thread {   
  191.   
  192.     private Connection conn;   
  193.   
  194.     public Monitor(Connection conn, String name) {   
  195.         this.conn = conn;   
  196.         this.setName(name);   
  197.         this.start();   
  198.     }   
  199.   
  200.     public void run() {   
  201.         try {   
  202.             Thread.sleep(10000);   
  203.             conn.close();   
  204.         } catch (SQLException e) {   
  205.             e.printStackTrace();   
  206.         } catch (InterruptedException e) {   
  207.             e.printStackTrace();   
  208.         }   
  209.     }   
  210. }  
分享到:
评论

相关推荐

    ConnectionPool数据库连接池例子.doc

    数据库连接池ConnectionPool的实现和配置 数据库连接池(Database Connection Pool)是一种提高数据库访问效率的技术,通过重用已经创建的数据库连接来减少创建新连接的开销。下面是一个使用Java语言实现的数据库...

    ConnectionPool

    这里我们将深入探讨`ConnectionPool`相关的知识,包括其工作原理、主要功能以及如何通过提供的`ConnectionPool.java`和`PoolManager.java`文件来实现一个简单的连接池。 1. 数据库连接池的工作原理: - 初始化阶段...

    ConnectionPool 基于java实现数据库连接池

    - `ConnectionPool`: 实现连接池的核心类,包含连接的创建、获取、释放和管理逻辑。 - `DatabaseConnection`: 表示单个数据库连接的类,可能包含与特定数据库交互的方法。 - `PoolConfig`: 存储连接池配置信息的类,...

    从一个ConnectionPool的实现看design pattern的运用 (续六).docx

    在这个关于`ConnectionPool`实现的讨论中,我们可以看到多种设计模式的应用,包括工厂模式、装饰模式、适配器模式和组合模式。 首先,`ResourceMan`是一个抽象的pooling逻辑实现,它关注于资源的管理和复用,而不...

    jdbc connection pool

    ### JDBC Connection Pool 实现 #### 一、简介 在Java应用程序中,数据库连接是非常宝贵的资源。为了提高性能和效率,通常会使用连接池技术来管理这些数据库连接。连接池可以复用现有的数据库连接,避免频繁地创建...

    给jdbc加connection pool

    Apache的DBCP(Database Connection Pool)是一个开源的数据库连接池实现,它是Commons DBCP项目的一部分。DBCP提供了数据源接口,使得应用可以通过这个接口获取和释放连接,而实际的连接创建和管理则由连接池来处理...

    ConnectionPool 数据库连接池

    本文将深入解析“ConnectionPool”(数据库连接池)的工作原理,常见实现及使用方法。 **一、数据库连接池的概念** 数据库连接池,简单来说,就是管理数据库连接的池化技术。它预先创建一定数量的数据库连接,当多...

    connection pool

    当你下载这个名为"connection_pool"的压缩包后,解压它,你会看到包含的jar文件,这些文件就是连接池库的实现。将它们导入到你的项目中(例如通过Maven或Gradle的依赖管理),就可以在代码中调用连接池服务,初始化...

    java数据库连接池connectionPool.jar

    `connectionPool.jar`是一个实现了这一功能的库,它将JDBC(Java Database Connectivity)接口封装起来,提供了更简便的配置和使用方式。 **连接池的工作原理:** 1. **初始化**:在应用启动时,连接池会预先创建...

    Java_C3P0_ConnectionPool.rar_C3P0_c3p0 ja_connection pool jdbc_j

    Java_C3P0_ConnectionPool.rar 文件包含的是关于Java中C3P0数据库连接池的实现和使用知识。C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在Java应用程序中,尤其是在...

    3、ConnectionPool---Web容器

    【标题】:“ConnectionPool---Web容器” 在Web开发中,数据库连接池(Connection Pool)扮演着至关重要的角色。它是一种数据库资源管理技术,主要用于优化数据库的连接创建、分配和回收,以提高系统的性能和响应...

    DBCP( Database Connection Pool )数据库连接池

    DBCP(Database Connection Pool)是一个开源的数据库连接池实现,它依赖于Apache Jakarta commons-pool对象池机制。DBCP允许应用程序直接使用数据库连接池的功能,并且Tomcat的数据源也采用了DBCP作为其底层技术。 ...

    Linux-MySQL-ConnectionPool-C.zip

    本项目“Linux-MySQL-ConnectionPool-C.zip”聚焦于使用C语言在Linux操作系统上实现MySQL数据库的连接池技术。下面我们将深入探讨这一主题。 首先,我们需要理解什么是连接池。连接池是数据库管理中的一个概念,它...

    A Method of Design and Optimization of Database Connection Pool

    数据库连接池(Database Connection Pool,简称DCP)被广泛应用于解决传统数据库访问方法中的问题。本文首先介绍了DCP的基本模型及其工作原理,并在此基础上提出了一种动态优化方法。通过分析动态DCP的工作机制,...

    Oracle Universal Connection Pool for JDBC Developer’s Guide 11g

    Oracle Universal Connection Pool(UCP)是一种高效、可配置的连接管理解决方案,它允许应用程序在数据库连接的创建、管理和释放上实现优化,以提高系统性能并减少资源消耗。 在本指南中,开发者将学习如何使用UCP...

    一种简单JDBC数据库连接池的实现.rar_connection pool jdbc_site:www.pudn.com_数据库

    在实现过程中,我们可以使用Java的`java.sql.Connection`接口和`java.sql.DriverManager`类来管理和创建数据库连接。此外,为了简化管理,还可以使用第三方的连接池库,如Apache的DBCP、C3P0或HikariCP等,它们提供...

    Java 的JDBC 数据库连接池实现方法.zip_J2EE JSP_connection pool jdbc_java 连接池

    J2EE 程序员一般都有现成的应用服务器所带的JDBC 数据库连接池,不过对于开发一般的 Java Application 、 Applet 或者 JSP、velocity 时,我们可用的JDBC 数据库连接池并不多,并且一般性能都不好。...

Global site tag (gtag.js) - Google Analytics