Java数据库连接池

转载过来的,最近以做一个粗网站,准备用这种方法。

 

 

Java
jdbc数据库连接池总结!

  1. 引言

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

  应用程序已由人情的桌面应用转到Web应用。基于B/S(Browser/Server)架构的3层开发模式逐渐代替C/S(Client/Server)架构的开模式,成为开企业级应用和电子商务普遍以的技艺。在Web应用开发之最初,主要采用的艺是CGI﹑ASP﹑PHP顶。之后,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
贪图1 Java数据库访问机制

  JDBC作为一如既往栽数据库访问技术,具有简易容易用的独到之处。但使用这种模式开展Web应用

  程序开发,存在重重问题:首先,每一样次等Web请求都使确立平等不成数据库连接。建立连接是一个讨厌的走,每次都得费0.05s~1s的工夫,而且系统还要分配内存资源。这个时空对同样差还是几乎次数据库操作,或许感到不产生体系有差不多可怜之付出。可是对于本之Web应用,尤其是重型电子商务网站,同时出几百总人口竟然几千人在线是非常正常的事。在这种状态下,频繁之开展数据库连接操作必然占用多的系统资源,网站的响应速度必定下降,严重的还会导致服务器的垮台。不是惊人,这就算是制约某些电子商务网站发展之技巧瓶颈问题。其次,对于各级一样差数据库连接,使用完后且得断开。否则,如果程序出现异常而得不到关闭,将会见招致数据库系统遭到之内存泄漏,最终以只能再次开数据库。还有,这种支付不克说了算为创造的接连对象往往,系统资源会被毫无顾及的分配出去,如连续了多,也恐怕致内存泄漏,服务器崩溃。

 

  数据库连接池(connection pool)的工作规律

  1、基本概念及原理
由于点的解析好视,问题之来源就是在于对数据库连日资源的不算管理。我们知道,

  对于共享资源,有一个老红的设计模式:资源池(Resource
Pool)。该模式正是为缓解资源的多次分配﹑释放所导致的题材。为缓解上述问题,可以运用数据库连接池技术。数据库连接池的主干考虑便是吗数据库连接起一个“缓冲池”。预先在缓冲池中放入一定数额之总是,当用建立数据库连接时,只需要从“缓冲池”中取出一个,使用完毕之后再行放开归。我们可以经过设定连接池最大连接数来防范系统无尽的和数据库连接。更为重要的是咱好由此连接池的管理机制监视数据库的连年的数据﹑使用情况,为系统开发﹑测试和性能调整提供基于。连接池的骨干工作原理见下图2。

图片 2
贪图2 连接池的着力工作原理

  2、服务器自带的连接池

  JDBC的API中无供连接池的法。一些特大型的WEB应用服务器如BEA的WebLogic和IBM的WebSphere等提供了连接池的建制,但是要产生那第三在的专用类措施支持连接池的用法。

  连接池关键问题分析

  1、并发问题

  为了要连接管理服务有最深之通用性,必须考虑多线程环境,即出现问题。这个问题相对比好解决,因为Java言语本身提供了针对出现管理的支持,使用synchronized关键字即可确保线程是手拉手的。使用方式为直接以类似方式前面加上synchronized关键字,如:

public synchronized Connection getConnection()

  2、多数据库服务器和多用户

  对于大型的局级以,常常要而连接不同之数据库(如连续Oracle和Sybase)。如何连接不同的数据库也?我们使用的政策是:设计一个适合单例模式之连接池管理类,在连接池管理类的唯一实例被创造时读取一个资源文件,其中资源文件被存放着多单数据库的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   
        ———————————————————-
      /**
 * 数据库连接池类
 */
package com.chunkyo.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Timer;

/**
 * @author chenyanlin
 *
 */
public class DBConnectionPool implements TimerListener {

 private Connection con=null;
 private int inUsed=0;    //使用的连接数
 private ArrayList freeConnections = new ArrayList();//容器,空闲连接
 private int minConn;     //最小连接数
 private int maxConn;     //最深连接
 private String name;     //连接池名字
 private String password; //密码
 private String url;      //数据库连接地址
 private String driver;   //驱动
 private String user;     //用户名
 public Timer timer;      //定时
 /**
  * 
  */
 public DBConnectionPool() {
  // TODO Auto-generated constructor stub
 }
 /**
  * 创建连接池
  * @param driver
  * @param name
  * @param URL
  * @param user
  * @param password
  * @param maxConn
  */
 public DBConnectionPool(String name, String driver,String URL, String
user, String password, int maxConn)
 {
  this.name=name;
  this.driver=driver;
  this.url=URL;
  this.user=user;
  this.password=password;
  this.maxConn=maxConn;
 }
 /**
  * 用完,释放连接
  * @param con
  */
 public synchronized void freeConnection(Connection con) 
 {
  this.freeConnections.add(con);//添加到空闲连接的最后
  this.inUsed–;
 }
 /**
  * timeout  根据timeout得到连续
  * @param timeout
  * @return
  */
 public synchronized Connection getConnection(long timeout)
 {
  Connection con=null;
  if(this.freeConnections.size()>0)
  {
   con=(Connection)this.freeConnections.get(0);
   if(con==null)con=getConnection(timeout); //继续获得连续
  }
  else
  {
   con=newConnection(); //新建连接
  }
  if(this.maxConn==0||this.maxConn<this.inUsed)
  {
   con=null;//达到最大连接数,暂时未可知获取连续了。
  }
  if(con!=null)
  {
   this.inUsed++;
  }
  return con;
 }
 /**
  * 
  * 从连接池里获取连续
  * @return
  */
 public synchronized Connection getConnection()
 {
  Connection con=null;
  if(this.freeConnections.size()>0)
  {
   con=(Connection)this.freeConnections.get(0);
   this.freeConnections.remove(0);//如果老是分配出去了,就于闲暇连接里去
   if(con==null)con=getConnection(); //继续获得连续
  }
  else
  {
   con=newConnection(); //新建连接
  }
  if(this.maxConn==0||this.maxConn<this.inUsed)
  {
   con=null;//等待 超过最可怜连接时
  }
  if(con!=null)
  {
   this.inUsed++;
   System.out.println(“得到 ”+this.name+” 的连天,现有”+inUsed+”个连于用!”);
  }
  return con;
 }
 /**
  *放出全部总是
  *
  */
 public synchronized void release()
 {
  Iterator allConns=this.freeConnections.iterator();
  while(allConns.hasNext())
  {
   Connection con=(Connection)allConns.next();
   try
   {
    con.close();
   }
   catch(SQLException e)
   {
    e.printStackTrace();
   }
   
  }
  this.freeConnections.clear();
   
 }
 /**
  * 创建新连
  * @return
  */
 private Connection newConnection()
 {
  try {
   Class.forName(driver);
   con=DriverManager.getConnection(url, user, password);
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   System.out.println(“sorry can’t find db driver!”);
  } catch (SQLException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
   System.out.println(“sorry can’t create Connection!”);
  }
  return con;
  
 }
 /**
  * 定时处理函数
  */
 public synchronized void TimerEvent() 
 {
     //暂时还没兑现后会助长的
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

 }
 /**
  * @return the driver
  */
 public String getDriver() {
  return driver;
 }
 /**
  * @param driver the driver to set
  */
 public void setDriver(String driver) {
  this.driver = driver;
 }
 /**
  * @return the maxConn
  */
 public int getMaxConn() {
  return maxConn;
 }
 /**
  * @param maxConn the maxConn to set
  */
 public void setMaxConn(int maxConn) {
  this.maxConn = maxConn;
 }
 /**
  * @return the minConn
  */
 public int getMinConn() {
  return minConn;
 }
 /**
  * @param minConn the minConn to set
  */
 public void setMinConn(int minConn) {
  this.minConn = minConn;
 }
 /**
  * @return the name
  */
 public String getName() {
  return name;
 }
 /**
  * @param name the name to set
  */
 public void setName(String name) {
  this.name = name;
 }
 /**
  * @return the password
  */
 public String getPassword() {
  return password;
 }
 /**
  * @param password the password to set
  */
 public void setPassword(String password) {
  this.password = password;
 }
 /**
  * @return the url
  */
 public String getUrl() {
  return url;
 }
 /**
  * @param url the url to set
  */
 public void setUrl(String url) {
  this.url = url;
 }
 /**
  * @return the user
  */
 public String getUser() {
  return user;
 }
 /**
  * @param user the user to set
  */
 public void setUser(String user) {
  this.user = user;
 }

}


 DBConnectionManager .java

/**
 * 数据库连接池管理类
 */
package com.chunkyo.db;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Properties;
import java.util.Vector;

import com.chunkyo.db.ParseDSConfig;
import com.chunkyo.db.DSConfigBean;
import com.chunkyo.db.DBConnectionPool;

/**
 * @author chenyanlin
 *
 */
public class DBConnectionManager {

 static private DBConnectionManager
instance;//唯一数据库连接池管理实例类
 static private int clients;                 //客户连接数
 private Vector drivers  = new Vector();//驱动信息
 private Hashtable pools=new Hashtable();//连接池
 
 /**
  * 实例化管理类
  */
 public DBConnectionManager() {
  // TODO Auto-generated constructor stub
  this.init();
 }
 /**
  * 得到唯一实例管理类
  * @return
  */
 static synchronized public DBConnectionManager getInstance()
 {
  if(instance==null)
  {
   instance=new DBConnectionManager();
  }
  return instance;
  
 }
 /**
  * 释放连接
  * @param name
  * @param con
  */
 public void freeConnection(String name, Connection con)
 {
  DBConnectionPool
pool=(DBConnectionPool)pools.get(name);//根据重要名字取连接池
  if(pool!=null)
  pool.freeConnection(con);//释放连接 
 }
 /**
  * 得到一个连接根据连接池的名字name
  * @param name
  * @return
  */
 public Connection getConnection(String name)
 {
  DBConnectionPool pool=null;
  Connection con=null;
  pool=(DBConnectionPool)pools.get(name);//从名字中拿走连接池
  con=pool.getConnection();//从选定的总是池中得到连续
  if(con!=null)
  System.out.println(“得到连续。。。”);
  return con;
 }
 /**
  * 得到一个接连,根据连接池的名跟等时
  * @param name
  * @param time
  * @return
  */
 public Connection getConnection(String name, long timeout)
 {
  DBConnectionPool pool=null;
  Connection con=null;
  pool=(DBConnectionPool)pools.get(name);//从名字被得连接池
  con=pool.getConnection(timeout);//从选定的总是池中落连续
  System.out.println(“得到连续。。。”);
  return con;
 }
 /**
  * 释放具有连接
  */
 public synchronized void release()
 {
  Enumeration allpools=pools.elements();
  while(allpools.hasMoreElements())
  {
   DBConnectionPool pool=(DBConnectionPool)allpools.nextElement();
   if(pool!=null)pool.release();
  }
  pools.clear();
 }

 /**
  * 创建连接池
  * @param props
  */
 private void createPools(DSConfigBean dsb)
 {
  DBConnectionPool dbpool=new DBConnectionPool();
  dbpool.setName(dsb.getName());
  dbpool.setDriver(dsb.getDriver());
  dbpool.setUrl(dsb.getUrl());
  dbpool.setUser(dsb.getUsername());
  dbpool.setPassword(dsb.getPassword());
  dbpool.setMaxConn(dsb.getMaxconn());
  System.out.println(“ioio:”+dsb.getMaxconn());
  pools.put(dsb.getName(), dbpool);
 }
 /**
  * 初始化连接池的参数
  */
 private void init()
 {
  //加载驱动程序
  this.loadDrivers();
  //创建连接池
  Iterator alldriver=drivers.iterator();
  while(alldriver.hasNext())
  {
   this.createPools((DSConfigBean)alldriver.next());
   System.out.println(“创建连接池。。。”);
   
  }
  System.out.println(“创建连接池完毕。。。”);
 }

 /**
  * 加载驱动程序
  * @param props
  */
 private void loadDrivers()
 {
  ParseDSConfig pd=new ParseDSConfig();
 //读取数据库配置文件
  drivers=pd.readConfigInfo(“ds.config.xml”);
  System.out.println(“加载驱动程序。。。”);
 }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

 }

}

DSConfigBean.java

/**
 * 配置文件Bean类
 */
package com.chunkyo.db;

/**
 * @author chenyanlin
 *
 */
public class DSConfigBean {

 private String type     =””; //数据库类型
 private String name     =””; //连接池名字
 private String driver   =””; //数据库驱动
 private String url      =””; //数据库url
 private String username =””; //用户名
 private String password =””; //密码
 private int maxconn  =0; //最大连接数
 /**
  * 
  */
 public DSConfigBean() {
  // TODO Auto-generated constructor stub
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

 }

 /**
  * @return the driver
  */
 public String getDriver() {
  return driver;
 }

 /**
  * @param driver the driver to set
  */
 public void setDriver(String driver) {
  this.driver = driver;
 }

 /**
  * @return the maxconn
  */
 public int getMaxconn() {
  return maxconn;
 }

 /**
  * @param maxconn the maxconn to set
  */
 public void setMaxconn(int maxconn) {
  this.maxconn = maxconn;
 }

 /**
  * @return the name
  */
 public String getName() {
  return name;
 }

 /**
  * @param name the name to set
  */
 public void setName(String name) {
  this.name = name;
 }

 /**
  * @return the password
  */
 public String getPassword() {
  return password;
 }

 /**
  * @param password the password to set
  */
 public void setPassword(String password) {
  this.password = password;
 }

 /**
  * @return the type
  */
 public String getType() {
  return type;
 }

 /**
  * @param type the type to set
  */
 public void setType(String type) {
  this.type = type;
 }

 /**
  * @return the url
  */
 public String getUrl() {
  return url;
 }

 /**
  * @param url the url to set
  */
 public void setUrl(String url) {
  this.url = url;
 }

 /**
  * @return the username
  */
 public String getUsername() {
  return username;
 }

 /**
  * @param username the username to set
  */
 public void setUsername(String username) {
  this.username = username;
 }

}

ParseDSConfig.java

/**
 * 操作配置文件类 读  写 修改 删除等操作 
 */
package com.chunkyo.db;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Vector;
import java.util.Iterator;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/**
 * @author chenyanlin
 *
 */
public class ParseDSConfig {

 /**
  * 构造函数
  */
 public ParseDSConfig() {
  // TODO Auto-generated constructor stub
 }
 /**
  * 读取xml配置文件
  * @param path
  * @return
  */
 public Vector readConfigInfo(String path)
 {
  String
rpath=this.getClass().getResource(“”).getPath().substring(1)+path;
  Vector dsConfig=null;
  FileInputStream fi = null;
  try
  {
   fi=new FileInputStream(rpath);//读博路径文件
   dsConfig=new Vector();
   SAXBuilder sb=new SAXBuilder();
   Document doc=sb.build(fi);
   Element root=doc.getRootElement();
   List pools=root.getChildren();
   Element pool=null;
   Iterator allPool=pools.iterator();
   while(allPool.hasNext())
   {
    pool=(Element)allPool.next();
    DSConfigBean dscBean=new DSConfigBean();
    dscBean.setType(pool.getChild(“type”).getText());
    dscBean.setName(pool.getChild(“name”).getText());
    System.out.println(dscBean.getName());
    dscBean.setDriver(pool.getChild(“driver”).getText());
    dscBean.setUrl(pool.getChild(“url”).getText());
    dscBean.setUsername(pool.getChild(“username”).getText());
    dscBean.setPassword(pool.getChild(“password”).getText());
    dscBean.setMaxconn(Integer.parseInt(pool.getChild(“maxconn”).getText()));
    dsConfig.add(dscBean);
   }
   
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (JDOMException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  finally
  {
   try {
    fi.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  
  return dsConfig;
 }

/**
 *改配置文件 没时间写 过段时间再贴上去 其实一样的 
 */
 public void modifyConfigInfo(String path,DSConfigBean dsb) throws
Exception
 {
  String
rpath=this.getClass().getResource(“”).getPath().substring(1)+path;
  FileInputStream fi=null; //读出
  FileOutputStream fo=null; //写入
  
 }
/**
 *增加部署文件
 *
 */
 public void addConfigInfo(String path,DSConfigBean dsb) 
 {
  String
rpath=this.getClass().getResource(“”).getPath().substring(1)+path;
  FileInputStream fi=null;
  FileOutputStream fo=null;
  try
  {
   fi=new FileInputStream(rpath);//读取xml流
   
   SAXBuilder sb=new SAXBuilder();
   
   Document doc=sb.build(fi); //得到xml
   Element root=doc.getRootElement();
   List pools=root.getChildren();//得到xml子树
   
   Element newpool=new Element(“pool”); //创建新连接池
   
   Element pooltype=new Element(“type”); //设置连接池类型
   pooltype.setText(dsb.getType());
   newpool.addContent(pooltype);
   
   Element poolname=new Element(“name”);//设置连接池名字
   poolname.setText(dsb.getName());
   newpool.addContent(poolname);
   
   Element pooldriver=new Element(“driver”); //设置连接池驱动
   pooldriver.addContent(dsb.getDriver());
   newpool.addContent(pooldriver);
   
   Element poolurl=new Element(“url”);//设置连接池url
   poolurl.setText(dsb.getUrl());
   newpool.addContent(poolurl);
   
   Element poolusername=new Element(“username”);//设置连接池用户称
   poolusername.setText(dsb.getUsername());
   newpool.addContent(poolusername);
   
   Element poolpassword=new Element(“password”);//设置连接池密码
   poolpassword.setText(dsb.getPassword());
   newpool.addContent(poolpassword);
   
   Element poolmaxconn=new Element(“maxconn”);//设置连接池最特别连接
   poolmaxconn.setText(String.valueOf(dsb.getMaxconn()));
   newpool.addContent(poolmaxconn);
   pools.add(newpool);//将child添加到root
   Format format = Format.getPrettyFormat();
      format.setIndent(“”);
      format.setEncoding(“utf-8”);
      XMLOutputter outp = new XMLOutputter(format);
      fo = new FileOutputStream(rpath);
      outp.output(doc, fo);
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (JDOMException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  finally
  {
   
  }
 }
 /**
  *剔除配置文件
  */
 public void delConfigInfo(String path,String name)
 {
  String
rpath=this.getClass().getResource(“”).getPath().substring(1)+path;
  FileInputStream fi = null;
  FileOutputStream fo=null;
  try
  {
   fi=new FileInputStream(rpath);//读博路径文件
   SAXBuilder sb=new SAXBuilder();
   Document doc=sb.build(fi);
   Element root=doc.getRootElement();
   List pools=root.getChildren();
   Element pool=null;
   Iterator allPool=pools.iterator();
   while(allPool.hasNext())
   {
    pool=(Element)allPool.next();
    if(pool.getChild(“name”).getText().equals(name))
    {
     pools.remove(pool);
     break;
    }
   }
   Format format = Format.getPrettyFormat();
      format.setIndent(“”);
      format.setEncoding(“utf-8”);
      XMLOutputter outp = new XMLOutputter(format);
      fo = new FileOutputStream(rpath);
      outp.output(doc, fo);

   
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (JDOMException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  finally
  {
   try {
    fi.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 /**
  * @param args
  * @throws Exception 
  */
 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub

  ParseDSConfig pd=new ParseDSConfig();
  String path=”ds.config.xml”;
  pd.readConfigInfo(path);
  //pd.delConfigInfo(path, “tj012006”);
  DSConfigBean dsb=new DSConfigBean();
  dsb.setType(“oracle”);
  dsb.setName(“yyy004”);
  dsb.setDriver(“org.oracle.jdbc”);
  dsb.setUrl(“jdbc:oracle://localhost”);
  dsb.setUsername(“sa”);
  dsb.setPassword(“”);
  dsb.setMaxconn(1000);
  pd.addConfigInfo(path, dsb);
  pd.delConfigInfo(path, “yyy001”);
 }

}


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>

  1. 连接池的动
      1。Connection的落同刑释解教
      DBConnectionManager  
    connectionMan=DBConnectionManager .getInstance();//得到唯一实例
       //得到连续
       String name=”mysql”;//从上下文得到你只要拜访的数据库的名
       Connection  con=connectionMan.getConnection(name);
      //使用
      。。。。。。。
      // 使用完
     connectionMan.freeConnection(name,con);//释放,但尚未断开连接
     2。数据库连接的动态增加和连接池的动态增加
          1。调用xml操作多类

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

 

原文地址:http://www.blogjava.net/chunkyo/archive/2007/01/16/94266.html

相关文章