Java数据库连接池

转发过来的,近年来在做一个小网站,准备利用这种方法。

 

 

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
图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、多数据库服务器和多用户

  对于大型的商家级应用,日常必要同时连接不一致的数据库(如三番五次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   
        ———————————————————-
      /**
 * 数据库连接池类
 */
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

相关文章