`
hnylj
  • 浏览: 211055 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

定义自己的数据库连接池

    博客分类:
  • java
阅读更多

这是一个很老的问题-数据库连接池,很多实际开发中都封装了自己的数据库连接访问机制,而数据库连接池是对数据库资源连接利用的一种更有效的管理方式,特别是资源的频繁分配﹑释放的问题。


数据库连接池的实现原理就是为数据库连接建立一个“缓冲池”,预先在这个"缓冲池"中放入一定数量的数据库连接,当我们需要连接时,就从“缓冲池”中取出一个连接,使用完毕之后再放回“缓冲池”中。同时我们通过设置"缓冲池"的最大个数来防止系统无穷无尽地与数据库连接。


在开源世界里,也有很多非常优秀的连接池,例如:C3P0,DBCP,proxool,DBPool等。


下面是本人写的一个非常简单的数据库连接池的实现,主要是体会一下数据库连接池的实现原理!

1.数据库连接池的实现类:

package org.hnylj.db.pool;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 定义自己的数据库连接池
 * @编写者:hnylj
 * 
 */
public class DbConnectionPool {

	private List<Connection> pool;
    private int poolSize;
    private Connection conn = null;
    private static DbConnectionPool instance = null;

    /** 
     * 单粒模式
     * 私有构造方法,获得本类的对象,通过getIstance方法。
     */
    private DbConnectionPool() {
    	pool = new ArrayList<Connection>(poolSize);
        this.createConnection();
    }
    
    /**
     * 得到当前连接池的一个实例
     */
    public static DbConnectionPool getInstance() {
        if (instance == null) {
            instance = new DbConnectionPool();
        }
        return instance;
    }
    
    /**
     * 得到连接池中的一个连接
     */
    public synchronized Connection getConnection() { 
        if (pool.size() > 0) {
            Connection conn = pool.get(0);
            pool.remove(conn);
            return conn;
        } else {
            return null;
        }
    }
    
    /**
     * 创建初始的数据库连接
     */
    private void createConnection() {
        Map<String,String> dbConfig = DbConfig.readDbConfigInfo();
        this.poolSize = Integer.parseInt(dbConfig.get("poolSize"));
        for (int i = 0; i < poolSize; i++) {
            try {
            	Class.forName((String)dbConfig.get("driver"));
                conn = DriverManager.getConnection((String)dbConfig.get("url"), (String)dbConfig.get("username"), (String)dbConfig.get("password"));
                pool.add(conn);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 用完将连接放回到连接池中
     * @param conn
     */
    public synchronized void release(Connection conn) {
        pool.add(conn);
    }

    /** 
     * 关闭连接池中的所有连接
     */
    public synchronized void closePool() {
        for (int i = 0; i < pool.size(); i++) {
            try {
                conn = ((Connection) pool.get(i));
                conn.close();
                pool.remove(i);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws Exception  {
    	System.out.println(new DbConnectionPool().getConnection());
    }
}

 2.数据库连接配置类:

package org.ylj.db.pool;

import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 读取数据库配置信息
 * @编写者:hnylj
 *
 */
public class DbConfig {
	/**
	 * 读取数据库配置信息,以Key-Value对形式返回
	 * @return 
	 */
	public static Map<String,String> readDbConfigInfo() {
		Map<String,String> dbConfigMap = new HashMap<String,String>();
		try {
            String path = System.getProperty("user.dir") + "\\dbConfig.properties";
            FileInputStream is = new FileInputStream(path);
            Properties props = new Properties();
            props.load(is);
            dbConfigMap.put("driver", props.getProperty("driver"));
            dbConfigMap.put("username", props.getProperty("username"));
            dbConfigMap.put("password", props.getProperty("password"));
            dbConfigMap.put("url", props.getProperty("url"));
            dbConfigMap.put("poolSize", props.getProperty("poolSize"));
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("系统找不到指定的dbConfig.properties文件!");        
        }
        return dbConfigMap;
	}
}

 3.数据库配置属性文件dbConfig.properties:

driver = oracle.jdbc.driver.OracleDriver
url = jdbc:oracle:thin:@127.0.0.1:1521:orcl
username = scott
password = tiger
poolSize = 15

 

一个Java技术交流群,一起交流,共同进步,扣扣群号:513086638

 

 

 

4
0
分享到:
评论
2 楼 hifun 2008-09-22  
C3P0 不错的。
1 楼 gml520 2008-09-21  
不错,学习了

相关推荐

    常用jdbc数据库连接jar包,数据库连接池jar包

    本资源集合了常用的JDBC数据库连接jar包,以及一些知名的数据库连接池实现,如dbcp和c3p0,这对于开发人员来说是非常宝贵的资源。 首先,让我们了解一下JDBC。JDBC提供了一套标准的API,包括接口和类,使得开发者...

    c# mysql数据库连接池实现

    本文将深入探讨如何在C#中使用MySQL数据库连接池。 首先,我们需要了解什么是数据库连接池。数据库连接池是一种资源管理技术,它预先创建并维护一定数量的数据库连接,当应用需要时,可以从池中获取连接,使用完毕...

    自己写的数据库连接池(java)

    在给定的标题“自己写的数据库连接池(java)”中,我们可以推测这是一个用户自定义的数据库连接池实现,可能是为了学习或实践目的。描述提到的“XML版读取属性文件”和“普通的”,暗示了两种不同的配置方式,一种是...

    配置数据库连接池

    数据库连接池是现代应用程序中管理数据库连接的一种高效方式,它能显著提高系统性能,减少资源消耗。在给定的标题“配置数据库连接池”中,我们可以深入探讨数据库连接池的概念、工作原理,以及如何配置Oracle9i和...

    数据库连接池java代码实现

    数据库连接池在Java中的实现是提高应用程序性能的关键技术之一,它通过复用已存在的数据库连接,避免了频繁创建和销毁连接导致的系统资源浪费。本文将深入探讨如何使用Java代码来实现一个简单的数据库连接池,并解释...

    java数据库连接池

    上述代码中,`BaseDao`类定义了一个数据库连接池的基本结构,包括初始化参数(如数据库URL、驱动、用户名、密码等),以及用于管理连接的核心属性(如初始连接数、增量连接数、最大连接数和连接池对象)。...

    MySql数据库连接池C#代码(有注释含测试代码)

    MySQL数据库连接池是提高应用程序性能的一种重要技术,它允许开发者管理多个数据库连接并高效地复用这些连接,而不是每次需要时都创建新的连接。在C#编程中,我们可以使用自定义的连接池或者第三方库如ADO.NET的...

    自己写的数据库连接池

    数据库连接池是应用程序管理数据库连接的一种机制,它在多个并发请求之间共享数据库连接,从而减少了创建和销毁数据库连接的开销。在这个项目中,你使用Java实现了一个自定义的数据库连接池,应用了代理模式来优化...

    数据库连接池使用范例

    数据库连接池是现代Web应用程序中不可或缺的一个组件,它在提高数据库访问效率和资源管理方面扮演着重要角色。本文将深入探讨数据库连接池的原理、作用,以及如何在Java Web环境中,特别是结合Tomcat服务器和JSP进行...

    强烈推荐一个简单而实用的数据库连接池工程

    数据库连接池是在应用服务器启动时创建的一组预定义的数据库连接,这些连接在多个用户请求之间共享,而不是为每个请求单独创建新的连接。这样做可以减少建立和关闭连接的开销,避免了频繁的网络通信,提升了系统响应...

    数据库连接池管理策略

    数据库连接池管理策略是优化数据库应用性能的关键环节。在软件开发中,特别是涉及到与数据库交互的应用,连接池的使用能够显著提升系统效率。本文将详细解释数据库连接池的工作原理、优缺点以及如何进行管理和配置。...

    数据库连接池代码完整版

    数据库连接池的实现可以分为两步:定义数据库访问接口和实现该接口。 1. 定义数据库访问接口 定义一个数据库访问接口,包括创建连接和关闭连接两个方法: ```java public interface IDatabaseConnection{ public...

    手动设计自定义数据库连接池

    ### 手动设计自定义数据库连接池 #### 一、数据库连接池概念及作用 数据库连接池是一种用于管理与数据库建立连接的技术方案。它通过维护一个预设的连接集合,来实现对数据库连接的高效利用。连接池的核心价值在于...

    补充 数据库连接池.ppt

    【数据库连接池】是软件开发中用于管理数据库连接的一种技术,旨在提高数据库操作的效率和资源利用率。在传统的JDBC数据库编程中,每个数据库操作都需要建立、使用和关闭数据库连接,这种模式存在明显的性能瓶颈和...

    linux C/C++ 数据库连接池

    这些文件可能包括数据库连接池类的定义(如`DBPool.h`)、实现(如`DBPool.cpp`)、连接管理函数(如`create_conn()`, `free_conn()`)以及其他辅助工具和配置文件。通过阅读和理解这些代码,开发者可以学习到如何在...

    数据库连接池的图解原理

    ### 数据库连接池的图解原理详解 #### 一、引言 在现代Web应用程序开发中,数据库连接池是一项至关重要的技术。它不仅能够显著提高应用程序的性能,还能有效管理数据库资源,避免资源浪费和系统崩溃的风险。本文将...

    数据库连接池的例子数据库连接池的例子

    数据库连接池是应用程序管理数据库连接的一种机制,它提高了数据库访问的效率和资源利用率。通过复用已建立的数据库连接,避免了频繁创建和关闭连接所消耗的时间和系统资源。连接池的基本思想是预先创建一定数量的...

Global site tag (gtag.js) - Google Analytics