高手请进->关于连接池

blueeagle007 2003-04-09 11:27:14
请教:我现在要做jsp+javabean对oracle数据库操作。
我原先想的是:先定义一个类,如dbcon,仅定义数据连接。然后定义add,delete这样的类继承dbcon,这样很容易实现对数据库的操作,但是,不体现面向对象的思想。正确的做法应当抽象为数据库-> 连接池->sql管理->逻辑(可以包含如add(),delete这样的操作) 这样的层次,但我缺少对连接池的认识,能不能提供给我源码、相关文档、资料等,谢谢,帮帮我!
...全文
13 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
AllError 2003-04-09
gz
回复
JikLiu 2003-04-09
看看这个,自己要有自己的思路,理顺就可以了。

package com.jewes;
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,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());
}
}
}
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<maxconn)
{con=newConnection();
}
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();
}
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;
}
}
}
回复
flashroom 2003-04-09
http://www.chinabs.net/Servlet/default.asp?infoid=12
有详细代码说明

-------------------------------------------------------------------
我的签名:我做了两天斑竹就被撤了,为什么????
回复
zhxx 2003-04-09
连接池的代码这里有不少
你搜索一下
回复
zpwly 2003-04-09
http://expert.csdn.net/Expert/topic/1357/1357306.xml?temp=.231106
回复
zpwly 2003-04-09
连接池(不仅仅是数据库,还有很多其它的连接池)的目的是为了节省系统资源占用,提高系统运行效率。
在一个大型的企业级应用中,客户端数量很大,且不可预测。若每一个客户端都与其所申请的系统资源真实连接,一方面系统资源会很快用完,另一方面客户端在使用系统资源时都不可能全时使用,如一个数据库连接的资源,客户端只有在读数及保存时才真正使用,在客户端对数据进行处理时,此连接一直保持,其实是在浪费系统资源。
针对此问题,可以通过连接池来解决,一个连接池本身的实现中包括两方面内容,一是与系统资源的真实连接,一是与客户端的虚拟连接。
客户端向连接池申请来得到系统资源,而客户端是否真正得到资源的算法由连接池控制,最终的效果是客户端认为已与系统资源连接上了即可。
而连接池只保持与系统资源的几个(一些)真实连接,通过算法在多客户端间轮回服务。就好象饭店的服务员,只要有几个人就可以为很多人服务。
回复
zpwly 2003-04-09
设置weblogic连接池:

pool的配置:
假设已配置服务:expserv
且数据库服务器机器名为:expserv
数据库sid:expservSID,用户名和密码都为:expserv
以weblogic7.0为例,首先启动服务
http://localhost:port/console
打开service\jdbc\connection pools
配置oraclePool如下:
Configuration:
Name: oraclePool
URL: jdbc:oracle:thin:@expserv:1521:expservSID
Driver Classname: oracle.jdbc.driver.OracleDriver
Properties(key=value): user=expserv
Targets:
Targets-Server:expserv
在weblogic7.0中除了数据库密码,其他的pool参数都可以在config.xml中直接用文本编辑器直接修改。
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2003-04-09 11:27
社区公告
暂无公告