⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbconnectionpool.java

📁 java xml开发指南(初学者推荐)Java Xml 编程指南书籍源码
💻 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 + -