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 Java数据库访问机制
1、基本概念及原理
由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理。我们知道,
图2 连接池的基本工作原理
我们知道,事务具有原子性,此时要求对数据库的操作符合“ALL-ALL-NOTHING”原则,即对于一组SQL语句要么全做,要么全不做。
在Java语
言中,Connection类本身提供了对事务的支持,可以通过设置Connection的AutoCommit属性为false,然后显式的调用
commit或rollback方法来实现。但要高效的进行Connection复用,就必须提供相应的事务支持机制。可采用每一个事务独占一个连接来实
现,这种方法可以大大降低事务管理的复杂性。
如何确保连接池中的最小连接数呢?有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。
连接池的实现
连接池管
理类是连接池类的外覆类(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。重新实例华连接池管理池类