动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.精通ejb【六】.
.“Java中可复用事件处理的设计与.
.How to config my internet?.
.关于J2EE中软件基础结构的瓶颈.
.配置Internet Information Servi.
.VJ6.0的使用方法(2)菜单与工具栏.
.Sun Mustang 进入2006.
.java学习笔记--Hiding implement.
.关于在canvas类里调用textbox.
.Hibernate入门.
.WirelessMessagingAPI(1).
.如何在JAVASE中使用Hibernate.
.论全世界所有程序员都会犯的错误.
.关于Java中文问题的几条分析原则.
.SCJP认证套题解析之二.
.用JAVA程序取得IP地址.
.使用Java 1.2的Authenticator 类.
.JAVA入门教程:第四章.
.无线应用系统.
.Web框架对比: Wicket .

自己写的一个未成熟的数据库连接池(一)

发表日期:2008-1-5 |



  源代码:
  
  /*
  * @Title 连接池
  * @Author: zxg
  * @Version 1.0
  * @Memo:定义数据库连接及其数据库连接池等
  */
  package com.drsl.db;
  
  import Java.io.*;
  import java.sql.*;
  import java.util.*;
  import java.util.Date;
  import java.lang.reflect.*;
  import com.mysql.jdbc.Driver;
  
  import com.drsl.db.*;
  
  public class ConnectionManager {
    
    static private ConnectionManager instance; // 唯一实例
    static private int clients;
    static private int maxonlinetime=30*60*1000;
    
    private Vector drivers = new Vector();
    private Hashtable pools = new Hashtable();
    private Timer checkConnTimer=new Timer();
    
    static private PrintWriter log;
    /**
    * 返回唯一实例.假如是第一次调用此方法,则创建实例
    *
    * @return ConnectionManager 唯一实例
    */
    static synchronized public ConnectionManager getInstance() {
      if (instance == null) {
        instance = new ConnectionManager();
      }
  //    clients++;
      return instance;
    }
    
    /**
    * 建构函数私有以防止其它对象创建本类实例
    */
    private ConnectionManager() {
      init();
    }
    
    /**
    * 读取属性完成初始化
    */
    private void init() {
      
      try {
        
        InputStream  is = getClass().getResourceAsStream("db.properties");
        
        Properties  dbProps = new Properties();
      
        dbProps.load(is);
      }
      catch (Exception e) {
        e.printStackTrace();
        System.err.println("不能读取属性文件= " +
        "请确保db.properties在CLASSPATH指定的路径中");
        return;
      }
      String logFile = dbProps.getProperty("logfile", "log.txt");
      try {
        log = new PrintWriter(new FileWriter(logFile, true), true);
      }
      catch (IOException e) {
        System.err.println("无法打开日志文件: " + logFile);
        log = new PrintWriter(System.err);
      }
      loadDrivers(dbProps);
      createPools(dbProps);
    }
    
    /**
    * 装载和注册所有JDBC驱动程序
    *
    * @param props 属性
    */
    private void loadDrivers(Properties props) {
      String driverClasses = props.getProperty("drivers");
      StringTokenizer st = new StringTokenizer(driverClasses);
      while (st.hasMoreElements()) {
        String driverClassName = st.nextToken().trim();
        try {
          
          Driver driver = (Driver)Class.forName(driverClassName).newInstance();
          if(driver!=null){
            DriverManager.registerDriver(driver);
            drivers.addElement(driver);
            log("Begin");
            log("成功注册JDBC驱动程序" + driverClassName);
          }
          else{
            log("Begin");
            log("注册JDBC驱动程序" + driverClassName+"失败");
          }
            
        }
        catch (Exception e) {
          log("Begin");
          log("无法注册JDBC驱动程序: " + driverClassName + ", 错误: " + e);
        }
      }
    }
    
    /**
    * 根据指定属性创建连接池实例.
    *
    * @param props 连接池属性
    */
    private void createPools(Properties props) {
      
      Enumeration propNames = props.propertyNames();
      while (propNames.hasMoreElements()) {
        String name = (String) propNames.nextElement();
        if (name.endsWith(".url")) {
          String poolName = name.substring(0, name.lastIndexOf("."));
          String url = props.getProperty(poolName + ".url");
          if (url == null) {
            log("没有为连接池" + poolName + "指定URL");
            continue;
          }
          
          String user = props.getProperty(poolName + ".user");
          String passWord = props.getProperty(poolName + ".password");
          
          String maxconn = props.getProperty(poolName + ".maxconn", "0");
          String minconn = props.getProperty(poolName + ".minconn", "10");
          String option=props.getProperty(poolName+".option","");
          int max,min;
          try {
            max = Integer.valueOf(maxconn).intValue();
            
          }
          catch (NumberFormatException e) {
            log("错误的最大连接数限制: " + maxconn + " .连接池: " + poolName);
            max = 0;
          }
          
          try {
            min = Integer.valueOf(minconn).intValue();
            
          }
          catch (NumberFormatException e) {
            log("错误的最小连接数限制: " + minconn + " .连接池: " + poolName);
            min = 0;
          }
          
          try{
            ConnectionPool pool = new ConnectionPool(poolName, url,user,password,min,max,option);
            
            pools.put(poolName, pool);
            
            //2秒钟后开始每个一分钟检查一次连接池情况
            checkConnTimer.schedule(pool,2000,60*1000);
  
            log("成功创建连接池" + poolName);
            
          }catch(Exception e){
            log(e,"创建DBConnectionPool出错");
          }
        }
      }
    }
  
    /**
    * 将连接对象返回给由名字指定的连接池
    *
    * @param name 在属性文件中定义的连接池名字
    * @param con 连接对象
    */
    public void freeConnection(String name, Connection conn) {
      ConnectionPool pool = (ConnectionPool) pools.get(name);
      if (pool != null) {
        pool.freeConnection(conn);
      }
    }
    
    /**
    * 获得一个可用的(空闲的)连接.假如没有可用连接,且已有连接数小于最大连接数
    * 限制,则创建并返回新连接
    *
    * @param name 在属性文件中定义的连接池名字
    * @return Connection 可用连接或null
    */
    public Connection getConnection(String name) {
      ConnectionPool pool = (ConnectionPool) pools.get(name);
      if (pool != null) {
        return pool.getConnection();
      }
      return null;
    }
    
    /**
    * 获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制,
    * 则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接.
    *
    * @param name 连接池名字
    * @param time 以毫秒计的等待时间
    * @return Connection 可用连接或null
    */
    public Connection getConnection(String name, long time) {
      ConnectionPool pool = (Con
上一篇:为什么TEXT字段不能存取大于4K的数据 人气:497
下一篇:Borland新一代Java开发环境JBuilder X 人气:372
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号