Java jdbc数据库连接池总结!(转)

1. 引言

  近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机

  应用程序已从传统的桌面应用转到Web应用。基于B/S(Browser/Server)架构的3层开发模式逐渐取代C/S(Client/Server)架构的开发模式,成为开发企业级应用和电子商务普遍采用的技术。在Web应用开发的早期,主要使用的技术是CGIASPPHP等。之后,Sun公司推出了基于Java语言的Servlet+Jsp+JavaBean技术。相比传统的开发技术,它具有跨平台﹑安全﹑有效﹑可移植等特性,这使其更便于使用和开发。

  Java应用程序访问数据库的基本原理

  在Java语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁,

  即Java语言通过JDBC技术访问数据库。JDBC是一种“开放”的方案,它为数据库应用开发人员﹑数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库应用程序。JDBC提供两种API,分别是面向开发人员的API和面向底层的JDBC驱动程序API,底层主要通过直接的JDBC驱动和JDBC-ODBC桥驱动实现与数据库的连接。

  一般来说,Java应用程序访问数据库的过程(如图1所示)是:

  ①装载数据库驱动程序;

  ②通过JDBC建立数据库连接;

  ③访问数据库,执行SQL语句;

  ④断开数据库连接。


图1 Java数据库访问机制
  JDBC作为一种数据库访问技术,具有简单易用的优点。但使用这种模式进行Web应用
   程序开发,存在很多问题:首先,每一次Web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还 要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉不出系统有多大的开销。可是对于现在的Web应用,尤其是大型电子商务网站, 同时有几百人甚至几千人在线是很正常的事。在这种情况下,频繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的甚至会造成服 务器的崩溃。不是危言耸听,这就是制约某些电子商务网站发展的技术瓶颈问题。其次,对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未 能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接 过多,也可能导致内存泄漏,服务器崩溃。
 
  数据库连接池(connection pool)的工作原理

  1、基本概念及原理
由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理。我们知道,

  对于共享资源,有一个很著名的设计模 式:资源池(Resource Pool)。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接 建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定 连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调 整提供依据。连接池的基本工作原理见下图2。

图2 连接池的基本工作原理
  2、服务器自带的连接池
  JDBC的API中没有提供连接池的方法。一些大型的WEB应用服务器如BEA的WebLogic和IBM的WebSphere等提供了连接池的机制,但是必须有其第三方的专用类方法支持连接池的用法。
  连接池关键问题分析
  1、并发问题
  为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。这个问题相对比较好解决,因为Java语言自身提供了对并发管理的支持,使用synchronized关键字即可确保线程是同步的。使用方法为直接在类方法前面加上synchronized关键字,如:
public synchronized Connection getConnection()
  2、多数据库服务器和多用户
  对于大型的企业级应用,常常需要同时连接不同的数据库(如连接OracleSybase)。 如何连接不同的数据库呢?我们采用的策略是:设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建时读取一个资源文件,其中资源文件中存 放着多个数据库的url地址(<poolName.url>)﹑用户名(<poolName.user>)﹑密码 (<poolName.password>)等信息。如 tx.url=192.168.1.123:5000/tx_it,tx.user=cyl,tx.password=123456。根据资源文件提供的 信息,创建多个连接池类的实例,每一个实例都是一个特定数据库的连接池。连接池管理类实例为每个连接池实例取一个名字,通过不同的名字来管理不同的连接 池。
  对于同一个数据库有多个用户使用不同的名称和密码访问的情况,也可以通过资源文件处理,即在资源文件中设置多个具有相同url地址,但具有不同用户名和密码的数据库连接信息。
  3、事务处理

  我们知道,事务具有原子性,此时要求对数据库的操作符合“ALL-ALL-NOTHING”原则,即对于一组SQL语句要么全做,要么全不做。
Java语 言中,Connection类本身提供了对事务的支持,可以通过设置Connection的AutoCommit属性为false,然后显式的调用 commit或rollback方法来实现。但要高效的进行Connection复用,就必须提供相应的事务支持机制。可采用每一个事务独占一个连接来实 现,这种方法可以大大降低事务管理的复杂性。

  4、连接池的分配与释放
  连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。
   对于连接的管理可使用空闲池。即把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。每当用户请求一个连接时,系统首先检查空闲池内有没有空 闲连接。如果有就把建立时间最长(通过容器的顺序存放实现)的那个连接分配给他(实际是先做连接是否有效的判断,如果可用就分配给用户,如不可用就把这个 连接从空闲池删掉,重新检测空闲池是否还有连接);如果没有则检查当前所开连接池是否达到连接池所允许的最大连接数(maxConn),如果没有达到,就 新建一个连接,如果已经达到,就等待一定的时间(timeout)。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户,如果等待时间 超过预定时间timeout,则返回空值(null)。系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。对于空闲连接的状态,可开 辟专门的线程定时检测,这样会花费一定的系统开销,但可以保证较快的响应速度。也可采取不开辟专门线程,只是在分配前检测的方法。
  5、连接池的配置与维护
   连接池中到底应该放置多少连接,才能使系统的性能最佳?系统可采取设置最小连接数(minConn)和最大连接数(maxConn)来控制连接池中的连 接。最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应 起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。最大连接数是连 接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过反复测试,找到最佳点。

  如何确保连接池中的最小连接数呢?有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。
连接池的实现

  1、连接池模型
  本文讨论的连接池包括一个连接池类(DBConnectionPool)和一个连接池管理类(DBConnetionPoolManager)和一个配置文件操作类(ParseDSConfig)。连接池类是对某一数据库所 有连接的“缓冲池”,主要实现以下功能:①从连接池获取或创建可用连接;②使用完毕之后,把连接返还给连接池;③在系统关闭前,断开所有连接并释放连接占 用的系统资源;④还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时,通讯问题),并能够限制连接池中的连接总数不低于某个预定值 和不超过某个预定值。(5)当多数据库时,且数据库是动态增加的话,将会加到配置文件中。

  连接池管 理类是连接池类的外覆类(wrapper),符合单例模式,即系统中只能有一个连接池管理类的实例。其主要用于对多个连接池对象的管理,具有以下功能:① 装载并注册特定数据库的JDBC驱动程序;②根据属性文件给定的信息,创建连接池对象;③为方便管理多个连接池对象,为每一个连接池对象取一个名字,实现 连接池名字与其实例之间的映射;④跟踪客户使用连接情况,以便需要是关闭连接释放资源。连接池管理类的引入主要是为了方便对多个连接池的使用和管理,如系 统需要连接不同的数据库,或连接相同的数据库但由于安全性问题,需要不同的用户使用不同的名称和密码。
         2、连接池实现(经过本人改版,可以适用多数据库类型的应用以及一种数据库类型多个数据库且数据  库的数量可以动态增加的应用程序)
         1),DBConnectionPool.java   数据库连接池类
         2),DBConnectionManager .java   数据库管理类
         3),DSConfigBean .java                单个数据库连接信息Bean
         4),ParseDSConfig.java                操作多(这个'多'包括不同的数据库和同一种数据库有多个数据库)
                                                            数据 配置文件xml
         5),ds.config.xml                           数据库配置文件xml
         原代码如下: 
        DBConnectionPool.java  
        ----------------------------------------------------------
      /**
 * 数据库连接池类
 */

  1 package com.chunkyo.db;
  2 import java.sql.Connection;
  3 import java.sql.DriverManager;
  4 import java.sql.SQLException;
  5 import java.util.ArrayList;
  6 import java.util.Iterator;
  7 import java.util.Timer;
  8 /**
  9  * @author chenyanlin
 10  *
 11  */
 12 public class DBConnectionPool implements TimerListener {
 13  private Connection con=null;
 14  private int inUsed=0;    //使用的连接数
 15  private ArrayList freeConnections = new ArrayList();//容器,空闲连接
 16  private int minConn;     //最小连接数
 17  private int maxConn;     //最大连接
 18  private String name;     //连接池名字
 19  private String password; //密码
 20  private String url;      //数据库连接地址
 21  private String driver;   //驱动
 22  private String user;     //用户名
 23  public Timer timer;      //定时
 24  /**
 25   *
 26   */
 27  public DBConnectionPool() {
 28   // TODO Auto-generated constructor stub
 29  }
 30  /**
 31   * 创建连接池
 32   * @param driver
 33   * @param name
 34   * @param URL
 35   * @param user
 36   * @param password
 37   * @param maxConn
 38   */
 39  public DBConnectionPool(String name, String driver,String URL, String user, String password, int maxConn)
 40  {
 41   this.name=name;
 42   this.driver=driver;
 43   this.url=URL;
 44   this.user=user;
 45   this.password=password;
 46   this.maxConn=maxConn;
 47  }
 48  /**
 49   * 用完,释放连接
 50   * @param con
 51   */
 52  public synchronized void freeConnection(Connection con)
 53  {
 54   this.freeConnections.add(con);//添加到空闲连接的末尾
 55   this.inUsed--;
 56  }
 57  /**
 58   * timeout  根据timeout得到连接
 59   * @param timeout
 60   * @return
 61   */
 62  public synchronized Connection getConnection(long timeout)
 63  {
 64   Connection con=null;
 65   if(this.freeConnections.size()>0)
 66   {
 67    con=(Connection)this.freeConnections.get(0);
 68    if(con==null)con=getConnection(timeout); //继续获得连接
 69   }
 70   else
 71   {
 72    con=newConnection(); //新建连接
 73   }
 74   if(this.maxConn==0||this.maxConn<this.inUsed)
 75   {
 76    con=null;//达到最大连接数,暂时不能获得连接了。
 77   }
 78   if(con!=null)
 79   {
 80    this.inUsed++;
 81   }
 82   return con;
 83  }
 84  /**
 85   *
 86   * 从连接池里得到连接
 87   * @return
 88   */
 89  public synchronized Connection getConnection()
 90  {
 91   Connection con=null;
 92   if(this.freeConnections.size()>0)
 93   {
 94    con=(Connection)this.freeConnections.get(0);
 95    this.freeConnections.remove(0);//如果连接分配出去了,就从空闲连接里删除
 96    if(con==null)con=getConnection(); //继续获得连接
 97   }
 98   else
 99   {
100    con=newConnection(); //新建连接
101   }
102   if(this.maxConn==0||this.maxConn<this.inUsed)
103   {
104    con=null;//等待 超过最大连接时
105   }
106   if(con!=null)
107   {
108    this.inUsed++;
109    System.out.println("得到 "+this.name+" 的连接,现有"+inUsed+"个连接在使用!");
110   }
111   return con;
112  }
113  /**
114   *释放全部连接
115   *
116   */
117  public synchronized void release()
118  {
119   Iterator allConns=this.freeConnections.iterator();
120   while(allConns.hasNext())
121   {
122    Connection con=(Connection)allConns.next();
123    try
124    {
125     con.close();
126    }
127    catch(SQLException e)
128    {
129     e.printStackTrace();
130    }
131    
132   }
133   this.freeConnections.clear();
134    
135  }
136  /**
137   * 创建新连接
138   * @return
139   */
140  private Connection newConnection()
141  {
142   try {
143    Class.forName(driver);
144    con=DriverManager.getConnection(url, user, password);
145   } catch (ClassNotFoundException e) {
146    // TODO Auto-generated catch block
147    e.printStackTrace();
148    System.out.println("sorry can't find db driver!");
149   } catch (SQLException e1) {
150    // TODO Auto-generated catch block
151    e1.printStackTrace();
152    System.out.println("sorry can't create Connection!");
153   }
154   return con;
155   
156  }
157  /**
158   * 定时处理函数
159   */
160  public synchronized void TimerEvent()
161  {
162      //暂时还没有实现以后会加上的
163  }
164  /**
165   * @param args
166   */
167  public static void main(String[] args) {
168   // TODO Auto-generated method stub
169  }
170  /**
171   * @return the driver
172   */
173  public String getDriver() {
174   return driver;
175  }
176  /**
177   * @param driver the driver to set
178   */
179  public void setDriver(String driver) {
180   this.driver = driver;
181  }
182  /**
183   * @return the maxConn
184   */
185  public int getMaxConn() {
186   return maxConn;
187  }
188  /**
189   * @param maxConn the maxConn to set
190   */
191  public void setMaxConn(int maxConn) {
192   this.maxConn = maxConn;
193  }
194  /**
195   * @return the minConn
196   */
197  public int getMinConn() {
198   return minConn;
199  }
200  /**
201   * @param minConn the minConn to set
202   */
203  public void setMinConn(int minConn) {
204   this.minConn = minConn;
205  }
206  /**
207   * @return the name
208   */
209  public String getName() {
210   return name;
211  }
212  /**
213   * @param name the name to set
214   */
215  public void setName(String name) {
216   this.name = name;
217  }
218  /**
219   * @return the password
220   */
221  public String getPassword() {
222   return password;
223  }
224  /**
225   * @param password the password to set
226   */
227  public void setPassword(String password) {
228   this.password = password;
229  }
230  /**
231   * @return the url
232   */
233  public String getUrl() {
234   return url;
235  }
236  /**
237   * @param url the url to set
238   */
239  public void setUrl(String url) {
240   this.url = url;
241  }
242  /**
243   * @return the user
244   */
245  public String getUser() {
246   return user;
247  }
248  /**
249   * @param user the user to set
250   */
251  public void setUser(String user) {
252   this.user = user;
253  }
254 }

-------------------------------------------
 DBConnectionManager .java
------------------------------------------
/**
 * 数据库连接池管理类
 */

  1 package com.chunkyo.db;
  2 import java.sql.Connection;
  3 import java.util.ArrayList;
  4 import java.util.Enumeration;
  5 import java.util.HashMap;
  6 import java.util.Hashtable;
  7 import java.util.Iterator;
  8 import java.util.Properties;
  9 import java.util.Vector;
 10 import com.chunkyo.db.ParseDSConfig;
 11 import com.chunkyo.db.DSConfigBean;
 12 import com.chunkyo.db.DBConnectionPool;
 13 /**
 14  * @author chenyanlin
 15  *
 16  */
 17 public class DBConnectionManager {
 18  static private DBConnectionManager instance;//唯一数据库连接池管理实例类
 19  static private int clients;                 //客户连接数
 20  private Vector drivers  = new Vector();//驱动信息
 21  private Hashtable pools=new Hashtable();//连接池
 22  
 23  /**
 24   * 实例化管理类
 25   */
 26  public DBConnectionManager() {
 27   // TODO Auto-generated constructor stub
 28   this.init();
 29  }
 30  /**
 31   * 得到唯一实例管理类
 32   * @return
 33   */
 34  static synchronized public DBConnectionManager getInstance()
 35  {
 36   if(instance==null)
 37   {
 38    instance=new DBConnectionManager();
 39   }
 40   return instance;
 41   
 42  }
 43  /**
 44   * 释放连接
 45   * @param name
 46   * @param con
 47   */
 48  public void freeConnection(String name, Connection con)
 49  {
 50   DBConnectionPool pool=(DBConnectionPool)pools.get(name);//根据关键名字得到连接池
 51   if(pool!=null)
 52   pool.freeConnection(con);//释放连接
 53  }
 54  /**
 55   * 得到一个连接根据连接池的名字name
 56   * @param name
 57   * @return
 58   */
 59  public Connection getConnection(String name)
 60  {
 61   DBConnectionPool pool=null;
 62   Connection con=null;
 63   pool=(DBConnectionPool)pools.get(name);//从名字中获取连接池
 64   con=pool.getConnection();//从选定的连接池中获得连接
 65   if(con!=null)
 66   System.out.println("得到连接。。。");
 67   return con;
 68  }
 69  /**
 70   * 得到一个连接,根据连接池的名字和等待时间
 71   * @param name
 72   * @param time
 73   * @return
 74   */
 75  public Connection getConnection(String name, long timeout)
 76  {
 77   DBConnectionPool pool=null;
 78   Connection con=null;
 79   pool=(DBConnectionPool)pools.get(name);//从名字中获取连接池
 80   con=pool.getConnection(timeout);//从选定的连接池中获得连接
 81   System.out.println("得到连接。。。");
 82   return con;
 83  }
 84  /**
 85   * 释放所有连接
 86   */
 87  public synchronized void release()
 88  {
 89   Enumeration allpools=pools.elements();
 90   while(allpools.hasMoreElements())
 91   {
 92    DBConnectionPool pool=(DBConnectionPool)allpools.nextElement();
 93    if(pool!=null)pool.release();
 94   }
 95   pools.clear();
 96  }
 97  /**
 98   * 创建连接池
 99   * @param props
100   */
101  private void createPools(DSConfigBean dsb)
102  {
103   DBConnectionPool dbpool=new DBConnectionPool();
104   dbpool.setName(dsb.getName());
105   dbpool.setDriver(dsb.getDriver());
106   dbpool.setUrl(dsb.getUrl());
107   dbpool.setUser(dsb.getUsername());
108   dbpool.setPassword(dsb.getPassword());
109   dbpool.setMaxConn(dsb.getMaxconn());
110   System.out.println("ioio:"+dsb.getMaxconn());
111   pools.put(dsb.getName(), dbpool);
112  }
113  /**
114   * 初始化连接池的参数
115   */
116  private void init()
117  {
118   //加载驱动程序
119   this.loadDrivers();
120   //创建连接池
121   Iterator alldriver=drivers.iterator();
122   while(alldriver.hasNext())
123   {
124    this.createPools((DSConfigBean)alldriver.next());
125    System.out.println("创建连接池。。。");
126    
127   }
128   System.out.println("创建连接池完毕。。。");
129  }
130  /**
131   * 加载驱动程序
132   * @param props
133   */
134  private void loadDrivers()
135  {
136   ParseDSConfig pd=new ParseDSConfig();
137  //读取数据库配置文件
138   drivers=pd.readConfigInfo("ds.config.xml");
139   System.out.println("加载驱动程序。。。");
140  }
141  /**
142   * @param args
143   */
144  public static void main(String[] args) {
145   // TODO Auto-generated method stub
146  }
147 }

----------------------------------------
DSConfigBean.java
----------------------------------------
/**
 * 配置文件Bean类
 */

  1 package com.chunkyo.db;
  2 /**
  3  * @author chenyanlin
  4  *
  5  */
  6 public class DSConfigBean {
  7  private String type     =""; //数据库类型
  8  private String name     =""; //连接池名字
  9  private String driver   =""; //数据库驱动
 10  private String url      =""; //数据库url
 11  private String username =""; //用户名
 12  private String password =""; //密码
 13  private int maxconn  =0; //最大连接数
 14  /**
 15   *
 16   */
 17  public DSConfigBean() {
 18   // TODO Auto-generated constructor stub
 19  }
 20  /**
 21   * @param args
 22   */
 23  public static void main(String[] args) {
 24   // TODO Auto-generated method stub
 25  }
 26  /**
 27   * @return the driver
 28   */
 29  public String getDriver() {
 30   return driver;
 31  }
 32  /**
 33   * @param driver the driver to set
 34   */
 35  public void setDriver(String driver) {
 36   this.driver = driver;
 37  }
 38  /**
 39   * @return the maxconn
 40   */
 41  public int getMaxconn() {
 42   return maxconn;
 43  }
 44  /**
 45   * @param maxconn the maxconn to set
 46   */
 47  public void setMaxconn(int maxconn) {
 48   this.maxconn = maxconn;
 49  }
 50  /**
 51   * @return the name
 52   */
 53  public String getName() {
 54   return name;
 55  }
 56  /**
 57   * @param name the name to set
 58   */
 59  public void setName(String name) {
 60   this.name = name;
 61  }
 62  /**
 63   * @return the password
 64   */
 65  public String getPassword() {
 66   return password;
 67  }
 68  /**
 69   * @param password the password to set
 70   */
 71  public void setPassword(String password) {
 72   this.password = password;
 73  }
 74  /**
 75   * @return the type
 76   */
 77  public String getType() {
 78   return type;
 79  }
 80  /**
 81   * @param type the type to set
 82   */
 83  public void setType(String type) {
 84   this.type = type;
 85  }
 86  /**
 87   * @return the url
 88   */
 89  public String getUrl() {
 90   return url;
 91  }
 92  /**
 93   * @param url the url to set
 94   */
 95  public void setUrl(String url) {
 96   this.url = url;
 97  }
 98  /**
 99   * @return the username
100   */
101  public String getUsername() {
102   return username;
103  }
104  /**
105   * @param username the username to set
106   */
107  public void setUsername(String username) {
108   this.username = username;
109  }
110 }

-----------------------------------------------------
ParseDSConfig.java
-----------------------------------------------------
/**
 * 操作配置文件类 读  写 修改 删除等操作
 */

  1 package com.chunkyo.db;
  2 import java.io.FileInputStream;
  3 import java.io.FileNotFoundException;
  4 import java.io.FileOutputStream;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.util.List;
  8 import java.util.Vector;
  9 import java.util.Iterator;
 10 import org.jdom.Document;
 11 import org.jdom.Element;
 12 import org.jdom.JDOMException;
 13 import org.jdom.input.SAXBuilder;
 14 import org.jdom.output.Format;
 15 import org.jdom.output.XMLOutputter;
 16 /**
 17  * @author chenyanlin
 18  *
 19  */
 20 public class ParseDSConfig {
 21  /**
 22   * 构造函数
 23   */
 24  public ParseDSConfig() {
 25   // TODO Auto-generated constructor stub
 26  }
 27  /**
 28   * 读取xml配置文件
 29   * @param path
 30   * @return
 31   */
 32  public Vector readConfigInfo(String path)
 33  {
 34   String rpath=this.getClass().getResource("").getPath().substring(1)+path;
 35   Vector dsConfig=null;
 36   FileInputStream fi = null;
 37   try
 38   {
 39    fi=new FileInputStream(rpath);//读取路径文件
 40    dsConfig=new Vector();
 41    SAXBuilder sb=new SAXBuilder();
 42    Document doc=sb.build(fi);
 43    Element root=doc.getRootElement();
 44    List pools=root.getChildren();
 45    Element pool=null;
 46    Iterator allPool=pools.iterator();
 47    while(allPool.hasNext())
 48    {
 49     pool=(Element)allPool.next();
 50     DSConfigBean dscBean=new DSConfigBean();
 51     dscBean.setType(pool.getChild("type").getText());
 52     dscBean.setName(pool.getChild("name").getText());
 53     System.out.println(dscBean.getName());
 54     dscBean.setDriver(pool.getChild("driver").getText());
 55     dscBean.setUrl(pool.getChild("url").getText());
 56     dscBean.setUsername(pool.getChild("username").getText());
 57     dscBean.setPassword(pool.getChild("password").getText());
 58     dscBean.setMaxconn(Integer.parseInt(pool.getChild("maxconn").getText()));
 59     dsConfig.add(dscBean);
 60    }
 61    
 62   } catch (FileNotFoundException e) {
 63    // TODO Auto-generated catch block
 64    e.printStackTrace();
 65   } catch (JDOMException e) {
 66    // TODO Auto-generated catch block
 67    e.printStackTrace();
 68   } catch (IOException e) {
 69    // TODO Auto-generated catch block
 70    e.printStackTrace();
 71   }
 72   
 73   finally
 74   {
 75    try {
 76     fi.close();
 77    } catch (IOException e) {
 78     // TODO Auto-generated catch block
 79     e.printStackTrace();
 80    }
 81   }
 82   
 83   return dsConfig;
 84  }
 85 /**
 86  *修改配置文件 没时间写 过段时间再贴上去 其实一样的
 87  */
 88  public void modifyConfigInfo(String path,DSConfigBean dsb) throws Exception
 89  {
 90   String rpath=this.getClass().getResource("").getPath().substring(1)+path;
 91   FileInputStream fi=null; //读出
 92   FileOutputStream fo=null; //写入
 93   
 94  }
 95 /**
 96  *增加配置文件
 97  *
 98  */
 99  public void addConfigInfo(String path,DSConfigBean dsb)
100  {
101   String rpath=this.getClass().getResource("").getPath().substring(1)+path;
102   FileInputStream fi=null;
103   FileOutputStream fo=null;
104   try
105   {
106    fi=new FileInputStream(rpath);//读取xml流
107    
108    SAXBuilder sb=new SAXBuilder();
109    
110    Document doc=sb.build(fi); //得到xml
111    Element root=doc.getRootElement();
112    List pools=root.getChildren();//得到xml子树
113    
114    Element newpool=new Element("pool"); //创建新连接池
115    
116    Element pooltype=new Element("type"); //设置连接池类型
117    pooltype.setText(dsb.getType());
118    newpool.addContent(pooltype);
119    
120    Element poolname=new Element("name");//设置连接池名字
121    poolname.setText(dsb.getName());
122    newpool.addContent(poolname);
123    
124    Element pooldriver=new Element("driver"); //设置连接池驱动
125    pooldriver.addContent(dsb.getDriver());
126    newpool.addContent(pooldriver);
127    
128    Element poolurl=new Element("url");//设置连接池url
129    poolurl.setText(dsb.getUrl());
130    newpool.addContent(poolurl);
131    
132    Element poolusername=new Element("username");//设置连接池用户名
133    poolusername.setText(dsb.getUsername());
134    newpool.addContent(poolusername);
135    
136    Element poolpassword=new Element("password");//设置连接池密码
137    poolpassword.setText(dsb.getPassword());
138    newpool.addContent(poolpassword);
139    
140    Element poolmaxconn=new Element("maxconn");//设置连接池最大连接
141    poolmaxconn.setText(String.valueOf(dsb.getMaxconn()));
142    newpool.addContent(poolmaxconn);
143    pools.add(newpool);//将child添加到root
144    Format format = Format.getPrettyFormat();
145       format.setIndent("");
146       format.setEncoding("utf-8");
147       XMLOutputter outp = new XMLOutputter(format);
148       fo = new FileOutputStream(rpath);
149       outp.output(doc, fo);
150   } catch (FileNotFoundException e) {
151    // TODO Auto-generated catch block
152    e.printStackTrace();
153   } catch (JDOMException e) {
154    // TODO Auto-generated catch block
155    e.printStackTrace();
156   } catch (IOException e) {
157    // TODO Auto-generated catch block
158    e.printStackTrace();
159   }
160   finally
161   {
162    
163   }
164  }
165  /**
166   *删除配置文件
167   */
168  public void delConfigInfo(String path,String name)
169  {
170   String rpath=this.getClass().getResource("").getPath().substring(1)+path;
171   FileInputStream fi = null;
172   FileOutputStream fo=null;
173   try
174   {
175    fi=new FileInputStream(rpath);//读取路径文件
176    SAXBuilder sb=new SAXBuilder();
177    Document doc=sb.build(fi);
178    Element root=doc.getRootElement();
179    List pools=root.getChildren();
180    Element pool=null;
181    Iterator allPool=pools.iterator();
182    while(allPool.hasNext())
183    {
184     pool=(Element)allPool.next();
185     if(pool.getChild("name").getText().equals(name))
186     {
187      pools.remove(pool);
188      break;
189     }
190    }
191    Format format = Format.getPrettyFormat();
192       format.setIndent("");
193       format.setEncoding("utf-8");
194       XMLOutputter outp = new XMLOutputter(format);
195       fo = new FileOutputStream(rpath);
196       outp.output(doc, fo);
197    
198   } catch (FileNotFoundException e) {
199    // TODO Auto-generated catch block
200    e.printStackTrace();
201   } catch (JDOMException e) {
202    // TODO Auto-generated catch block
203    e.printStackTrace();
204   } catch (IOException e) {
205    // TODO Auto-generated catch block
206    e.printStackTrace();
207   }
208   
209   finally
210   {
211    try {
212     fi.close();
213    } catch (IOException e) {
214     // TODO Auto-generated catch block
215     e.printStackTrace();
216    }
217   }
218  }
219  /**
220   * @param args
221   * @throws Exception
222   */
223  public static void main(String[] args) throws Exception {
224   // TODO Auto-generated method stub
225   ParseDSConfig pd=new ParseDSConfig();
226   String path="ds.config.xml";
227   pd.readConfigInfo(path);
228   //pd.delConfigInfo(path, "tj012006");
229   DSConfigBean dsb=new DSConfigBean();
230   dsb.setType("oracle");
231   dsb.setName("yyy004");
232   dsb.setDriver("org.oracle.jdbc");
233   dsb.setUrl("jdbc:oracle://localhost");
234   dsb.setUsername("sa");
235   dsb.setPassword("");
236   dsb.setMaxconn(1000);
237   pd.addConfigInfo(path, dsb);
238   pd.delConfigInfo(path, "yyy001");
239  }
240 }

--------------------------------------
ds.config.xml   配置文件
--------------------------------------


<ds-config>
<pool>
<type>mysql</type>
<name>user</name>
<driver>com.mysql.jdbc.driver</driver>
<url>jdbc:mysql://localhost:3306/user</url>
<username>sa</username>
<password>123456</password>
<maxconn>100</maxconn>
</pool>
<pool>
<type>mysql</type>
<name>user2</name>
<driver>com.mysql.jdbc.driver</driver>
<url>jdbc:mysql://localhost:3306/user2</url>
<username>sa</username>
<password>1234</password>
<maxconn>10</maxconn>
</pool>
<pool>
<type>sql2000</type>
<name>books</name>
<driver>com.microsoft.sqlserver.driver</driver>
<url>jdbc:sqlserver://localhost:1433/books:databasename=books</url>
<username>sa</username>
<password></password>
<maxconn>100</maxconn>
</pool>
</ds-config>


3. 连接池的使用
  1。Connection的获得和释放
  DBConnectionManager   connectionMan=DBConnectionManager .getInstance();//得到唯一实例
   //得到连接
   String name="mysql";//从上下文得到你要访问的数据库的名字
   Connection  con=connectionMan.getConnection(name);
  //使用
  。。。。。。。
  // 使用完毕
 connectionMan.freeConnection(name,con);//释放,但并未断开连接
 2。数据库连接的动态增加和连接池的动态增加
      1。调用xml操作增加类

      2。重新实例华连接池管理池类

posted @ 2013-08-22 14:09  幻星宇  阅读(689)  评论(0编辑  收藏  举报