当前位置:  技术问答>java相关

关于数据库连接池的问题。。。

    来源: 互联网  发布时间:2015-03-24

    本文导语:  高手能否给在下讲解连接池的实现原理,最好能给一个经典的连接池的原码以及配置的步骤,谢谢! | 原理就是先建立好多个数据库连接,放到一个对象中,使用的时候 从该对象中取出,用...

高手能否给在下讲解连接池的实现原理,最好能给一个经典的连接池的原码以及配置的步骤,谢谢!

|
原理就是先建立好多个数据库连接,放到一个对象中,使用的时候
从该对象中取出,用完再归还。当然还要进行管理。
 /* 
* Copyright (c) 1998 by Gefion software. 

* Permission to use, copy, and distribute this software for 
* NON-COMMERCIAL purposes and without fee is hereby granted 
* provided that this copyright notice appears in all copies. 

*/ 

import java.io.*; 
import java.sql.*; 
import java.util.*; 
import java.util.Date; 

/** 
* This class is a Singleton that provides access to one or many 
* connection pools defined in a Property file. A client gets 
* access to the single instance through the static getInstance() 
* method and can then check-out and check-in connections from a pool. 
* When the client shuts down it should call the release() method 
* to close all open connections and do other clean up. 
*/ 
public class DBConnectionManager { 
   static private DBConnectionManager instance;       // The single instance 
   static private int clients; 

   private Vector drivers = new Vector(); 
   private PrintWriter log; 
   private Hashtable pools = new Hashtable(); 
    
   /** 
    * Returns the single instance, creating one if it's the 
    * first time this method is called. 
    * 
    * @return DBConnectionManager The single instance. 
    */ 
   static synchronized public DBConnectionManager getInstance() { 
       if (instance == null) { 
           instance = new DBConnectionManager(); 
       } 
       clients++; 
       return instance; 
   } 
    
   /** 
    * A private constructor since this is a Singleton 
    */ 
   private DBConnectionManager() { 
       init(); 
   } 
    
   /** 
    * Returns a connection to the named pool. 
    * 
    * @param name The pool name as defined in the properties file 
    * @param con The Connection 
    */ 
   public void freeConnection(String name, Connection con) { 
       DBConnectionPool pool = (DBConnectionPool) pools.get(name); 
       if (pool != null) { 
           pool.freeConnection(con); 
       } 
   } 
        
   /** 
    * Returns an open connection. If no one is available, and the max 
    * number of connections has not been reached, a new connection is 
    * created. 
    * 
    * @param name The pool name as defined in the properties file 
    * @return Connection The connection or null 
    */ 
   public Connection getConnection(String name) { 
       DBConnectionPool pool = (DBConnectionPool) pools.get(name); 
       if (pool != null) { 
           return pool.getConnection(); 
       } 
       return null; 
   } 
    
   /** 
    * Returns an open connection. If no one is available, and the max 
    * number of connections has not been reached, a new connection is 
    * created. If the max number has been reached, waits until one 
    * is available or the specified time has elapsed. 
    * 
    * @param name The pool name as defined in the properties file 
    * @param time The number of milliseconds to wait 
    * @return Connection The connection or null 
    */ 
   public Connection getConnection(String name, long time) { 
       DBConnectionPool pool = (DBConnectionPool) pools.get(name); 
       if (pool != null) { 
           return pool.getConnection(time); 
       } 
       return null; 
   } 
    
   /** 
    * Closes all open connections and deregisters all drivers. 
    */ 
   public synchronized void release() { 
       // Wait until called by the last client 
       if (--clients != 0) { 
           return; 
       } 
        
       Enumeration allPools = pools.elements(); 
       while (allPools.hasMoreElements()) { 
           DBConnectionPool pool = (DBConnectionPool) allPools.nextElement(); 
           pool.release(); 
       } 
       Enumeration allDrivers = drivers.elements(); 
       while (allDrivers.hasMoreElements()) { 
           Driver driver = (Driver) allDrivers.nextElement(); 
           try { 
               DriverManager.deregisterDriver(driver); 
               log("Deregistered JDBC driver " + driver.getClass().getName()); 
           } 
           catch (SQLException e) { 
               log(e, "Can't deregister JDBC driver: " + driver.getClass().getName()); 
           } 
       } 
   } 
    
   /** 
    * Creates instances of DBConnectionPool based on the properties. 
    * A DBConnectionPool can be defined with the following properties: 
    * 
      * <poolname>.url         The JDBC URL for the database      * <poolname>.user        A database user (optional)      * <poolname>.password    A database user password (if user specified)      * <poolname>.maxconn     The maximal number of connections (optional)      * 

    * 
    * @param props The connection pool properties 
    */ 
   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("No URL specified for " + poolName); 
                   continue; 
               } 
               String user = props.getProperty(poolName + ".user"); 
               String password = props.getProperty(poolName + ".password"); 
               String maxconn = props.getProperty(poolName + ".maxconn", "0"); 
               int max; 
               try { 
                   max = Integer.valueOf(maxconn).intValue(); 
               } 
               catch (NumberFormatException e) { 
                   log("Invalid maxconn value " + maxconn + " for " + poolName); 
                   max = 0; 
               } 
               DBConnectionPool pool = 
                   new DBConnectionPool(poolName, url, user, password, max); 
               pools.put(poolName, pool); 
               log("Initialized pool " + poolName); 
           } 
       } 
   } 
    
   /** 
    * Loads properties and initializes the instance with its values. 
    */ 
   private void init() { 
       InputStream is = getClass().getResourceAsStream("/db.properties"); 
       Properties dbProps = new Properties(); 
       try { 
           dbProps.load(is); 
       } 
       catch (Exception e) { 
           System.err.println("Can't read the properties file. " + 
               "Make sure db.properties is in the CLASSPATH"); 
           return; 
       } 
       String logFile = dbProps.getProperty("logfile", "DBConnectionManager.log"); 
       try { 
           log = new PrintWriter(new FileWriter(logFile, true), true); 
       } 
       catch (IOException e) { 
           System.err.println("Can't open the log file: " + logFile); 
           log = new PrintWriter(System.err); 
       } 
       loadDrivers(dbProps); 
       createPools(dbProps); 
   } 
    
   /** 
    * Loads and registers all JDBC drivers. This is done by the 
    * DBConnectionManager, as opposed to the DBConnectionPool, 
    * since many pools may share the same driver. 
    * 
    * @param props The connection pool properties 
    */ 
   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(); 
               DriverManager.registerDriver(driver); 
               drivers.addElement(driver); 
               log("Registered JDBC driver " + driverClassName); 
           } 
           catch (Exception e) { 
               log("Can't register JDBC driver: " + 
                   driverClassName + ", Exception: " + e); 
           } 
       } 
   } 
    
   /** 
    * Writes a message to the log file. 
    */ 
   private void log(String msg) { 
       log.println(new Date() + ": " + msg); 
   } 
    
   /** 
    * Writes a message with an Exception to the log file. 
    */ 
   private void log(Throwable e, String msg) { 
       log.println(new Date() + ": " + msg); 
       e.printStackTrace(log); 
   } 
    
   /** 
    * This inner class represents a connection pool. It creates new 
    * connections on demand, up to a max number if specified. 
    * It also makes sure a connection is still open before it is 
    * returned to a client. 
    */ 
   class DBConnectionPool { 
       private int checkedOut; 
       private Vector freeConnections = new Vector(); 
       private int maxConn; 
       private String name; 
       private String password; 
       private String URL; 
       private String user; 
        
       /** 
        * Creates new connection pool. 
        * 
        * @param name The pool name 
        * @param URL The JDBC URL for the database 
        * @param user The database user, or null 
        * @param password The database user password, or null 
        * @param maxConn The maximal number of connections, or 0 
        *   for no limit 
        */ 
       public DBConnectionPool(String name, String URL, String user, String password, 
               int maxConn) { 
           this.name = name; 
           this.URL = URL; 
           this.user = user; 
           this.password = password; 
           this.maxConn = maxConn; 
       } 
        
       /** 
        * Checks in a connection to the pool. Notify other Threads that 
        * may be waiting for a connection. 
        * 
        * @param con The connection to check in 
        */ 
       public synchronized void freeConnection(Connection con) { 
           // Put the connection at the end of the Vector 
           freeConnections.addElement(con); 
           checkedOut--; 
           notifyAll(); 
       } 
        
       /** 
        * Checks out a connection from the pool. If no free connection 
        * is available, a new connection is created unless the max 
        * number of connections has been reached. If a free connection 
        * has been closed by the database, it's removed from the pool 
        * and this method is called again recursively. 
        */ 
       public synchronized Connection getConnection() { 
           Connection con = null; 
           if (freeConnections.size() > 0) { 
               // Pick the first Connection in the Vector 
               // to get round-robin usage 
               con = (Connection) freeConnections.firstElement(); 
               freeConnections.removeElementAt(0); 
               try { 
                   if (con.isClosed()) { 
                       log("Removed bad connection from " + name); 
                       // Try again recursively 
                       con = getConnection(); 
                   } 
               } 
               catch (SQLException e) { 
                   log("Removed bad connection from " + name); 
                   // Try again recursively 
                   con = getConnection(); 
               } 
           } 
           else if (maxConn == 0 || checkedOut 

    
 
 

您可能感兴趣的文章:

  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • java数据库连接池和数据库连接示例
  • mysql jdbc连接mysql数据库步骤及常见参数详解
  • 通过JDBC连接数据库,执行抄作后,关闭了连接,数据服务器端的进程还在,怎麽处理?
  • 请问连接本机数据库的JDBC,和连接远程的JDBC有没有区别?
  • 在jbuilder中调用一bean连接数据库没有问题,在jsp中调用就连接不上数据库
  • 大家有多少web application是直接连接数据库的?又有多少是通过weblogic或websphere之类连接的?
  • 紧急求助,我的程序连接数据库时,用localhost完全正常,而外部可以访问,但不能访问连接数据的那部分
  • 在linux下可以使用dao方式连接数据库吗?可以连接musql吗?回答就给分!急
  • linux 下连接创建连接数据库程序,什么都可以 。谁知道300分
  • 一个方法中,用Connection con变量连接数据库,执行完sql以后,关闭con,返回resultset,报错“关闭的连接: next”
  • JSP连接MySql/MS SQL Server/Oracle数据库连接方法[整理]
  • 如何建立一个连接数据库的应用?例如连接access、和sql sever.
  • C#连接Excel2003和Excel2007以上版本做数据库的连接字符串
  • NaviCat连接时提示"不支持远程连接的MySql数据库"解决方法
  • Linux 下的C语言实现数据库连接池操作。
  • 请教,TOMCAT4中连接池怎样应用?数据库厂商连接池又如何应用?
  • 数据库连接的问题
  • 关于使用数据库连接的问题。
  • 用JDBC连接Oracle数据库时,如何向数据库中写日期型数据(格式)?谢了!
  • applet连接数库时,不同的htm格式导致无法连接数据库?兄弟们帮忙看一下
  • 基于Key-Value的NOSQL数据库Redis的数据结构及常用相关命令介绍
  • 如何监控数据库的数据,如果数据库数据更改,就通知Server
  • 文档数据库mongodb与列式数据库hbase详细比较
  • 如何从数据库中或文本文件中提取数据到另一个数据库中?
  • SQL Server 2008如何进行数据库分离和附加详细介绍
  • 我从JSP页将数据插入到oracle数据库中,为何汉字插入后数据库中显示为乱码呢?
  • nosql数据库levedb介绍及levedb最新版1.18下载安装
  • 散分:Jbuilder6开发数据库应用请问你们都用什么数据库? 免费的数据库有那些?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 数据在页面写不进数据库,也不可以从数据库中读出是什么原因?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 应该怎么样将一个对象放入到数据库里?还有怎么将图片放进数据库?急~~
  • sql server 2005删除用户时“数据库主体在该数据库中拥有架构,无法删除”错误的解决办法
  • linux上安装oracle 数据库后,是否能写shell程序实现数据库的自动启动。
  • 使用php语句将数据库*.sql文件导入数据库
  • sql数据库修改数据库用户
  • 对数据库的查询结果resultset进行修改后,怎么将修改的信息传回给数据库
  • java中的数据库结果集可以被赋值吗,可以通过结果集的方法来更新数据库字段吗?
  • 请教在linux系统开发环境下,有没有db和dbf数据库引擎,如何使用这个数据库?
  • 手把手教你Oracle数据库导出数据库结构到PowerDesigner
  • 此数据库没有有效所有者,因此无法安装数据库关系图支持对象
  • linux下不知有什么小型的数据库?要求速度比较快,开销最小。并且支持单文件数据库及多表的
  • 将 Ghost 从 SQLite3 数据库迁移到 MySQL 数据库
  • 请问在java钟如何得到数据库中的记录总数,以及如何求数据库中一个字段的和?
  • 求数据库解决方案===求数据库解决方案
  • 各位老大,现在嵌入式数据库都有哪些啊,我的设备配置如下,不知能不能装个数据库呢?
  • sql server 2008中备份集中的数据库备份与现有的xx数据库不同的解决方法
  • java开发数据库,一般是用JDBC-ODBC桥,还是JDBC驱动程序连接数据库呢?
  • eidt.jsp对网页进行编辑,网页内容存放在数据库中,其中有些字段用textarea多行编辑框显示,保存提交数据库后,再次对它编辑,那些用多行
  • 现在java开发中流行通过什么方式实现对数据库操作?就好像Visual Stadio通过ADO访问数据库。
  • 安装时加入外部数据库示例(android外部数据库)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3