java dbconnection,DBConnectionManager --分析鉴赏

package zpxx;

import java.io.*;

import java.sql.*;

import java.util.*;

import java.util.Date;

//建立DBConnectionManager

public class DBConnectionManager

{

static private DBConnectionManager instance;

static private int clients;

private Vector drivers=new Vector();

private PrintWriter log;

private Hashtable pools=new Hashtable();

//返回唯一的实列

static synchronized public DBConnectionManager getInstance()

{

if(instance==null)

{

instance=new DBConnectionManager();

}

clients++;

return instance;

}

//构造函数!

private DBConnectionManager()

{

init();

}

//结束构造函数

//释放一个连接

public void freeConnection(String name,Connection con)

{

DBConnectionPool pool=(DBConnectionPool)pools.get(name);

if(pool!=null)

{

pool.freeConnection(con);

}

}

//结束释放一个连接

//取得一个连接

public Connection getConnection(String name)

{

DBConnectionPool pool=(DBConnectionPool)pools.get(name);

if(pool!=null)

{

return pool.getConnection();

}

return null;

}

public Connection getConnection(String name,String customer)

{

DBConnectionPool pool=(DBConnectionPool)pools.get(name);

if(pool!=null)

{

return pool.getConnection(customer);

}

return null;

}

public Connection getConnection(String name,long time)

{

DBConnectionPool pool=(DBConnectionPool)pools.get(name);

if(pool!=null)

{

return pool.getConnection(time);

}

return null;

}

//结束getconnection

//关闭所有连接

public synchronized void release()

{

//  if(--clients!=0)

//   return;

Enumeration allPools=pools.elements();

while(allPools.hasMoreElements())

{

DBConnectionPool pool=(DBConnectionPool)allPools.nextElement();

pool.release();

}

Enumeration allDrivers=drivers.elements();

while(allDrivers.hasMoreElements())

{

Driver driver=(Driver)allDrivers.nextElement();

try

{

DriverManager.deregisterDriver(driver);

log("撤消JDBC驱动程序"+driver.getClass().getName());

}

catch(SQLException e)

{

log(e,"无法撤消JDBC驱动程序的注册"+driver.getClass().getName());

}

}

}

public synchronized void release(String customer)

{

//  if(--clients!=0)

//   return;

Enumeration allPools=pools.elements();

while(allPools.hasMoreElements())

{

DBConnectionPool pool=(DBConnectionPool)allPools.nextElement();

pool.release(customer);

}

Enumeration allDrivers=drivers.elements();

while(allDrivers.hasMoreElements())

{

Driver driver=(Driver)allDrivers.nextElement();

try

{

DriverManager.deregisterDriver(driver);

log(customer+"撤消JDBC驱动程序"+driver.getClass().getName());

}

catch(SQLException e)

{

log(e,"无法撤消JDBC驱动程序的注册"+driver.getClass().getName());

}

}

}

private void createPools(Properties props)

{

Enumeration propNames=props.propertyNames();

while(propNames.hasMoreElements())

{

String name=(String) propNames.nextElement();

if(name.endsWith(".url"))

{

String poolName=name.substring(0,name.lastIndexOf("."));

String url=props.getProperty(poolName+".url");

if(url==null)

{

log("没有连接池"+poolName+"指定的URL");

continue;

}

String user=props.getProperty(poolName+".user");

String password=props.getProperty(poolName+".password");

String maxconn= props.getProperty(poolName+".maxconn","0");

int max;

try

{

max=Integer.valueOf(maxconn).intValue();

}

catch(NumberFormatException e)

{

log("错误的最大连接数:"+maxconn+".连接池"+poolName);

max=0;

}

DBConnectionPool pool=new DBConnectionPool(poolName,url,user,password,max);

pools.put(poolName,pool);

log("成功创建连接池"+poolName);

}

}

}

private void init()

{

InputStream is=getClass().getResourceAsStream("db.properties");

Properties dbProps=new Properties();

try

{

dbProps.load(is);

}

catch(Exception e)

{

System.err.println("不能读取属性文件。请确保db.properties在你的CLASSPATH中");

return;

}

String logFile=dbProps.getProperty("logfile","DBConnectionManager.log");

try

{

log=new PrintWriter(new FileWriter(logFile,true),true);

}

catch(IOException e)

{

System.err.println("无法打开日志文件:"+logFile);

log=new PrintWriter(System.err);

}

loadDriver(dbProps);

createPools(dbProps);

}

private void loadDriver(Properties props)

{

String driverClasses=props.getProperty("drivers");

StringTokenizer st=new StringTokenizer(driverClasses);

while(st.hasMoreElements())

{

String driverClassName=st.nextToken().trim();

try

{

Driver driver=(Driver)Class.forName(driverClassName).newInstance();

DriverManager.registerDriver(driver);

drivers.addElement(driver);

log("成功注册驱动程序"+driverClassName);

}

catch(Exception e)

{

log("无法注册驱动程序:"+driverClassName+",错误"+e);

}

}

}

private void log(String msg)

{

log.println(new Date()+":"+msg);

}

private void log(Throwable e,String msg)

{

log.println(new Date()+":"+msg);

e.printStackTrace(log);

}

class DBConnectionPool

{

private int checkOut;

private Vector freeConnections=new Vector();

private int maxconn;

private String name;

private String password;

private String URL;

private String user;

public DBConnectionPool(String name,String URL,String user,String password,int maxconn)

{

this.name=name;

this.URL=URL;

this.password=password;

this.user=user;

this.maxconn=maxconn;

}

public synchronized void freeConnection(Connection con)

{

freeConnections.addElement(con);

checkOut--;

notifyAll();

}

public synchronized Connection getConnection()

{

Connection con=null;

if(freeConnections.size()>0)

{

con=(Connection)freeConnections.firstElement();

freeConnections.removeElementAt(0);

try

{

if(con.isClosed())

{

log("从连接池"+name+"删除一个连接");

con=getConnection();

}

}

catch(SQLException e)

{

log("从连接池"+name+"删除一个连接");

con=getConnection();

}

}

else if(maxconn==0||checkOut{

con=newConnection();

}

if(con!=null)

{

checkOut++;

}

return con;

}

public synchronized Connection getConnection(String customer)

{

Connection con=null;

if(freeConnections.size()>0)

{

con=(Connection)freeConnections.firstElement();

freeConnections.removeElementAt(0);

try

{

if(con.isClosed())

{

log("从连接池"+name+"删除一个连接");

con=getConnection();

}

}

catch(SQLException e)

{

log("从连接池"+name+"删除一个连接");

con=getConnection();

}

}

else if(maxconn==0||checkOut{

con=newConnection(customer);

}

if(con!=null)

{

checkOut++;

}

return con;

}

public synchronized Connection getConnection(long timeout)

{

long startTime=new Date().getTime();

Connection con;

while((con=getConnection())==null)

{

try

{

wait(timeout);

}

catch(InterruptedException e)

{}

if((new Date().getTime()-startTime)>=timeout)

{

return null;

}

}

return con;

}

public void release()

{

Enumeration allConnections=freeConnections.elements();

while(allConnections.hasMoreElements())

{

Connection con=(Connection)allConnections.nextElement();

try

{

con.close();

log("关闭连接池"+name+"中的连接");

}

catch(SQLException e)

{

log(e,"无法关闭连接池"+name+"中的连接");

}

}

freeConnections.removeAllElements();

}

public void release(String customer)

{

Enumeration allConnections=freeConnections.elements();

while(allConnections.hasMoreElements())

{

Connection con=(Connection)allConnections.nextElement();

try

{

con.close();

log(customer+"关闭连接池"+name+"中的连接");

}

catch(SQLException e)

{

log(e,"无法关闭连接池"+name+"中的连接");

}

}

freeConnections.removeAllElements();

}

private Connection newConnection()

{

Connection con=null;

try

{

con=DriverManager.getConnection(URL,user,password);

log("连接池"+name+"创建一个新的连接");

}

catch(SQLException e)

{

log(e,"无法创建下列URL的连接"+URL);

return null;

}

return con;

}

private Connection newConnection(String customer)

{

Connection con=null;

try

{

con=DriverManager.getConnection(URL,user,password);

log(customer+"从连接池"+name+"创建一个新的连接");

}

catch(SQLException e)

{

log(e,"无法创建下列URL的连接"+URL);

return null;

}

return con;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值