1.数据库链接的接口类:DatabaseConnection package net.pingsoft.kelefa.pool; 
import java.sql.*;
import javax.sql.*;
import com.wish.JDBC.WConnection;
import org.apache.commons.pool.*;
import org.apache.commons.pool.impl.*;
/**
 * 数据库链接的接口类.直接调用静态方法getDBConnection()取得Connection对象.
 * 相关的参数由PoolConfigServlet类根据web.xml设置,所以web.xml需要注册PoolConfigServlet
 *
 * Copyright: Copyright (c) 2004
 * @author kelefa yang
 * @version 1.0
 * @see PoolConfigServlet
 */
public class DatabaseConnection
{
  /** 数据库的用户名 */
  public static String USER = "sa";
  /** 数据库的用密码 */
  public static String PASS = "yf1";
  /** 数据库的启动程序类名 */
  public static String DBDRIVER =
      "com.microsoft.jdbc.sqlserver.SQLServerDriver";
  /** 数据库的链接地址 */
  public static String DBURL =
   "jdbc:microsoft:sqlserver://192.9.200.23:1433;DatabaseName=FC";
  /** 是否使用jndi */
  public static boolean useJNDI = false;
  /** jndi的名字,useJNDI==false时无效 */
  public static String JNDI = "wishJndi";
  /**
   * 是否对数据库链接进行编码转换
   * @deprecated 没有进行测试,应该直接设置数据库或在链接url加上编码参数
   */
  public static boolean convertConnetion = false;
  /** 是否缓冲链接 */
  public static boolean POOL_CONNECTION = false;
  /**
   * 没有必要生成实例
   */ 
  private DatabaseConnection()
  {} 
  /**
   * 根据相应参数取回实际的数据库链接.
   * 如果useJNDI为真,根据JNDI名字从数据源取链接;否则直接从jdbc取链接.
   * 如果convertConnetion为真,对链接再封装,实现编码的转换.
   * @throws Exception 当useJNDI==false,并且USER,PASS,DBDRIVER,DBURL其中一个为空时
   * 抛出"DatabaseConnection didn't init!!"异常
   * @return Connection 数据库链接,取不到时返回null
   */
  static Connection getConnection() throws Exception
  {
    Connection conn = null;
    if( !useJNDI )
    {
      if( ( USER == null ) || ( PASS == null ) || ( DBDRIVER == null ) ||
          ( DBURL == null ) )
        throw new Exception( "DatabaseConnection didn't init!!" );
      Class.forName( DBDRIVER );
      conn = DriverManager.getConnection( DBURL, USER, PASS );
    }
    else
    {
      DataSource ds = ServiceLocator.getInstance().getDataSource( JNDI );
      conn = ds.getConnection();
    }
    if( convertConnetion && conn != null )
      return new WConnection( conn );
    else
      return conn;
  } 
  /** 链接池工厂 */
  private static GenericObjectPoolFactory poolFactory =
      new GenericObjectPoolFactory( new ConnectionFactory() );
  /** 数据库链接池 */
  private static ObjectPool pool = poolFactory.createPool(); 
   /**
   * if POOL_CONNECTION is true, return the pooled connetion.
   * POOL_CONNECTION will be set in Class PoolConfigServlet when webapp start,
   * you can change the value in web.xml.
   *    * <init-param>
   *    <param-name>poolConnection</param-name>
   *    <param-value>true</param-value>
   * </init-param>
   *  
   * @throws Exception
   * @return Connection
   */
  public static Connection getDBConnection() throws Exception
  {
    if( POOL_CONNECTION )
    {
      Object obj = pool.borrowObject();
      if( null == obj )
        return null;
      PoolableConnection conn = ( PoolableConnection )obj;
      conn.setPool( pool );
      return conn;
    }
    else
      return getConnection();
  }
}
 2. 数据库链接工厂类ConnectionFactory  package net.pingsoft.kelefa.pool; 
import org.apache.commons.pool.*;
import java.sql.Connection; 
/**
 * 数据库链接对象工厂,负责创建数据库链接对象,并把它封装成可缓冲的对象以及关闭数据库链接。
 * 这个工厂实例作为org.apache.commons.pool.impl.GenericObjectPoolFactory的构造函数的
 * 参数。
 *
 * Copyright: Copyright (c) 2004
 * @author kelefa yang
 * @version 1.0
 * @see org.apache.commons.pool.impl.GenericObjectPoolFactory
 */
public class ConnectionFactory extends BasePoolableObjectFactory
{
  public ConnectionFactory()
  {
  } 
  /**
   * Creates a Connection instance that can be returned by the pool.
   *
   * @return an instance that can be returned by the pool.
   * @throws Exception
   * @todo Implement this org.apache.commons.pool.PoolableObjectFactory method
   */
  public Object makeObject() throws Exception
  {
    Connection conn = DatabaseConnection.getConnection();
    if (conn==null)
      return null;
    return new PoolableConnection(conn);
  } 
  /**
   * close a Connection instance no longer needed by the pool.
   *
   * @param obj the instance to be destroyed
   * @throws Exception
   * @todo Implement this org.apache.commons.pool.PoolableObjectFactory method
   */
  public void destroyObject( Object obj ) throws Exception
  {
    PoolableConnection conn = (PoolableConnection)obj;
    conn.setPool( null );
    conn.close();
  }
} 
 3. 重载Connection.close()方法,使得可以返回数据库链接池 package net.pingsoft.kelefa.pool; 
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.pool.*; 
 
  /**
 * 重载Connection.close()方法,使得可以返回数据库链接池.
 *
 * Copyright: Copyright (c) 2004
 * @author kelefa yang
 * @version 1.0
 */
public class PoolableConnection extends ConnectionWrap
{
  /** 数据库链接池 */
  private  ObjectPool pool;
  public PoolableConnection(Connection conn)
  {
    super(conn);
  }
  /**
   * 如果数据库链接池存在,则将这个链接返回数据库链接池;否则关闭这个数据库链接
   * @throws SQLException
   */
  public void close() throws SQLException
  {
      try
      {
        if (pool != null)
          pool.returnObject( this );
        else
          super.close();
      }
      catch( Exception ex )
      {
      }
  }
  /**
   * 设置这个链接所在的链接池.
   * 如果pool等于null,链接用完直接关闭,否则用完后返回链接池中.
   * @param pool 数据库链接池
   */
  public void setPool(ObjectPool pool)
  {
    this.pool = pool;
  }
}
  
 
  |