数据库连接池

数据库连接池

简介


连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用。当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接。当这个连接使用完毕后,将返回到连接池中,等待为其他的线程服务。

       连接池的主要优点有以下三个方面。

       第一、减少连接创建时间。连接池中的连接是已准备好的、可重复使用的,获取后可以直接访问数据库,因此减少了连接创建的次数和时间。

       第二、简化的编程模式。当使用连接池时,每一个单独的线程能够像创建一个自己的JDBC连接一样操作,允许用户直接使用JDBC编程技术。

       第三、控制资源的使用。如果不使用连接池,每次访问数据库都需要创建一个连接,这样系统的稳定性受系统连接需求影响很大,很容易产生资源浪费和高负载异常。连接池能够使性能最大化,将资源利用控制在一定的水平之下。连接池能控制池中的连接数量,增强了系统在大量用户应用时的稳定性。

       下面,简单的阐述下连接池的工作原理。

       连接池技术的核心思想是连接复用,通过建立一个数据库连接池以及一套连接使用、分配和管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。

       连接池的工作原理主要由三部分组成,分别为连接池的建立、连接池中连接的使用管理、连接池的关闭。

       第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java中提供了很多容器类可以方便的构建连接池,例如VectorStack等。

       第二、连接池的管理。连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:

       当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。

       当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。

       该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。

       第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。

连接池应用的实现

一个完整的连接池应用包括三个部分:DBConnectionPool类,负责从连接池获取(或创建)连接、将连接返回给连接池、系统关闭时关闭所有连 接释放所有资源;DBConnectionManager类,负责装载和注册JDBC驱动、根据属性文件中定义的属性创建 DBConnectionPool、跟踪应用程序对连接池的引用等;应用程序对连接池的使用。

本文实现的数据库连接池包括一个管理类 DBConnectionManager,负责提供与多个连接池对象(DBConnectionPool类)之间的接口。每一个连接池对象管理一组封装过 的JDBC连接对象Conn,封装过的JDBC连接对象Conn可以被任意数量的Model层的组件共享。

类Conn 的设计很简单,如下所示:

Class Conn {

Private java. sgl .Connection con; //数据库连接对象

Public Boolean inUse ; //是否被使用

Public long lastAccess; //最近一次释放该连接的时间

Public int useCount; // 被使用次数

}

下面是实现连接池的主要代码:

// 初始化数据库连接池

public static synchronized void FastInitPool()

throws Exception {

try { Class.forName(driver); 

for (int i=0; i<size; i++) {

Connection con = createConnection(); 

if (con!=null) addConnection(con); 

} } }

// 向连接池对象中添加数据库连接

private static void addConnection(Connection con) {

if (pool=null||pool1=null) {

pool=new Vector(size); 

pool1=new Vector(size); }

pool.addElement(con); 

pool1.addElement("false"); }

// 获取数据库连接

public static synchronized Connection getConn() 

throws Exception {

Connection conn = null; 

try { if (driver = null)

FastInitPool(); 

// 获得一个可用的(空闲的)连接

.for (int i = 0; i < pool.size(); i++) {

conn = (Connection)pool.elementAt(i); 

if (pool1.elementAt(i)=="false") {

pool1.set(i,"true"); 

//System.out.println("从连接池中获取第"+(i+1)+"个空闲连接"); 

return conn; 

}

}

//如果没有可用连接,且已有连接数小于最大连接数限制,则创建并增加一个新连接到连接池

conn = createConnection(); 

pool.addElement(conn); 

pool1.addElement("true"); 

// System.out.println(" 所有连接都在使用,在连接池中再创建一个新连接"); 

}

catch (Exception e) {

System.err.println(e.getMessage()); 

throw new Exception(e.getMessage()); 

}

return conn; //返回一个有效的新连接

}

public Connection getConnection(String strDriver, String strUrl, String strUserName, String

strPassWord) 

throws SQLException{

try{ Class.forName(strDriver); 

conn = DriverManager.getConnection(strUrl, strUserName, strPassWord); }

return conn; }



转:http://mawushou.blog.51cto.com/4620438/1250450

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值