javasqlserver连接池_Javajdbc数据库连接池总结
如何确保连接池中的最⼩连接数呢?有动态和静态两种策略。动态即每隔⼀定时间就对连接池进⾏检测,如果发现连接数量⼩于最⼩连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。
连接池的实现
1、连接池模型
本⽂讨论的连接池包括⼀个连接池类(DBConnectionPool)和⼀个连接池管理类(DBConnetionPoolManager)和⼀个配置⽂件操作类(ParseDSConfig)。连接池类是对某⼀数据库所有连接的“缓冲池”,主要实现以下功能:①从连接池获取或创建可⽤连接;②使⽤完毕之后,把连接返还给连接池;③在系统关闭前,断开所有连接并释放连接占⽤的系统资源;④还能够处理⽆效连接(原来登记为可⽤的连接,由于某种原因不再可⽤,如超时,通讯问题),并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值。(5)当多数据库时,且数据库是动态增加的话,将会加到配置⽂件中。
连接池管理类是连接池类的外覆类(wrapper),符合单例模式,即系统中只能有⼀个连接池管理类的实例。其主要⽤于对多个连接池对象的管理,具有以下功能:①装载并注册特定数据库的JDBC驱动程序;②根
据属性⽂件给定的信息,创建连接池对象;③为⽅便管理多个连接池对象,为每⼀个连接池对象取⼀个名字,实现连接池名字与其实例之间的映射;④跟踪客户使⽤连接情况,以便需要是关闭连接释放资源。连接池管理类的引⼊主要是为了⽅便对多个连接池的使⽤和管理,如系统需要连接不同的数据库,或连接相同的数据库但由于安全性问题,需要不同的⽤户使⽤不同的名称和密码。
2、连接池实现(经过本⼈改版,可以适⽤多数据库类型的应⽤以及⼀种数据库类型多个数据库且数据 库的数量可以动态增加的应⽤程序)
1),DBConnectionPool.java 数据库连接池类
2),DBConnectionManager .java
数据库管理类
3),DSConfigBean .java
单个数据库连接信息Bean
4),ParseDSConfig.java
操作多(这个'多'包括不同的数据库和同⼀种数据库有多个数据库)
数据 配置⽂件xml
5),l
数据库配置⽂件xml
原代码如下:
DBConnectionPool.java
----------------------------------------------------------
/**
* 数据库连接池类
*/
package com.chunkyo.db;
import java.sql.Connection;
import
java.sql.DriverManager;
import java.sql.SQLException;
import
java.util.ArrayList;
import java.util.Iterator;
import
java.util.Timer;
/**
* @author chenyanlin
*
*/
public class
DBConnectionPool implements TimerListener { private Connection con=null;
private int inUsed=0;
//使⽤的连接数
private ArrayList freeConnections = new ArrayList();//容器,空闲连接
private int minConn; //最⼩连接数
private int
maxConn; //最⼤连接
private String name; //连接池名字
private String
password; //密码
private String url; //数据库连接地址
private String
driver; //驱动
private String user; //⽤户名
public Timer timer;
//定时
/**
*
*/
public DBConnectionPool() {
/
/ TODO
Auto-generated constructor stub
}
java的jdbc连接数据库/**
* 创建连接池
* @param
driver
* @param name
* @param URL
* @param user
* @param
password
* @param maxConn
*/
public DBConnectionPool(String name,
String driver,String URL, String user, String password, int maxConn)
{
this.name=name;
this.driver=driver;
this.url=URL;
this.user=user;
this.password=password;
this.maxConn=maxConn;
}
/**
* ⽤完,释放连接
* @param con
*/
public synchronized void
freeConnection(Connection con)
{
this.freeConnections.add(con);//添加到空闲连接的末尾this.inUsed--;
}
/
**
* timeout 根据timeout得到连接
* @param timeout
* @return
*/
public
synchronized Connection getConnection(long timeout) {
Connection
con=null;
if(this.freeConnections.size()>0)
{
con=(Connection)(0);
if(con==null)con=getConnection(timeout);
//继续获得连接
}
else
{
con=newConnection();
//新建连接
}
if(this.maxConn==0||this.maxConn
{
con=null;//达到最⼤连接数,暂时不能获得连接了。
}
if(con!=null)
{
this.inUsed++;
}
return
con;
}
/**
*
* 从连接池⾥得到连接
* @return
*/
public
synchronized Connection getConnection()
{
Connection
con=null;
if(this.freeConnections.size()>0)
{
con=(Connection)(0);
ve(0);//如果连接分配出去了,就从空闲连接⾥删除
if(con==null)con=getConnection();
//继续获得连接
}
else
{
con=newConnection();
//新建连接
}
if(this.maxConn==0||this.maxConn
{
con=null;//等待
超过最⼤连接时
}
if(con!=null)
{
this.inUsed++;
System.out.println("得到 "+this.name+" 的连接,现有"+inUsed+"个连接在使⽤!"); }
return
con;
}
/**
*释放全部连接