`

java数据库连接池实现

阅读更多
.package cc.vicp.eden.plug;   
.  
.import java.sql.*;   
.import java.util.*;   
.import java.lang.reflect.*;   
.  
./**  
. * 连接池类。  
. *   
. * @version 0.13  
. * @author Eden  
. *   
. */  
.public abstract class ConnectionPool {   
.    /**  
.     * 连接池。  
.     */  
.    private static final LinkedList<ConnectionHandler> pool;   
.  
.    /**  
.     * 最小连接数量,最大连接数量。  
.     */  
.    private static final int minConn, maxConn;   
.  
.    /**  
.     * 当前连接数量。  
.     */  
.    private static int curConn;   
.  
.    /**  
.     * 数据库的基本参数。  
.     */  
.    private static final String className, url, user, password;   
.    /**  
.     * 静态初始化。  
.     */  
.    static {   
.        // 初始化池。   
.        pool = new LinkedList<ConnectionHandler>();   
.        // 初始化基本连接信息。   
.        minConn = 70;   
.        maxConn = 100;   
.        curConn = 0;   
.  
.        className = "com.mysql.jdbc.Driver";   
.        url = "jdbc:mysql://localhost/jforum";   
.        user = "root";   
.        password = "n8NrCwfj";   
.  
.        // 加载数据库驱动。   
.        try {   
.            Class.forName(className);   
.        } catch (ClassNotFoundException e) {   
.            e.printStackTrace();   
.        }   
.    }   
.  
.    /**  
.     * 得到一个连接。  
.     *   
.     * @return 连接(Connection)对象。  
.     * @throws SQLException  
.     */  
.    public static Connection getConnection() throws SQLException {   
.        // 当前已经使用的连接是否达到或超出最大连接数?   
.        if (curConn >= maxConn)   
.            // 抛出连接用尽异常。   
.            throw new ConnectExhaustException();   
.        Connection conn = null;   
.        synchronized (pool) {   
.            // 连接池内的连接是否有可用连接?   
.            if (pool.size() > 0) {   
.                ConnectionHandler handler = null;   
.                // 得到一个连接管理者,并从连接池中移除。   
.                handler = pool.removeFirst();   
.                // 将该连接管理者设为可用。   
.                handler.enabled = true;   
.                // 创建一个连接管理者(以代理方式创建)。   
.                conn = (Connection) Proxy.newProxyInstance(handler.conn   
.                        .getClass().getClassLoader(), handler.conn.getClass()   
.                        .getInterfaces(), handler);   
.            } else {   
.                // 创建一个链接。   
.                conn = DriverManager.getConnection(url, user, password);   
.                // 创建一个连接管理者(以代理方式创建)。   
.                conn = (Connection) Proxy.newProxyInstance(conn.getClass()   
.                        .getClassLoader(), conn.getClass().getInterfaces(),   
.                        new ConnectionHandler(conn));   
.            }   
.            // 当前已使用连接数增加1。   
.            curConn++;   
.            System.out.println(Thread.currentThread().getName()   
.                    + " : getConnection" + "\ncurConn:" + curConn + "\npool:"  
.                    + pool.size() + "\n");   
.        }   
.        // 以连接的方式返回连接管理者对象   
.        return conn;   
.  
.    }   
.  
.    /**  
.     * 连接管理者类。  
.     *   
.     * @author Eden  
.     *   
.     */  
.    private static class ConnectionHandler implements InvocationHandler {   
.        /**  
.         * 连接是否可用。  
.         */  
.        private boolean enabled;   
.  
.        /**  
.         * 连接(Connection)对象。  
.         */  
.        private Connection conn;   
.  
.        /**  
.         * 构造器。  
.         *   
.         * @param conn  
.         *            连接(Connection)对象。  
.         *   
.         */  
.        public ConnectionHandler(Connection conn) {   
.            this.conn = conn;   
.            enabled = true;   
.        }   
.  
.        /**  
.         * 代理方法,特别对于close方法进行了处理。  
.         */  
.        public Object invoke(Object proxy, Method method, Object[] args)   
.                throws Throwable {   
.            // 该连接管理者是否不可用?   
.            if (!enabled)   
.                // 抛出空指针异常   
.                throw new NullPointerException();   
.            // 是否调用了close方法?   
.            if (method.getName() == "close") {   
.                synchronized (pool) {   
.                    // 已使用连接数是否超出了最小连接数。   
.                    if (curConn > minConn) {   
.                        // 关闭连接。   
.                        conn.close();   
.                    } else {   
.                        // 将连接管理者设为不可用。   
.                        this.enabled = false;   
.                        // 将该连接返回连接池中。   
.                        pool.add(this);   
.                    }   
.                    // 当前已使用连接数减少1。   
.                    curConn--;   
.                    System.out.println(Thread.currentThread().getName() + " : "  
.                            + method.getName() + "\ncurConn:" + curConn   
.                            + "\npool:" + pool.size() + "\n");   
.                }   
.                // 返回一个空值。   
.                return null;   
.            }   
.  
.            // 正常调用连接的各种方法。   
.            return method.invoke(conn, args);   
.        }   
.  
.    }   
.  
.    /**  
.     * 连接用尽异常类。  
.     *   
.     * @author Eden  
.     *   
.     */  
.    private static final class ConnectExhaustException extends RuntimeException {   
.        /**  
.         * 版本序列号。  
.         */  
.        private static final long serialVersionUID = 0L;   
.    }   
.  
.    // /////////////////////////////////////////////////////////   
.    /* 其后部分为测试代码。 */  
.    private static final Object lock = new Object();   
.  
.    public static void main(String[] args) throws SQLException,   
.            InterruptedException {   
.        // 产生100个等待线程。   
.        for (int i = 0; i < 100; i++) {   
.            new Monitor("Monitor - " + i);   
.        }   
.        // 提供产生100个等待线程的等待时间(1秒)。   
.        Thread.sleep(1000);   
.        synchronized (cc.vicp.eden.plug.Monitor.lock) {   
.            // 同时唤醒所有线程。   
.            cc.vicp.eden.plug.Monitor.lock.notifyAll();   
.        }   
.        // 等待线程执行(5秒)。   
.        Thread.sleep(5000);   
.        // 答应最终剩余连接数以及连接池中的可用连接数。   
.        System.out.println("\n\n\nfinal curConn : " + curConn + "\nfinal pool : " + pool.size());   
.    }   
.}   
.  
./**  
. * 测试类。  
. *   
. * @author Eden  
. *   
. */  
.class Monitor extends Thread {   
.  
.    public static final Object lock = new Object();   
.  
.    private Connection conn;   
.    private static final Random random = new Random();   
.       
.       
.    public Monitor(String name) {   
.        this.setName(name);   
.        this.setPriority(Thread.MAX_PRIORITY);   
.        this.start();   
.    }   
.  
.    @Override  
.    public void run() {   
.        synchronized (lock) {   
.            try {   
.                System.out.println(this.getName() + " is ready!");   
.                lock.wait();   
.            } catch (InterruptedException e) {   
.                e.printStackTrace();   
.            }   
.        }   
.  
.        try {   
.            this.conn = ConnectionPool.getConnection();   
.        } catch (SQLException e) {   
.            e.printStackTrace();   
.        }   
.           
.        /*try {  
.            Thread.sleep(Math.abs(random.nextInt() % 3) + 1);  
.        } catch (InterruptedException e) {  
.            e.printStackTrace();  
.        }*/  
.           
.        try {   
.            conn.close();   
.        } catch (SQLException e) {   
.            e.printStackTrace();   
.        }   
.    }   
.}  

 

 

 

 

分享到:
评论

相关推荐

    java数据库连接池

    常见的Java数据库连接池实现有Apache的DBCP、C3P0,以及HikariCP等,它们提供了更完善的连接管理功能和性能优化策略。 总结一下,Java数据库连接池的基本概念和上述代码中的实现包括以下几点: 1. 数据库连接信息...

    轻量级java数据库连接池

    本项目提供了一个轻量级的Java数据库连接池实现,旨在简化开发过程,提高应用性能并降低资源消耗。下面将详细介绍这个轻量级Java数据库连接池的设计理念、工作原理以及如何使用。 1. **设计理念** 轻量级数据库...

    JAVA 完整的数据库连接池实现

    总结,Java 完整的数据库连接池实现涉及到选择合适的连接池实现、配置参数、初始化连接池以及在代码中正确地获取和释放连接。理解这些概念和步骤对于优化 Java 应用程序的数据库性能至关重要。通过合理配置和使用...

    java 数据库 连接池驱动.rar

    2. **常见的Java数据库连接池实现** - C3P0:一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。 - DBCP (Apache BasicDataSource):Apache的一个开源项目,基于Jakarta Pool实现...

    JAVA数据库连接池

    Java数据库连接池是Java开发中一个非常重要的技术,它主要用于管理数据库连接,提高数据库操作的效率和性能。在Java应用程序中,频繁地创建和关闭数据库连接会导致大量的系统资源浪费,而连接池则可以复用已建立的...

    JAVA数据库连接池类

    本篇文章将深入解析一个自定义的JAVA数据库连接池类,帮助开发者更好地理解和运用这一关键技术。 首先,连接池的基本思想是预先创建一定数量的数据库连接,并存储在一个集合(如Vector)中,供应用程序按需获取和...

    JAVA 使用数据库连接池连接Oracle数据库全代码

    ### JAVA 使用数据库连接池连接Oracle数据库全代码解析 #### 一、概述 本文将详细介绍如何在Java项目中使用Apache DBCP(Database Connection Pool)来连接Oracle数据库,并提供完整的示例代码。通过这种方式,我们...

    java数据库连接池.rar

    总的来说,Java数据库连接池如C3P0和Druid,以及Spring的JdbcTemplate,都是为了优化数据库操作而设计的工具。它们各自有其特点和优势,开发者可以根据项目需求选择合适的技术。在使用过程中,充分理解和合理配置...

    Java数据库连接池的原理与应用.pdf

    Java数据库连接池的原理与应用 在Java开发领域,数据库连接池(Database Connection Pool,简称DBCP)是一种提高数据库访问性能、降低资源消耗的重要技术。它通过预先建立一定数量的数据库连接,存储在一个“池”中...

    Java数据库连接池的使用示例

    Java数据库连接池是Java应用程序管理数据库连接的一种高效方式。它避免了每次需要访问数据库时创建新的连接,而是预先创建一定数量的连接并保存在池中,当程序需要时可以从池中获取,用完后归还,从而提高了系统性能...

Global site tag (gtag.js) - Google Analytics