`

自己编写的_JDBC数据库连接池 (供源代码下载)

阅读更多

我自己实现的数据库连接池

包含的功能:

1、容纳n个打开的连接

2、容纳最大m 最大连接数

2、确定某个连接什么时间在使用

3、如果请求使用n+1个连接,它能创建一个新的连接对象,这个对象包含它的存活时间,过期,则移除该对象

4、当连接超过最大连接数m , 则必须等待,直到有空闲的连接 才可以使用

 

主要类的代码:

 

package database.pool;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
import java.util.Vector;

public class DBConnectFactory {
 private static DBConnectFactory factory = null;

 private static final int INIT_SIZE = 1;

 private static final int MAX_SIZE = 2;

 private long activeTime = 20000;

 private Vector<DBConnection> connectPool = null;

 private String driver;

 private String url;

 private String username;

 private String password;


 private DBConnectFactory() {
  /*
   * 构造方法,初始化
   *
   */
  try {
   validate();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  initProperties();
  this.initPool();
 }

 public static synchronized DBConnectFactory getDBConnectFactory() {
  if (null == factory) {
   factory = new DBConnectFactory();
  }
  return factory;
 }

 private void validate() throws Exception {
  /*
   *
   * 简单的验证
   *
   */
  if (INIT_SIZE < 0 || MAX_SIZE < 0) {
   throw new Exception("连接池的数据为负数,不可以执行!");
  }
  if (INIT_SIZE > MAX_SIZE) {
   throw new Exception("数据库最大连接数小于最小连接数!");
  }
  if(activeTime < 0){
   throw new Exception("连接池的生命周期不可以为负数!");
  }
 }

 private void initProperties() {
  /*
   *
   * 初始化连接的配置
   *
   */
  Properties dbPro = new Properties();
  InputStream input = this.getClass()
    .getResourceAsStream("db.properties");
  try {
   dbPro.load(input);
   this.driver = dbPro.getProperty("driver");
   this.url = dbPro.getProperty("url");
   this.username = dbPro.getProperty("username");
   this.password = dbPro.getProperty("password");

  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 private void initPool() {
  /*
   * 初始化数据库连接池
   *
   */
  if (null == connectPool) {
   connectPool = new Vector<DBConnection>(INIT_SIZE);
   System.out.println(connectPool.size());
   for (int i = 0; i < INIT_SIZE; i++) {
    DBConnection db = new DBConnection(driver, url, username,
      password);
    connectPool.add(db);
   }
  }
 }

 private DBConnection createNewConectionTimer() {
  /*
   * 创建一个连接(新增加连接): 不过,这个连接对象是 DBConnectionTimer
   *
   */
  synchronized (connectPool) {
   DBConnection db = new DBConnectionTimer(driver, url, username,
     password, activeTime);
   connectPool.add(db);
   return db;
  }

 }

 public Connection getConnection() {
  /*
   *
   * 返回一个数据库连接对象
   */
  synchronized (connectPool) {
   DBConnection db = null;
   Connection con = null;
   while (true) { //如果没有找到连接,则必须找到连接才可以退出循环!!!

    for (int i = 0; i < connectPool.size(); i++) {
     db = connectPool.get(i);
     if (!db.isUse()) {
      if (db instanceof DBConnectionTimer) { // 取消定时器
       DBConnectionTimer dbTimer = (DBConnectionTimer) db;
       dbTimer.cacel();

       con = db.getCon();
       db.setUse(true); // 设置使用该连接
       return con; // 直接返回

      } else {
       con = db.getCon();
       db.setUse(true); // 设置使用该连接
       return con; // 直接返回
      }
     }

    }

    if (null == con && connectPool.size() < MAX_SIZE) {
     /*
      * 连接池的对象没有达到最大值。
      */
     System.out.println("创建新的连接对象");
     db = this.createNewConectionTimer(); // 创建新连接
     con = db.getCon();
     db.setUse(true); // 新连接设置为使用
     return con;
    }

    if (null == con && connectPool.size() == MAX_SIZE) {
     // 已经达到最大连接,而且没有使用的连接对象。 应该是连接等待.
     /*
      * 差点在这里出错了, 应该在这里使用一个死循环,直到找到一个连接对象
      *
      */
     try {
      connectPool.wait();
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   }

  }

 }

 public void releaseConnection(Connection con) {
  /*
   * 释放连接 标示连接对象可以再次使用!
   *
   */
  synchronized (connectPool) {
   for (int i = 0; i < connectPool.size(); i++) {
    DBConnection db = connectPool.get(i);
    if (db instanceof DBConnectionTimer) {
     // 计时器开始计时
     DBConnectionTimer dbTimer = (DBConnectionTimer) db;
     DBConTimerTask task = new DBConTimerTask(connectPool,
       dbTimer);
     dbTimer.tick(task);
    } else {
     // 固定的连接,一直存在。
     if (con == db.getCon()) { // 寻找连接,并判断是否相等;
      db.setUse(false);

      connectPool.notify(); // 通知,可以使用连接对象了

      break; // 结束循环
     }
    }

   }
  }

 }
}

1
1
分享到:
评论
1 楼 ileson 2011-11-03  

相关推荐

    JAVA上百实例源码以及开源项目源代码

    Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...

    Eclipse开发入门与项目实践 源代码

    5.4.1 Struts JDBC连接池 187 案例5-4 依据数据库中已注册用户的信息进行用户身份验证 188 5.4.2 动态ActionForm 192 案例5-5 使用动态ActionForm实现身份验证中的新用户注册 193 5.4.3 Validator验证框架...

    Java数据库编程宝典3

    4.6 连接池 4.7 分布式事务处理 4.7.1 分布式事务管理 4.7.2 Connection对象 4.8 SQL语句 4.8.1 Statement对象 4.8.2 PreparedStatement语句 4.8.3 CallableStatement 4.9 事务 4.9.1 事务独立性等级 ...

    Java数据库编程宝典2

    4.6 连接池 4.7 分布式事务处理 4.7.1 分布式事务管理 4.7.2 Connection对象 4.8 SQL语句 4.8.1 Statement对象 4.8.2 PreparedStatement语句 4.8.3 CallableStatement 4.9 事务 4.9.1 事务独立性等级 ...

    Java数据库编程宝典1

    4.6 连接池 4.7 分布式事务处理 4.7.1 分布式事务管理 4.7.2 Connection对象 4.8 SQL语句 4.8.1 Statement对象 4.8.2 PreparedStatement语句 4.8.3 CallableStatement 4.9 事务 4.9.1 事务独立性等级 ...

    java范例开发大全源代码

     1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置是否成功 7  实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  ...

    Java数据库编程宝典4

    4.6 连接池 4.7 分布式事务处理 4.7.1 分布式事务管理 4.7.2 Connection对象 4.8 SQL语句 4.8.1 Statement对象 4.8.2 PreparedStatement语句 4.8.3 CallableStatement 4.9 事务 4.9.1 事务独立性等级 ...

    当当网全套源码(附带邮箱验证功能)

    Struts2,JDBC(连接池),jQuery,Ajax 2)设计思想 MVC和分层设计思想 a.显示层:JSP组件(jQuery,Ajax) b.控制层:Struts2控制器组件、Action组件 c.业务层:Bean组件 d.数据访问层:DAO组件(JDBC) 4.数据库...

    JAVA上百实例源码以及开源项目

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    12.4.2 配置数据库连接池 12.4.3 使用JNDI 12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO 12.6 整合Struts、Spring和...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    该资料是《Oracle SQL高级编程》的源代码 对应的书籍资料见: Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐) 基本信息 原书名: Pro Oracle SQL 原出版社: Apress 作者: (美)Karen Morton Kerry ...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    12.4.2 配置数据库连接池 12.4.3 使用JNDI 12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO 12.6 整合Struts、Spring和...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.4.2 配置数据库连接池 12.4.3 使用JNDI 12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO 12.6 整合Struts、Spring和...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    11.2、在Tomcat中使用数据库连接池 11.3、查找数据源 11.4、本章摘要 第12章 JSP标签编程 12.1、标签编程简介 12.2、定义一个简单的标签 —— 空标签 12.3、定义有属性的标签 12.4、TagSupport类 12.5、定义...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    12.4.2 配置数据库连接池 12.4.3 使用JNDI 12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO 12.6 整合Struts、Spring和...

    2017最新大数据架构师精英课程

    47_mysql数据源连接池 48_NIO" d% v1 P# ~3 S/ L 49_NIO程序- u5 T2 a5 N" {! @8 q4 c 50_Vmware安装-client centos7机安装2 Q. l/ r7 y) ^% n8 |4 _. k 51_centos文件权限-常用命令 52_网络静态ip-NAT连接方式-YUM...

    java开源包10

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    springmybatis

    1.Configuration.xml 是 mybatis 用来建立 sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 &lt;typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/&gt; 这个别名...

    java web开发技术大全

    4.2.2 数据库连接池的应用 4.2 -3实例:用doGet方法处理客户端请求 4.2.4 实例:用doPost方法处理客户端请求 4.2.5 实例:用service方法处理客户端请求 4.2.6 实例:初始化(init)和销毁(destroy)...

Global site tag (gtag.js) - Google Analytics