`

用java实现数据库连接池的一个简单示例

    博客分类:
  • J2SE
阅读更多
转载:http://hi.baidu.com/triceratops/blog
import java.util.Stack;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.log4j.*;

public final class DBConnectionPool {
private static DBConnectionPool dbConnectionPool = null;
private static int accumulator = 0;
private static Logger log = Logger.getLogger(DBConnectionPool.class);

private static final int POOL_INIT_SIZE = 128;
private static final int POOL_MAX_SIZE = 512;

private Stack pool;
private String driverName = "com.ibm.db2.jcc.DB2Driver";
private String url = "jdbc:db2://192.168.1.100:60000/flamingo";
private String user = "daniel";
private String password = "850306";

public static DBConnectionPool getInstance() throws Exception{
   if(dbConnectionPool == null){
    synchronized(DBConnectionPool.class){
     if(dbConnectionPool == null)
      dbConnectionPool = new DBConnectionPool();
    }
   }
   return dbConnectionPool;
}

private DBConnectionPool() throws ClassNotFoundException, SQLException{
   log.setLevel(Level.DEBUG);
   pool = new Stack();
   initializePool();
}

private void initializePool() throws ClassNotFoundException, SQLException{
   log.info("Database connection pool initializing...");
   Connection conn = null;
   try{
    Class.forName(driverName);
    for(int i = 0;i < POOL_INIT_SIZE;i++){
     conn = new DBConnection(DriverManager.getConnection
       (url,user,password),this).getConnection();
       pool.push(conn);
       accumulator++;
    }
   }
   catch(ClassNotFoundException e){
    log.error("Failure: Cannot find the db2 driver!");
    throw e;
   }
   catch(SQLException e){
    log.error("Failure: Cannot connect to the database!");
    throw e;
   }
   log.info("Database connection pool initialized successfully!");
   log.info("pool size is: "+pool.size());
}

public synchronized Connection getConnection() throws ClassNotFoundException, SQLException{
   Connection conn;
   while(true){
      if(!pool.isEmpty()){
      conn = (Connection)pool.pop();
      if(conn == null || conn.isClosed()){
         accumulator--;
         continue;
      }
      return conn;
      }
      else{
      if(accumulator == POOL_MAX_SIZE){
         try{
          wait(5000); 
         }
         catch(InterruptedException e){
          e.printStackTrace();
         }
      }
      else{
         //create a new database connection
         try{
          Class.forName(driverName);
          conn = new DBConnection(DriverManager.getConnection
       (url,"db2inst2","db2inst2"),this).getConnection();
          accumulator++;
          return conn;
         }
         catch(ClassNotFoundException e){
          log.error("Failure: Cannot find the db2 driver!");
          throw e;
         }
         catch(SQLException e){
          log.error("Failure: Cannot connect to the database!");
          throw e;
         }
      }
      }
   }
}

public synchronized boolean returnConnection(Connection conn){
   if(pool.size() < POOL_MAX_SIZE){
      pool.push(conn);
      log.info(conn +" has been returned!");
      notify();
      return true;
   }
   return false; // The connection pool is full filled.
}

public static void main(String[] args) throws Exception{
   Connection conn = getInstance().getConnection();
   System.out.println(conn);
   conn.close();
}
}


===============================================================================

import java.sql.Connection;
import java.sql.SQLException;
import java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.apache.log4j.Logger;
import org.apache.log4j.Level;

public class DBConnection implements InvocationHandler{

private Connection conn;
private DBConnectionPool dbConnectionPool;

private static Logger log = Logger.getLogger(DBConnectionPool.class);

DBConnection(Connection conn,DBConnectionPool dbConnectionPool){
   this.conn = conn;
   this.dbConnectionPool = dbConnectionPool;
   log.setLevel(Level.DEBUG);
}

//return the proxy of an inner hold connection
Connection getConnection(){
   return (Connection)Proxy.newProxyInstance(
    conn.getClass().getClassLoader(),new Class[]{Connection.class},this);
}

public Object invoke(Object proxy,Method method, Object[] args) 
    throws SQLException, IllegalAccessException,InvocationTargetException{
   Object result = null;
   try{
      log.debug("Method: "+method.getName()+" starts......");
      if(method.getName().equals("close")){
      close();
      }
      else{
      result = method.invoke(conn,args);
      }
      log.debug("Method: "+method.getName()+" ends......");
   }
   catch(SQLException e){
      log.error("Database operation failed, please try later...");
      throw e;
   }
   catch(IllegalAccessException e){
    log.error(method.getName()+" operation forbidden!");
      throw e;
   }
   catch(InvocationTargetException e){
    log.error(method.getName()+" operation forbidden!");
      throw e;
   }
   return result;
}

private void close() throws SQLException{
   if(!dbConnectionPool.returnConnection(getConnection())){
    conn.close();
    log.info(conn + " is closed!");
    conn = null;
   }
}
}

分享到:
评论
1 楼 ranguisheng 2013-04-12  
可以加点注释,代码不便于阅读.

相关推荐

    java数据库连接池源码及使用示例

    总结来说,本资源提供了学习和实践Java数据库连接池的一个起点。通过分析源码并运行示例,你可以深入理解数据库连接池的实现细节,这将对提升Java应用的数据库性能有很大帮助。同时,这也是一次了解和比较不同连接池...

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

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

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

    本文将深入探讨Java数据库连接池的原理、使用以及示例。 首先,理解数据库连接池的工作机制至关重要。数据库连接池在初始化时会创建一定数量的数据库连接,这些连接存储在内存中,形成一个“池”。应用程序在需要时...

    java通过HikariCP实现数据库连接池示例.zip

    在Java中,实现数据库连接池通常涉及创建一个能够管理数据库连接的池类。这个池类需要维护一个空闲连接的集合,提供获取和释放连接的方法,并且可能...压缩包文档记录的是一个使用HikariCP实现数据库连接池的简单示例。

    使用JAVA中的动态代理实现数据库连接池

    以下是一个简单的示例,展示如何使用动态代理实现数据库连接池: 1. 定义数据库连接池参数类(如`DBPoolConfig`),存储JDBC驱动类名、URL、用户名和密码等信息,用于初始化连接池。 ```java public class ...

    一个效果非常不错的JAVA数据库连接池

    ### 标题解析:“一个效果非常不错的JAVA数据库连接池” 此标题明确指出这是一个Java实现的数据库连接池,并且其效果良好。这意味着该连接池不仅能够有效管理数据库连接,还能确保高性能和稳定性。对于那些希望深入...

    java数据库连接池笔记

    Java数据库连接池是一种管理数据库连接的技术,用于高效地管理和复用数据库连接,从而提高应用程序的性能和资源利用率。连接池的基本思想是在应用启动时预先创建一定数量的数据库连接,存储在一个池中,当应用程序...

    轻量级java数据库连接池

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

    jsp连接数据库连接池代码示例

    数据库连接池是一种管理数据库连接的技术,它预先初始化一定数量的数据库连接并保存在内存中,当应用程序需要连接数据库时,可以从连接池中获取一个已存在的连接,用完后再归还,而不是每次都新建和关闭连接。...

    数据库连接池配置

    下面是一个简化的示例,展示了如何实现一个基础的连接池`ConnectionPool`: ```java public class ConnectionPool implements TimerListener { private int m_ConnectionPoolSize; private int m_...

    java oracle 数据库 连接池 小例子

    本示例是关于如何使用C3P0连接池来连接Oracle数据库的一个简单实例。C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。 首先,我们需要理解什么是数据库连接池。数据库连接...

    基于java的数据库连接池技术的设计与实现

    1. **连接池框架的选择**:目前主流的Java数据库连接池框架有Apache Commons DBCP、C3P0、Druid等。不同的框架有不同的特点,选择合适的框架可以更好地满足项目需求。 2. **配置参数设置**:合理设置连接池的相关...

    数据库连接池的实现(java版本)

    文章中的示例代码提供了一个简单的数据库连接池实现——`ConnectionPool`类。这个类包含了一些关键属性和方法,下面我们来逐一介绍: 1. **属性定义**: - `private String jdbcDriver=""`:存储数据库驱动名称。 ...

    Java类实现数据库连接池(源码)

    本示例将探讨如何通过自定义Java类来实现一个简单的数据库连接池。 首先,我们需要引入JDBC(Java Database Connectivity)API,这是Java与各种数据库交互的标准接口。在Java中,我们通常使用`java.sql.Connection`...

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

    数据库连接池是现代Java应用程序中不可或缺的部分,它有效地管理和复用数据库连接,提高了系统的性能和效率。本项目基于Java实现了这样一个连接池,旨在帮助开发者理解其工作原理,并能在实际项目中灵活运用。 在...

    Java实现数据库连接池..docx

    Java 实现数据库连接池主要涉及两个关键点:减少使用者与连接池之间的耦合度和接管 `Connection.close()` 方法。为了实现这两个目标,我们可以利用 Java 的动态代理机制。 首先,了解数据库连接池的作用。连接池是...

    数据库连接池pdf

    数据库连接池是一种用于提高数据库访问效率的技术,其基本思想是在程序启动时预创建一定数量的数据库连接,并将其存储在一个“缓冲池”中。当应用程序需要访问数据库时,可以直接从连接池中获取已存在的连接,使用...

    java数据库连接池c3p0

    Java数据库连接池C3P0是一种常用的开源数据库连接管理工具,它通过提供连接池服务,提高了应用程序处理数据库连接的效率,降低了系统资源的消耗。在Java应用中,尤其是在服务器端,数据库连接的创建和关闭是相对耗时...

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

    ### Java中数据库连接池原理机制的详细讲解 #### 一、引言 在现代软件开发中,特别是基于Java的企业级应用开发中,数据库连接管理是一个关键环节。由于数据库连接是昂贵的资源,频繁地创建与关闭连接将严重影响系统...

    数据库连接池使用范例

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

Global site tag (gtag.js) - Google Analytics