📄 dbconnpool.java
字号:
package setting;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Date;
import java.util.Enumeration;
import java.util.Vector;
import action.Log;
/**
* 数据库连接池。继承了DBConnParam参数类,通过一个池名name
* 和一个配置文件名configFile创建一个连接池可供使用。
*
* @author Dylin
* @date 2006-10-3
*
*/
public class DBConnPool {
private String name = ""; //本池名称
private String ip = ""; //数据服务器ip
private String port = ""; //端口号
private String dataname = ""; //连接的数据库
private String user; //数据库用户名
private String password; //数据库密码
//private int minConn = 0; //初始化连接数
private int maxConn = 50; //最大连接数
//private long timeOut = 600000;//连接的最大空闲时间
//private long waitTime = 30000; //取连接的时候如果没有可用连接最大的等待时间
private int checkedOut = 0; //已分配的连接个数
private Vector<Connection> freeConns =
new Vector<Connection>(); //空闲连接个数
/**
* 创建新的连接池
*
* @param name 连接池名字
* @param configFile 配置文件位置
*/
public DBConnPool(String name, String ip, String port,
String dataname, String user, String pw, int min,
int max, long timeOut, long waitTime) {
this.name = name;
this.ip = ip;
this.port = port;
this.dataname = dataname;
this.user = user;
this.password = pw;
//this.minConn = min;
this.maxConn = max;
//this.timeOut = timeOut;
//this.waitTime = waitTime;
}
/**
* 将不再使用的连接返回给连接池
*
* @param conn 客户程序释放的连接
*/
public synchronized void freeConn(Connection conn) {
if (conn != null && (conn instanceof Connection)) {
freeConns.addElement(conn);
checkedOut --;
if (checkedOut < 0) {
checkedOut = 0;
}
}
}
/**
* 从连接池获得一个可用连接,如没有空闲的连接且当前连接数小于最大连接
* 数限制,则创建新连接,如原来登记为可用的连接不再有效,则从向量删除,
* 然后递归调用自己以尝试新的可用连接.
* @return Connection 连接
*/
public synchronized Connection getConn() {
Connection conn = null;
if (freeConns.size() > 0) {
//获取向量中第一个可用连接
conn = freeConns.firstElement();
freeConns.removeElementAt(0);
try {
if (conn.isClosed()) {
Log.writeLog("从连接池" + name + "删除一个无连接!");
//递归调用自己,尝试再次获取可用连接
conn = getConn();
}
} catch (SQLException e) {
Log.writeLog("从连接池" + name + "删除一个无效连接!");
//递归调用自己,尝试再次获取可用连接
conn = getConn();
}
} else if (maxConn ==0 || checkedOut < maxConn){
//最大池中连接数为0或全部支出
conn = newConn();
}
if (conn != null && (conn instanceof Connection)) {
checkedOut ++;
}
return conn;
}
/**
* 从连接池获取可用连接.可指定客户程序能等待的最长时间
*
* @param timeout 以毫秒计的等待时间限制
* @return Connection 连接
*/
public synchronized Connection getConn(long timeout) {
long startTime = new Date().getTime();
Connection conn = null;
while ((conn = getConn()) == null) {
try {
wait(timeout);
} catch (InterruptedException e) {
Log.writeLog(startTime +
"setting.DBConnPool.getConn:\n\t" +
"申请连接等待时等待超时!");
}
if ((new Date().getTime() - startTime) >= timeout) {
//wait()返回的原因是超时
return null;
}
}
return conn;
}
/**
* 关闭所有连接
*
*/
public synchronized void release() {
Enumeration<Connection> allConns = freeConns.elements();
while (allConns.hasMoreElements()) {
Connection conn = allConns.nextElement();
try {
conn.close();
Log.writeLog("setting.DBConnManager.release:\n\t" +
"关闭连接池" + name + "中的连接!");
} catch (SQLException e) {
Log.writeLog(e, "setting.DBConnManager.release:\n\t" +
"无法关闭连接池" + name + "中的连接!");
}
}
freeConns.removeAllElements();
}
/**
* 创建新的连接
* @return
*/
private Connection newConn() {
Connection conn = null;
String url = "jdbc:microsoft:sqlserver://" + ip + ":" +
port + ";DatabaseName=" + dataname;
try {
if (user == null) {
conn = DriverManager.getConnection(url);
} else {
System.out.println("url = " +url);
System.out.println("user = " +user);
System.out.println("pw = " + password);
conn = DriverManager.getConnection(url, user, password);
}
Log.writeLog("setting.DBConnPool.newConn:\n\t" +
"连接池" + name + "创建一个新的连接!");
} catch (SQLException e) {
Log.writeLog(e, "settion.DBConnPool.newConn:\n\t" +
"无法创建下列URL的连接:" + url);
return null;
}
return conn;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -