服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

使用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; }}

扫描关注微信公众号