社区
Web 开发
帖子详情
高手请进->关于连接池
blueeagle007
2003-04-09 11:27:14
请教:我现在要做jsp+javabean对oracle数据库操作。
我原先想的是:先定义一个类,如dbcon,仅定义数据连接。然后定义add,delete这样的类继承dbcon,这样很容易实现对数据库的操作,但是,不体现面向对象的思想。正确的做法应当抽象为数据库-> 连接池->sql管理->逻辑(可以包含如add(),delete这样的操作) 这样的层次,但我缺少对连接池的认识,能不能提供给我源码、相关文档、资料等,谢谢,帮帮我!
...全文
34
7
打赏
收藏
高手请进->关于连接池
请教:我现在要做jsp+javabean对oracle数据库操作。 我原先想的是:先定义一个类,如dbcon,仅定义数据连接。然后定义add,delete这样的类继承dbcon,这样很容易实现对数据库的操作,但是,不体现面向对象的思想。正确的做法应当抽象为数据库-> 连接池->sql管理->逻辑(可以包含如add(),delete这样的操作) 这样的层次,但我缺少对连接池的认识,能不能提供给我源码、相关文档、资料等,谢谢,帮帮我!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
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中直接用文本编辑器直接修改。
我的Java开发学习之旅------>Java经典面试题
我的Java开发学习之旅------>Java经典面试题 摘自张孝祥itcast 从享受生活的角度上来说:“程序员并不是一种最好的职业,我认为两种人可以做程序员,第一,你不做程序员,你就没有什么工作可做,或者说是即使有可以做的工作但是你非常不愿意去做;第二,你非常痴迷和爱好程序,并且在这方面有一些天赋和优势。程序员的结局也是有两种:第一,默默退休,第二以程序员为起点或跳板,注意积累,跟
(1) other&interview --> 设计模式:Java开发中的23种设计模式详解(转)
设计模式(Design Patterns)——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运
socket
连接池
socket
连接池
2011-06-16 20:40:54| 分类: 网络服务编程技术 | 标签: |字号大中小 订阅 socket
连接池
SOCKET
连接池
原来注意过,但时间长了,对这个的了解有些乱,今天总结一下,趁着天气比较凉快,心情也比较舒畅。 SOCKET
连接池
产生,目的是为了减少内核在创建和销毁SOCKET时所产生的开销,一个两个的SOCKET的
jsp 数据
连接池
引用:http://blog.csdn.net/itblog/article/details/981136 到目前为目,JDBC2的连结池只是一个接口,没有真正的实现,JDBC3正在开发中,据报已经支持连结池,但..........JDBC3用了JNDI技术,连结池的配置可以让一个
高手
都烦死.目前第三方已经实现的连结池当然是poolman,1.0版对一般用户来说已经足够用了.配置也简单,2.0...
Andorid-15k+的面试题。
andorid开发也做了3年有余了,也面试很多加企业,借此机会分享一下,我们中遇到过的问题以及解决方案吧,希望能够对正在找工作的andoird程序员有一定的帮助。学完本人博客发表《ym--andorid从零开始教程》+面试题目全理解,年薪18w以上绝对没问题。 特别献上整理过的50道面试题目 1.listView的优化方式 重用convertView
Web 开发
81,122
社区成员
341,744
社区内容
发帖
与我相关
我的任务
Web 开发
Java Web 开发
复制链接
扫一扫
分享
社区描述
Java Web 开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章