📄 dbconnectionpool.java
字号:
package MyNa.utils;
import java.util.Date;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.DriverManager;
public class DBConnectionPool{
int maxSize; int initSize; int inUse; int timeout;
String poolName; String dbUrl; String dbUser; String dbPwd;
Queue Q; Logger errLg; Logger adminLg;
public DBConnectionPool
(String nm,String url,String usr,String pwd,
int timeout,int initSize,int maxSize,
Logger er,Logger adm) throws Exception{
poolName=nm; dbUrl=url; dbUser=usr; dbPwd=pwd;
if(null==dbUser)dbUser="";
if(null==dbPwd)dbPwd="";
this.maxSize=maxSize; this.initSize=initSize; this.timeout=timeout;
errLg=er; adminLg=adm;
Q=new Queue(); inUse=0;
adminLg.logIt("DBConnectionPool init for "+poolName);
preload(initSize);
}
public synchronized Connection popConnection(){
while(!Q.isEmpty()){
try{
Connection con=(Connection)Q.next();
if(!con.isClosed())return con; // might be closed by dbase
adminLg.logIt("REJECT: connection in "+poolName+" was closed");
}catch(Exception ex){
errLg.logIt("DBConnectionPool.popConnection: ",ex);
}
}
return null;
}
public synchronized Connection getConnection(){
Connection con=popConnection();
if(null==con)
if(maxSize<0 || inUse<maxSize)
con=newConnection();
if(null!=con)inUse++;
return con;
}
public synchronized void close(){
Connection con;
while(!Q.isEmpty()){
if(null==(con=popConnection()))continue;
try{
con.close();
adminLg.logIt("closed connection in pool "+poolName);
}catch(SQLException ex){errLg.logIt("err in closing "+poolName,ex);}
}
if(inUse>0)
errLg.logIt("close "+poolName+" with "+inUse+" still connected");
else adminLg.logIt("closed "+poolName);
}
public void preload(int N)throws Exception {
for(int i=0;i<N;i++){
Connection con=newConnection();
if(null==con)throw new Exception("connection failure in "+dbUrl);
Q.append(con);
}
}
public synchronized void freeConnection(Connection con){
Q.append(con);
inUse--;
notifyAll(); // wake up anyone waiting in getConnection(timeout);
}
private Connection newConnection(){
adminLg.logIt("newConnection for pool "+poolName+"; "+dbUser+"; "+dbPwd);
try{
if(dbUser.length()==0)
return DriverManager.getConnection(dbUrl);
else return DriverManager.getConnection(dbUrl,dbUser,dbPwd);
}catch(SQLException ex){
errLg.logIt("no newConnection for "+dbUrl,ex);
return null;
}
}
public Connection getConnection(int timeout){
long waitUntil=new Date().getTime()+timeout;
Connection con;
while(null==(con=getConnection()) && waitUntil > new Date().getTime()){
try{wait(timeout);}catch(InterruptedException ex){}
}
return con;
}
public Connection getConnWait(){
return getConnection(timeout);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -