使用Commons-Pool写的数据库连接池

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; } }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值