下面是以前學java 的時候寫的一個實現,沒有考慮很多,比如同步處理等等。懶得改,你就看看吧。
package com.wangjia.tools;
import java.io.Serializable;
import java.sql.*;
import java.util.*;
/**
* 數據庫連接池的簡單實現
* @author wangjia
* @version 1.0
*@serial 2301410997974776106L
*/
public class DbConn implements Serializable{
/**
*
*/
private static final long serialVersionUID = 2301410997974776106L;
private static List<Connection> connList=new ArrayList<Connection>();
//private static String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";//sql2000
private static String driver="com.microsoft.sqlserver.jdbc.SQLServerDriver";//sql2005
private static String url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Forum";
private static String userName="sa";
private static String password="sa";
private static int maxConn=20;
private static int minConn=5;
private static int usedConn=0;
private static DbConn dbconn=null;
// private static int flag=1;
/**
* 設置數據庫連接的驅動
* @param driver 數據庫連接的驅動<br/>例如:"com.microsoft.sqlserver.jdbc.SQLServerDriver"
*/
public static void setDriver(String driver) {
DbConn.driver = driver;
}
/**
* 設置數據庫連接池的最小數量
* @param maxConn 數據庫連接池的最小數量
*/
public static void setMaxConn(int maxConn) {
DbConn.maxConn = maxConn;
}
/**
* 設置數據庫連接池的最大數量
* @param minConn 數據庫連接池的最大數量
*/
public static void setMinConn(int minConn) {
DbConn.minConn = minConn;
}
/**
* 設置數據庫連接的URL
* @param url 數據庫連接的URL,包括數據庫的名稱<br/>例如: "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=master"
*/
public static void setUrl(String url) {
DbConn.url = url;
}
private DbConn() throws MyException{
try{
Class.forName(driver);
for(int i=0;i<minConn;i++){
connList.add(DriverManager.getConnection(url,userName.toString(),password.toString()));
}
}catch(ClassNotFoundException e){
throw new MyException("請設置正確的數據庫連接驅動!\nusing: DbConn.setDriver(String driver)");
}catch(SQLException e){
throw new MyException("請設置正確的數據庫連接URL以及用于連接的用戶名和密碼!\n" +
"using: DbConn.setUrl(String url),DbConn.setUserName(String userName),DbConn.setPassword(String password)");
}
}
/**
* 用于得到DbConn對象
* @return 返回一個DbConn對像
*/
public static Connection getConn() throws MyException{
// flag++;
if(dbconn==null)dbconn=new DbConn();
// System.out.println("falg="+flag);
// System.out.println("usedConn="+usedConn);
if(connList.size()==0){
throw new MyException("沒有正確的設置相關信息,以至連接池未初始化");
}
if(usedConn==maxConn){
Thread thread=new Thread(new Runnable(){
@SuppressWarnings("static-access")
public void run() {
if(usedConn<maxConn){
try {
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
getConn();
} catch (MyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
thread.start();
}
if(usedConn>=minConn&&usedConn<maxConn){
try {
connList.add(DriverManager.getConnection(url,userName.toString(),password.toString()));
} catch (SQLException e) {
}
return connList.get(usedConn++);
}
if(usedConn<5){
return connList.get(usedConn++);
}
return null;
}
public static void close(){
try {
if(usedConn>5)
connList.get(--usedConn).close();
else usedConn--;
} catch (SQLException e) {
// TODO 自動生成 catch 塊
e.printStackTrace();
}
}
/**
* 設置用于連接數據庫的密碼
* @param password 用于連接數據庫的密碼
*/
public static void setPassword(String password) {
DbConn.password = password;
}
/**
* 設置用于連接數據庫的用戶名
* @param userName 用于連接數據庫的用戶名
*/
public static void setUserName(String userName) {
DbConn.userName = userName;
}
}
在項目中用到連接池的話,一般會直接使用已有的開源連接池實現,比如用 apache 的common-dbcp.jar和common-pool.jar 相結合,很少去自己實現。