`
wush121
  • 浏览: 12866 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

几种Java数据库连接池实现(一)转

    博客分类:
  • Java
 
阅读更多
package shop;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;

/*
java数据库连接池实现(转载)

作用:
在数据库存取中,数据库连接池是不可缺少的,它可以提高连接利用率
减少连接等待,对于提高数据存储性能会有不小的作用.
原理:
连接池相当于连接的集合,在连接池初始化时先实例化一定数量的空闲连接
等待用户使用,用户使用完连接再将其返回连接池,这样就免去了最耗时的
创建连接的开销在没有空闲连接的情况下,连接池将自动生成连接再分配给
用户请求.
实例:
*/
/*
* 我的数据库连接池
*
* **********模块说明**************
*
* getInstance()返回POOL唯一实例,第一次调用时将执行构造函数
* 构造函数Pool()调用驱动装载loadDrivers()函数;连接池创建createPool()函数 loadDrivers()装载驱动
* createPool()建连接池 getConnection()返回一个连接实例 getConnection(long time)添加时间限制
* freeConnection(Connection con)将con连接实例返回到连接池 getnum()返回空闲连接数
* getnumActive()返回当前使用的连接数
*
*/
public class Pool {
    private static Pool instance = null; // 定义唯一实例

    private int maxConnect = 100;// 最大连接数

    private int normalConnect = 10;// 保持连接数

    private String password = "";// 密码

    private String url = "jdbc:mysql://localhost/shop";// 连接URL

    private String user = "root";// 用户名

    private String driverName = "com.mysql.jdbc.Driver";// 驱动类

    Driver driver = null;// 驱动变量

    DBConnectionPool pool = null;// 连接池实例变量

    // 将构造函数私有,不允许外界访问
    private Pool() {
        loadDrivers(driverName);
        createPool();
    }

    // 装载和注册所有JDBC驱动程序
    private void loadDrivers(String dri) {
        String driverClassName = dri;
        try {
            driver = (Driver) Class.forName(driverClassName).newInstance();
            DriverManager.registerDriver(driver);
            System.out.println("成功注册JDBC驱动程序" + driverClassName);
        } catch (Exception e) {
            System.out.println("无法注册JDBC驱动程序:" + driverClassName + ",错误:" + e);
        }
    }

    // 创建连接池
    private void createPool() {
        pool = new DBConnectionPool(password, url, user, normalConnect,
                maxConnect);
        if (pool != null) {
            System.out.println("创建连接池成功");
        } else {
            System.out.println("创建连接池失败");
        }
    }

    // 返回唯一实例
    public static synchronized Pool getInstance() {
        if (instance == null) {
            instance = new Pool();
        }
        return instance;
    }

    // 获得一个可用的连接,如果没有则创建一个连接,且小于最大连接限制
    public Connection getConnection() {
        if (pool != null) {
            return pool.getConnection();
        }
        return null;
    }

    // 获得一个连接,有时间限制
    public Connection getConnection(long time) {
        if (pool != null) {
            return pool.getConnection(time);
        }
        return null;
    }

    // 将连接对象返回给连接池
    public void freeConnection(Connection con) {
        if (pool != null) {
            pool.freeConnection(con);
        }
    }

    // 返回当前空闲连接数
    public int getnum() {
        return pool.getnum();
    }

    // 返回当前连接数
    public int getnumActive() {
        return pool.getnumActive();
    }

    // 关闭所有连接,撤销驱动注册
    public synchronized void release() {
        // /关闭连接
        pool.release();
        // /撤销驱动
        try {
            DriverManager.deregisterDriver(driver);
            System.out.println("撤销JDBC驱动程序 " + driver.getClass().getName());
        } catch (SQLException e) {
            System.out
                    .println("无法撤销JDBC驱动程序的注册:" + driver.getClass().getName());
        }
    }
}

package shop;

//数据池文件
import java.sql.*;
import java.util.*;
import java.util.Date;

public class DBConnectionPool {
    private int checkedOut;

    private Vector<Connection> freeConnections = new Vector<Connection>();

    private int maxConn;

    // private int normalConn;

    private String password;

    private String url;

    private String user;

    private static int num = 0;// 空闲的连接数

    private static int numActive = 0;// 当前的连接数

    public DBConnectionPool(String password, String url, String user,
            int normalConn, int maxConn) {
        this.password = password;
        this.url = url;
        this.user = user;
        this.maxConn = maxConn;
        // this.normalConn = normalConn;
        for (int i = 0; i < normalConn; i++) { // 初始normalConn个连接
            Connection c = newConnection();
            if (c != null) {
                freeConnections.addElement(c);
                num++;
            }
        }
    }

    // 释放不用的连接到连接池
    public synchronized void freeConnection(Connection con) {
        freeConnections.addElement(con);
        num++;
        checkedOut--;
        numActive--;
        notifyAll();
    }

    // 创建一个新连接
    private Connection newConnection() {
        Connection con = null;
        try {
            if (user == null) { // 用户,密码都为空
                con = DriverManager.getConnection(url);
            } else {
                con = DriverManager.getConnection(url, user, password);
            }
            System.out.println("连接池创建一个新的连接");
        } catch (SQLException e) {
            System.out.println("无法创建这个URL的连接" + url);
            return null;
        }
        return con;
    }

    // 返回当前空闲连接数
    public int getnum() {
        return num;
    }

    // 返回当前连接数
    public int getnumActive() {
        return numActive;
    }

    // 获取一个可用连接
    public synchronized Connection getConnection() {
        Connection con = null;
        if (freeConnections.size() > 0) { // 还有空闲的连接
            num--;
            con = (Connection) freeConnections.firstElement();
            freeConnections.removeElementAt(0);
            try {
                if (con.isClosed()) {
                    System.out.println("从连接池删除一个无效连接");
                    con = getConnection();
                }
            } catch (SQLException e) {
                System.out.println("从连接池删除一个无效连接");
                con = getConnection();
            }
        } else if (maxConn == 0 || checkedOut < maxConn) { // 没有空闲连接且当前连接小于最大允许值,最大值为0则不限制
            con = newConnection();
        }
        if (con != null) { // 当前连接数加1
            checkedOut++;
        }
        numActive++;
        return con;
    }

    // 获取一个连接,并加上等待时间限制,时间为毫秒
    public synchronized Connection getConnection(long timeout) {
        long startTime = new Date().getTime();
        Connection con;
        while ((con = getConnection()) == null) {
            try {
                wait(timeout);
            } catch (InterruptedException e) {
            }
            if ((new Date().getTime() - startTime) >= timeout) {
                return null; // 超时返回
            }
        }
        return con;
    }

    // 关闭所有连接
    public synchronized void release() {
        Enumeration allConnections = freeConnections.elements();
        while (allConnections.hasMoreElements()) {
            Connection con = (Connection) allConnections.nextElement();
            try {
                con.close();
                num--;
            } catch (SQLException e) {
                System.out.println("无法关闭连接池中的连接");
            }
        }
        freeConnections.removeAllElements();
        numActive = 0;
    }
}
分享到:
评论

相关推荐

    Java jdbc数据库连接池总结

    Java JDBC 数据库连接池总结 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁。在 Web 应用开发的早期,主要使用的技术是 CGIASPPHP 等。之后,Sun 公司推出了基于 Java 语言的 ...

    java数据库连接池

    Java数据库连接池(JDBC Connection Pool)是一种管理数据库连接的技术,它允许应用程序重复使用已经存在的数据库连接,而不是每次需要时都创建新的连接。这大大提高了应用程序的性能和效率,因为创建和销毁数据库...

    Java数据库连接池

    Java数据库连接池(Java Database Connection Pool)是一种管理数据库连接的技术,它允许应用程序重复使用已建立的数据库连接,而不是每次需要时都创建新的连接。这样做可以显著提高应用性能,减少资源消耗,并提供...

    Java数据库连接池.doc

    Java数据库连接池是一种高效管理数据库连接的技术,它允许应用程序重复使用已经存在的数据库连接,而不是每次需要访问数据库时都创建新的连接。这样可以显著减少数据库连接的创建和销毁带来的开销,提高系统的性能和...

    Java的JDBC数据库连接池实现方法.doc

    Java 中的数据库连接池可以分为两类:一种是基于应用服务器的连接池,另一种是独立的连接池。在 J2EE 程序中,应用服务器通常提供了数据库连接池的功能,但是对于一般的 Java 应用程序、Applet 或者 JSP、velocity ...

    数据库连接池以及hibernate对各种连接池的整合

    在Java开发中,数据库连接池是一种重要的资源管理工具,它允许开发者高效地管理和复用数据库连接,从而提高系统的性能和稳定性。数据库连接池的基本原理是预先创建一定数量的数据库连接,当应用程序需要访问数据库时...

    JAVA_java数据库连接池[借鉴].pdf

    Java数据库连接池(Java Database Connectivity Pool,简称JDBC连接池)是软件开发中用来管理和优化数据库连接的一种技术。它的核心思想是复用已存在的数据库连接,以减少创建和销毁连接时的开销,提高应用程序的...

    JAVA_java数据库连接池(20210925001831)[借鉴].pdf

    Java数据库连接池是一种高效管理数据库连接的技术,它解决了在多用户环境下频繁创建和销毁数据库连接导致的性能下降和资源浪费问题。在Java中,虽然JDBC API并没有直接提供连接池的功能,但可以通过第三方库实现,如...

    数据库连接池(database connection pool)是在 Java 中用于管理数据库连接的一种技术

    数据库连接池(database connection pool)是在 Java 中用于管理数据库连接的一种技术。它的主要目的是提高数据库连接的重用性和性能。在传统的数据库连接方式中,每次与数据库建立连接时都需要进行一系列的网络通信...

    JavaWeb开发技术-数据库连接池.pptx

    数据库连接池的实现可以使用Java中的DataSource接口,例如Apache Commons DBCP、C3P0等。这些实现提供了数据库连接池的管理和分配功能,可以方便地集成到JavaWeb应用程序中。 数据库连接池是JavaWeb开发中的一种...

    java项目开发实践经验之二:几种常见数据库连接池的使用比较(转)

    NULL 博文链接:https://alex295111.iteye.com/blog/726809

    java-JSP数据库连接池的研究与实现(源代码+论文)

    针对这些突出问题,因此提出了一种基于数据库连接池技术的有效解决方法。简而言之,数据库连接池主要作用是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个;...

    Java中数据库连接池原理机制的详细讲解.doc

    Java中的数据库连接池是一种高效管理数据库连接的技术,旨在优化数据库操作的性能和资源利用率。连接池的基本原理是通过建立一个预设数量的数据库连接池,当程序需要与数据库交互时,可以从池中获取一个已存在的连接...

    数据库连接池PPT,待完成

    接下来,我们将讨论几种流行的数据库连接池实现: 1. Druid数据库连接池:由阿里巴巴开源的Druid,不仅是一个连接池,还提供了监控和扩展功能,包括SQL拦截、日志、统计等,有助于优化数据库访问性能。 2. ...

    JDBC&Druid数据库连接池

    Druid是一个Java语言的数据库连接池,旨在提供高效、稳定、可靠的数据库连接服务。 JDBC基本概念 JDBC是一个用于Java语言的数据库连接API,它提供了统一的接口来连接和操作各种类型的数据库。JDBC主要由以下几个...

    java配置dbcp连接池(数据库连接池)示例分享

    DBCP(Database Connection Pool)是Apache Commons提供的一种开源的数据库连接池实现,旨在提高Java应用程序的性能和可维护性。 DBCP连接池的优点 1. 提高性能:DBCP连接池可以重复使用现有的数据库连接,以减少...

    DBCP数据库连接池终稿.pdf

    DBCP(Jakarta DBCP, Jakarta Commons DBCP)是Apache软件基金会提供的一种开源数据库连接池实现。本篇将详细介绍DBCP数据库连接池的原理和配置。 数据库连接池的基本概念是在应用程序启动时预先创建一定数量的...

    DBCP数据库连接池.pdf

    数据库连接池(Database Connection Pool,简称 DBCP)是一种在多用户、多线程环境中有效管理数据库连接的技术。它的核心思想是复用已存在的数据库连接,而不是每次需要时都创建新的连接,从而减少了数据库连接的...

    Tomcat配置数据库连接池

    Java中的`javax.sql.DataSource`接口是实现数据库连接池的标准方式。 使用连接池有以下几个主要优势: 1. **性能提升**:通过复用已存在的连接,避免了频繁的连接创建和销毁,减少了系统开销。 2. **并发支持**:在...

    JDBC数据库连接池总结.doc

    一、JDBC数据库连接池概述 在基于B/S架构的三层开发模式中,Java应用程序访问数据库的基本原理是通过JDBC(Java DataBase Connection)技术。JDBC是一种“开放”的方案,为数据库应用开发人员和数据库前台工具开发...

Global site tag (gtag.js) - Google Analytics