少年阿宾

那些青春的岁月

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

下面是以前学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 相结合,很少去自己实现。

posted on 2012-09-03 21:55 abin 阅读(503) 评论(0)  编辑  收藏 所属分类: JDBCP

只有注册用户登录后才能发表评论。


网站导航: