首先写一个读取本地数据库驱动,数据库用户名、数据库密码、连接数的类。
package cn.cate.utils;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
public class PoolProperties {
private Properties properties;
private String driver;
private String url;
private String user;
private String password;
private int maxConn;
private int minConn;
public PoolProperties(){
properties = new Properties();
String path = getClass().getProtectionDomain().getCodeSource().getLocation().toString();
path = path.substring(6, path.length());
if (path.indexOf("WEB-INF") > 0) {
path = path.substring(0, path.indexOf("/WEB-INF") + 9) + "lib/";
}else{
path = "d:";
}
try {
this.properties.load(new FileReader(path + "db.pro"));
}catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
this.setDriver(properties.getProperty("driver"));
this.setUrl(properties.getProperty("url"));
this.setUser(properties.getProperty("user"));
this.setPassword(properties.getProperty("password"));
this.setMaxConn(Integer.parseInt(properties.getProperty("maxConn")));
this.setMinConn(Integer.parseInt(properties.getProperty("minConn")));
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getMaxConn() {
return maxConn;
}
public void setMaxConn(int maxConn) {
this.maxConn = maxConn;
}
public int getMinConn() {
return minConn;
}
public void setMinConn(int minConn) {
this.minConn = minConn;
}
}
db.pro的内容如下:
driver=com.mysql.jdbc.Driver maxConn=10 minConn=1 url=jdbc:mysql://127.0.0.1:3306/cate user=root password=11111
然后定义一个数据库连接池:DBConnectionPool
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
* 此内部类定义了一个连接池,它能够根据要求创建连接,直到预定的最大连接数为止。
* 在返回连接给客户程序之前,它能够验证连接的有效性。
*/
public class DBConnectionPool {
/*
* 连接池
*/
private List<Connection> freeConnections = new ArrayList<Connection>();
private Connection conn = null;
private int connect = 0; //使用的连接数
private int maxConn; //最大连接数
private String driver; //数据库驱动
private String url; //数据库连接地址
private String user; //用户名
private String password; //用户名
public DBConnectionPool(String driver,String URL,String user,String password,int maxConn){
this.driver = driver;
this.url = URL;
this.user = user;
this.password = password;
this.maxConn = maxConn;
poolInfo();
}
/*
* 显示准备创建连接池的信息
*/
private void poolInfo(){
Connection conn = this.newConnection();
freeConnections.add(conn);
for(int i = 0;i < this.maxConn - 1;i++){
Connection freeConn = conn;
freeConnections.add(freeConn);
}
}
/*
* 用完,释放一个连接
*/
public synchronized void freeConnection(Connection conn){
this.freeConnections.add(conn);
this.connect--;
}
/*
* 从连接池中获取一个可用连接,当无法从连接池中获取可用连接时,新创建一个连接
*/
public synchronized Connection getConnection(){
if(this.freeConnections.size() > 0){
/*
* 当在连接池中取出一个连接后,删除此连接
*/
conn = this.freeConnections.get(0);
this.freeConnections.remove(0);
}
/*
* 当取出的连接为null时,递归调用自己,直到获得一个可用连接为止
*/
if(conn == null){
conn = getConnection();
}else{
conn = newConnection();
}
if(this.maxConn == 0 || this.maxConn < this.connect){
/*
* 等待超过最大连接时
*/
conn = null;
}
if(conn != null){
this.connect++;
}
return conn;
}
/*
* 释放全部连接
*/
public synchronized void release(){
Iterator<Connection> allConns = this.freeConnections.iterator();
while(allConns.hasNext()){
Connection conn = (Connection)allConns.next();
try{
if(null != conn){
conn.close();
}
conn = null;
}catch(SQLException e){
e.printStackTrace();
}
}
this.freeConnections.clear();
}
/*
* 创建一个数据库连接对象
*/
private Connection newConnection(){
try{
Class.forName(driver);
}catch(ClassNotFoundException e2){
e2.printStackTrace();
}
try{
conn = DriverManager.getConnection(url,user,password);
}catch(SQLException e3){
e3.printStackTrace();
System.exit(0);
}
return conn;
}
}
最后提供一个连接池的管理类:
import java.sql.Connection;
import java.util.Enumeration;
import java.util.Hashtable;
import cn.cate.utils.PoolProperties;
/*
* 连接池的管理类,负责读取配置连接池的文件,并创建连接池
* 从连接池中获取,释放连接
*/
public class DBConnectionManager {
/*
* 唯一数据库连接池管理实例类
* 使用单例模式创建
*/
private static DBConnectionManager instance;
/*
* 连接池的集合
*/
private Hashtable<String,DBConnectionPool> pools = new Hashtable<String,DBConnectionPool>();
private static String poolName = "MYSQL_MZBA"; //连接池名字
public static synchronized DBConnectionManager getInstance(){
if(instance == null){
instance = new DBConnectionManager();
}
return instance;
}
/*
* 只允许内部实例化管理类
*/
private DBConnectionManager(){
this.init();
}
/*
* 加载驱动程序
*/
private void init(){
PoolProperties poolProperties = new PoolProperties();
DBConnectionPool pool = new DBConnectionPool(poolProperties.getDriver(), poolProperties.getUrl(),
poolProperties.getUser(), poolProperties.getPassword(), poolProperties.getMaxConn());
pools.put(poolName, pool);
}
/*
* 根据连接池的名字得到一个连接
*/
public Connection getConnection(){
DBConnectionPool pool = null;
Connection conn = null;
pool = pools.get(poolName);
try{
conn = pool.getConnection();
}catch(Exception e){
e.printStackTrace();
}
return conn;
}
/*
* 释放一个连接
*/
public synchronized void freeConnection(Connection conn){
DBConnectionPool pool = pools.get(poolName);
if(pool != null){
pool.freeConnection(conn);
}
}
/*
* 释放所有连接
*/
public synchronized void release(){
Enumeration<DBConnectionPool> allpools = pools.elements();
while(allpools.hasMoreElements()){
DBConnectionPool pool = allpools.nextElement();
if(pool != null){
pool.release();
}
}
pools.clear();
}
}