数据库连接池的原理

来源:互联网 发布:python list clear 编辑:程序博客网 时间:2024/04/29 15:35

1.数据库连接池的基本思想就是

  为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量,使用情况,为系统开发,测试及性能调整提供依据。


2.连接池的模型

   连接池包括一个连接池类(DBConnectionPool)和一个连接池管理类(DBConnetionPoolManager)。连接池类是对某一数据库所有连接的“缓冲池”。主要实现以下功能:①从连接池获取或创建可用连接;②使用完毕之后,把连接返还给连接池;③在系统关闭前,断开所有连接并释放连接占用的系统资源;④还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时,通讯问题),并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值。 
  连接池管理类是连接池类的外覆类(wrapper),符合单例模式,即系统中只能有一个连接池管理类的实例。其主要用于对多个连接池对象的管理,具有以下功能:①装载并注册特定数据库的JDBC驱动程序;②根据属性文件给定的信息,创建连接池对象;③为方便管理多个连接池对象,为每一个连接池对象取一个名字,实现连接池名字与其实例之间的映射;④跟踪客户使用连接情况,以便需要是关闭连接释放资源。连接池管理类的引入主要是为了方便对多个连接池的使用和管理,如系统需要连接不同的数据库,或连接相同的数据库但由于安全性问题,需要不同的用户使用不同的名称和密码。


3.连接池实现

下面给出连接池类和连接池管理类的主要属性及所要实现的基本接口: 
public  class  DBConnectionPool  implements  TimerListener{ 
private  int  checkedOut;//已被分配出去的连接数 
private  ArrayList  freeConnections  =  new  ArrayList();//容器,空闲池,根据//创建时间顺序存放已创建但尚未分配出去的连接 
private  int  minConn;//连接池里连接的最小数量 
private  int  maxConn;//连接池里允许存在的最大连接数 
private  String  name;//为这个连接池取个名字,方便管理 
private  String  password;//连接数据库时需要的密码 
private  String  url;//所要创建连接的数据库的地址 
private  String  user;//连接数据库时需要的用户名 
public  Timer  timer;//定时器 
public  DBConnectionPool(String  name,  String  URL,  String  user,  String   
password,  int  maxConn)//公开的构造函数 
public  synchronized  void  freeConnection(Connection  con)  //使用完毕之后,//把连接返还给空闲池 
public  synchronized  Connection  getConnection(long  timeout)//得到一个连接,//timeout是等待时间 
public  synchronized  void  release()//断开所有连接,释放占用的系统资源 
private  Connection  newConnection()//新建一个数据库连接 
public  synchronized  void  TimerEvent()  //定时器事件处理函数 

public  class  DBConnectionManager  { 
static  private  DBConnectionManager  instance;//连接池管理类的唯一实例 
static  private  int  clients;//客户数量 
private  ArrayList  drivers  =  new  ArrayList();//容器,存放数据库驱动程序 
private  HashMap  pools  =  new  HashMap  ();//以name/value的形式存取连接池//对象的名字及连接池对象 
static  synchronized  public  DBConnectionManager  getInstance()//如果唯一的//实例instance已经创建,直接返回这个实例;否则,调用私有构造函数,创//建连接池管理类的唯一实例   
private  DBConnectionManager()//私有构造函数,在其中调用初始化函数init() 
public  void  freeConnection(String  name,  Connection  con)//  释放一个连接,//name是一个连接池对象的名字 
public  Connection  getConnection(String  name)//从名字为name的连接池对象//中得到一个连接 
public  Connection  getConnection(String  name,  long  time)//从名字为name 
//的连接池对象中取得一个连接,time是等待时间 
public  synchronized  void  release()//释放所有资源 
private  void  createPools(Properties  props)//根据属性文件提供的信息,创建//一个或多个连接池 
private  void  init()//初始化连接池管理类的唯一实例,由私有构造函数调用 
private  void  loadDrivers(Properties  props)//装载数据库驱动程序 
}

原创粉丝点击