posts - 32,  comments - 149,  trackbacks - 0
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  
        ----------------------------------------------------------
      /**
 * 数据库连接池类
 */
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;
/**
 * @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>


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

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




posted on 2007-01-16 17:54 chunkyo 阅读(97507) 评论(113)  编辑  收藏 所属分类: Java技术
评论共2页: 1 2 下一页 

FeedBack:
# re: Java jdbc数据库连接池总结![未登录]
2007-06-22 14:48 | liu
老大给我传份完整版的吧谢谢了!!!!
liuyingxiao@sohu.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2007-08-14 15:26 | Jarod Cai
大牛:
麻烦把这个文档呵程序包发给我一份。小弟最近正在学做一个小网站,被数据库整得头都大了。幸好搜到了您的这篇文档。十分感激。
caigzh04@gmail.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2007-08-31 16:39 | 杨开杰
你好~看了你的总结
有些地方不完整看不大明白~
我也希望能得到你完整的数据库连接池的Java代码~
小弟多谢了~
邮箱:yangkj2006@gmail.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2007-09-11 16:39 | zyw
谢谢,给份完整的代码!
zyw8136@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2007-10-02 08:28 | dicke
请也给我一份完整的代码,谢谢!
fenggui.gu@126.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2007-10-16 19:04 | yuqian
不错兄弟,能发一份完成的代码吗?万分感谢!!
zhang_0308@sina.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2007-11-23 11:07 | liu
兄弟,能给我发一份完整的代码吗?谢谢!!
aimdlau@sina.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2007-11-29 13:51 | Snow
谢谢chunkyo,只是有些地方看得不懂,比如说那个TimerListner接口是自己写的还是哪个第三方提供的类等,所以希望能得到完整的代码!
hsbljyy@yahoo.com.cn
  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2007-12-31 00:58 | tiger
测试了几次都没通过,能否发个完整版的给我?
beijihu3@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-01-15 10:46 | ge
我也是调了好长时间也没调通,能否发个完整的给我
qsge2005@126.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2008-01-17 10:44 | king
TimerListener没理解,能发给我个完整的么,谢谢!
lidongge123@163.com
QQ:635390790 加qq时请注明理由,谢谢  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-01-22 11:05 | abcd
能不能给我一个完整版的阿,谢谢
maming134@sohu.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-02-14 11:36 | 小小陈
也发一份给我吧,先谢过了...
acon_cl@126.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-03-09 17:51 | hsiholi
liguiquan8@yahoo.com.cn  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-03-09 17:52 | hsiholi
也给我一份学习了 谢谢 liguiquan8@yahoo.com.cn  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-03-15 10:19 | hxs
谢谢楼上分享, 但调了很长时间没有调通,恳请搂主发一份完整代码,谢谢!
email:hxiaosu@126.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-04-01 11:11 | 小呆
感觉不错,需要一份源码 谢谢
aty03@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-04-02 17:53 | 杨帆
能否发份源码给我。谢谢。  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-04-02 17:54 | 杨帆
能否发份源码给我。谢谢。

xa_yangfan@yahoo.com.cn  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-04-07 13:30 | 悠然
感觉不错,需要一份源码 谢谢
youranxj@126.com   回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-04-15 13:18 | 东林遥竹
我正在学习连接池的东西,请问能也给我发一份完整代码吗
谢谢了! carlchou825@yahoo.com.cn  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-06-04 19:35 | yezi
也给我发一份好么?谢谢~~~~~~~~~
xyzhang0010@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-06-19 20:04 | gaofeirong
现在才看到,源码还有么!
发我一份
gaofeirong@gmail.com
非常感谢  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-07-20 12:18 | chlee
感觉很好,能否给一份完整的源码,非常感谢!!
redh@163.com   回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-07-31 15:36 | wish520
感觉很好,能否给一份完整的源码,非常感谢!! qianjiang520@126.com
  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-08-15 21:31 | 唐唐
写的太好了,正需要,麻烦给发一份完整的源码,多谢多谢!
邮箱:datang_flying@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-10-14 10:45 | zhangxinwei
兄台写得太棒了 !可否给小弟学习学习
zhangxinwe999@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2008-10-21 14:45 | james
写的真好,受教了,不过确实不太完整,能否转送一份源码,小弟不胜感谢!
james4837@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-10-27 16:54 | qooler
阿道夫  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-10-27 16:56 | 树林
看的不是很懂,希望大哥能给我一份完整版的,让我好好研究一下。

xue_qiwei@yahoo.com.cn

非常崇拜!  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2008-11-12 20:44 | edaoman
good~~~  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2009-02-20 10:01 | 老土新地
TimerListener没理解,能发给我个完整的么,谢谢!
luo_qing@sogou.com
QQ:303353513 加qq时请注明理由,谢谢   回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2009-02-25 17:03 | janlkan
TimerListener是不是第三方包,能否转送一份源码,不胜感谢!

janklan@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2009-03-31 23:01 | 油炸大龙虾
建议:楼猪的思路是面向过程的。建议去研究AOP,好好看一下JDK的java.lang.reflect.InvocationHandler和Proxy

良好的用户体验是这样的:
Connection conn = Pool.getConn();
// doSomething
conn.close(); // 不改变用户习惯,用户close也行放回空闲池

如何实现?很简单:
public Object invoke(...) {
if (!method.getName().equals("close")) return method.invoke(...);
// push back
return null;
}

强烈建议楼猪好好学习设计模式,否则会阻碍你发展的。  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2009-04-21 11:34 | every
能否也给我一份儿
mwgjkf@139.com
谢谢  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2009-04-26 12:24 | 高山
能给我一份吗,
yachaofeng@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2009-04-28 13:46 | 孙修鹏
能否也给我一份儿
sxpujs@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2009-07-09 14:58 | 张向阳
谢谢您的分享,非常实用,也是我非常需要的现在,传给我一份吧。3Q!

Email: zhangxiangyang.bupt@gmail.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2009-07-28 10:11 | ThankYou
第二次在笔试时碰到这问题。
给我也发一份我好好研究研究。
bing.huang8419@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2009-08-06 19:42 | Fly533
写得很不错!!,可惜我调不出来,能发份完整的代码不?谢谢了
fly533@126.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2009-10-07 06:08 | JavaMan
非常好,很实用,测试一下没有通过,能否传给我一份!
chinaxwn@hotmail.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2009-12-02 14:57 | 赵薇薇
我自己写的那个没有分的这么细的,只是从dataSource中取得一个只读连接和写连接的。能否传我一份的!
zhaoweiwei-2006@sohu.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2009-12-10 09:17 | JavaBoy
正在学习,希望传份详细的
谢谢了!
artwhy@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2009-12-10 11:34 | Sam
我也刚开始学习连接池
希望传我一份谢谢先!
fl49809045@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2010-01-13 20:17 | magicmo
能否发我一份!
bluesky.mo@foxmail.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2010-04-14 10:43 | boy
给一份完整的谢谢楼主 happy_javaboy@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2010-05-18 12:52 | 哈合
能否发我一份!
sjxlsn@163.com 谢谢了  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2010-08-06 19:03 | admin
TimerListener 这是做什么用的,我看到很多人都在问。

楼主你好, 我现在也在找连接池,麻烦你发一份给我,不胜感激。
bisubisu@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2010-08-09 07:17 | darren
能否传我一份啊,ddf168913@163.com,谢谢  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2010-10-22 21:21 | crazyant
非常棒的资料,虽然内容不是很完全,不过完全实现了数据库连接池的核心,仔细理解以后,我抽取出了自己想要的代码,可以使用,十分感谢  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2010-11-27 21:37 | wanhition@163.com
TimerListener 这是做什么用的,我看到很多人都在问。

楼主你好, 我现在也在找连接池,麻烦你发一份给我,不胜感激。
wanhition@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2011-03-27 21:25 | xixi
我想了解一下,可以用 WORD 文档 发一下这些代码给我吗?jiajia10161@163.com 唔该  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2011-10-17 11:05 | 许宇宝
希望楼主也给我发一份完整的:包括源码和JAR包!谢谢
xu.yubao@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2012-05-17 22:44 | liuliu
麻烦发一份到我邮箱 572079078@qq.com 最好带上测试代码  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2012-05-18 15:01 | ***
给我也发一份完整的吧 TimerListener不太明白是怎么回事
21269125@qq.com给我发一份完整的代码 谢谢  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2012-05-31 14:36 |
@Li
是啊,我也找不到这个接口  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2012-05-31 14:38 |
@油炸大龙虾
高手就是高手,向你学习  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2012-06-29 16:16 | bobby
在程序中你后面留着的几个问题,有没有完整版本?有的话,麻烦给我一份。谢谢  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2012-10-22 00:46 | 小杰
谢谢你也给我一份完整的代码 急需!!
849066286@qq.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2012-11-03 08:05 | java
自己动手 成为 风衣祖师~!  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-01-08 10:11 | 李沙沙
大哥,有没有完整的代码,给一份,谢谢,QQ:513084206  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-02-24 17:06 | dahuzij
正在学习,能不能也发份完整代码给我,谢谢,dahuzij@sina.cn   回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-03-27 16:14 | liuvlun
jdbc 连接池能给我份完整的源码吗,现在着急使用,谢谢,liuqinglong88@126.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-04-10 10:33 | dahai
jdbc 连接池能给我份完整的源码吗,现在着急使用,谢谢,servcelayer163@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-04-15 09:57 | 颂山
你好!能不能麻烦发份完整版源码,急用下,谢谢 215038085@qq.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-04-15 15:50 | piao2072
遇到第一个问题就是TimerListener,我本地建立的新类继承不了timerlistener,import java.util.Timer;我也引入了  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-04-15 16:26 | piao2072
我是发现了timer 是打酱油的啊???  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-06-04 11:20 | liaoshiyong
麻烦也给我一份吧,邮箱:649241354@qq.com,先感谢楼主!  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-06-05 15:26 | king_soku
麻烦也给我一份吧,邮箱:563794876@qq.com,先感谢楼主!  回复  更多评论
  
# 感谢楼主,鄙视要源码的
2013-07-22 09:07 | 感谢楼主
首先感谢楼主的精心整理,虽然是07年的,但对我帮助很大,同时也说一下要源码的,别人整理出来就不容易,如果几百个都去要人家还做事吗,自己多去调试整理  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2013-08-01 16:56 | steven
感谢楼主,虽然是07年的,不过正好新项目要用到连接池。不知能否发一份源码给我? 邮箱:635326524@qq.com 万分感谢  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-08-20 09:16 | 求源码
求一份源码,谢谢、邮箱 963620703@qq.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-10-17 10:26 | 源码
感谢楼主分享,希望能给一份源码,邮箱644143964@qq.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-11-04 08:59 | 德国战车
看了你的博客,希望得到一份源码!谢谢了,邮箱317224116@qq.com
  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-11-11 20:37 | 静JING
看了你的博客,让我了解了更多,最近我正在学习连接池,能不能得到你的一份源代码呀……非常感谢……邮箱:ljj_0729@126.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-11-11 21:06 | 1111
那个所谓单列写的有问题。  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-12-04 14:51 | @jcy
@静JING
你要到源码了吗?给发一份呗!!!
还有这个数据库连接池是在哪里实现创建多个连接的?  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2013-12-04 14:52 | @jcy
@感谢楼主
你好 我想要问一下这个数据库连接池是在哪里实现创建多个连接的?这个你知道是怎么实现的吗?  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2013-12-11 20:22 | h
感觉楼主的单例模式 好像是错的  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2014-03-28 16:31 | z
哪有这样实现单例类的?  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2014-04-19 16:39 | 小王
楼主,给我也发一份吧,正在学习中,突然发现自己的项目中急需数据库连接池,写的有点多,发一份完整的代码吧,不胜感激
邮箱:841894885@qq.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2014-05-12 14:46 | terminator
正在研究数据库连接池,楼主好人一生平安,只求一份源码,1044018467@qq.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2014-05-15 10:17 | 了1
楼主能发份给我吗?谢谢1489248672@qq.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2014-05-23 16:19 | codehunt
测试成功  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2014-07-30 16:07 | 爬代码的
信不信多线程并发情况下,会出现连接无法归还?取连接和还连接的同步不合理。  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2014-08-08 11:39 | gtt
楼主发份原码,谢谢
gtt509109@163.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2014-08-11 15:30 |
能不能发份完整的资料到我邮箱,感激不尽
517571628@qq.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2014-10-08 09:56 | kevin
能不能也发一份完整的代码给我,多谢楼主
2518487357@qq.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2014-10-14 10:35 | zhen
能发我一份完整的代码给我啊,感谢楼主  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2014-10-27 14:17 | 爱喝开水的鱼
我按照你的方法进行配置,但是最后一打开数据连接就自动关闭,这是什么原因啊!  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2014-11-05 14:44 | leov1
真心不错,现在正在做服务器这块,数据库连接池 问题 ,无从下手,现在 了解很多,谢谢了。  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2014-12-05 10:57 | 晨曦
刚好需要封装一个数据库连接池,楼主大哥给我发一份完整的,多谢
hhm.617@126.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2015-03-27 09:23 | cdxx
内容很详细,谢谢!!  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2015-04-14 09:02 | Mrs ZHANG
@codehunt
层主,测通了??求一份完整的源码,急用啊,不胜感激啊~~~  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2015-04-14 12:45 | D骷髅殇
楼主,小弟学习中。。。求一份源码研究T.T 不胜感激  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2015-04-14 12:47 | D骷髅殇
我的邮箱是973631606@qq.com 谢谢楼主  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2015-04-15 09:04 | fsn
楼主,我的邮箱是sn93@qq.com,求一份源码学习,谢谢  回复  更多评论
  
# re: Java jdbc数据库连接池总结![未登录]
2015-04-24 12:26 | fanfan
好人一生平安,求一份源码学习。
我的邮箱是66761960@qq.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2015-08-18 15:56 | 蜂蜜
求代码!!!
928012536@qq.com  回复  更多评论
  
# re: Java jdbc数据库连接池总结!
2016-06-19 20:49 | 邱明发
刚把源码放在eclipse中,先顶一个  回复  更多评论
  
评论共2页: 1 2 下一页 

只有注册用户登录后才能发表评论。


网站导航:
 
<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

这个博客主要是关于java技术和开源技术,大家一起来进步了!

常用链接

留言簿(12)

随笔分类

随笔档案

文章分类

收藏夹

DotNet

Java技术网站

Linux VS Unix

其他常去网站

常光顾的BLOG

文学类网站

游戏类网站

最新随笔

搜索

  •  

积分与排名

  • 积分 - 196219
  • 排名 - 294

最新评论

阅读排行榜

评论排行榜