社区
Web 开发
帖子详情
高手请进->关于连接池
blueeagle007
2003-04-09 11:27:14
请教:我现在要做jsp+javabean对oracle数据库操作。
我原先想的是:先定义一个类,如dbcon,仅定义数据连接。然后定义add,delete这样的类继承dbcon,这样很容易实现对数据库的操作,但是,不体现面向对象的思想。正确的做法应当抽象为数据库-> 连接池->sql管理->逻辑(可以包含如add(),delete这样的操作) 这样的层次,但我缺少对连接池的认识,能不能提供给我源码、相关文档、资料等,谢谢,帮帮我!
...全文
61
7
打赏
收藏
高手请进->关于连接池
请教:我现在要做jsp+javabean对oracle数据库操作。 我原先想的是:先定义一个类,如dbcon,仅定义数据连接。然后定义add,delete这样的类继承dbcon,这样很容易实现对数据库的操作,但是,不体现面向对象的思想。正确的做法应当抽象为数据库-> 连接池->sql管理->逻辑(可以包含如add(),delete这样的操作) 这样的层次,但我缺少对连接池的认识,能不能提供给我源码、相关文档、资料等,谢谢,帮帮我!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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中直接用文本编辑器直接修改。
Hibernate笔记=>
连接池
配置
本文介绍了在Hibernate应用中如何使用
连接池
,并详细解释了几种不同类型的
连接池
实现,包括C3P0、DBCP等。此外,还介绍了如何配置这些
连接池
以提高数据库访问效率。
Linux下C++访问MySQL
连接池
<二>
本文介绍了一个基于MySQL Connector C++ API的数据库
连接池
实现,采用单例模式管理连接资源,支持连接的创建、回收及重试机制。
<转>数据库
连接池
本文介绍了一种Java
连接池
管理器的实现方法,通过单例模式管理数据库
连接池
,并提供获取、释放连接的方法。此外,还展示了如何利用该
连接池
进行数据库操作,包括查询、更新及事务处理。
ADO.Net
连接池
--->附
本文详细介绍了ADO.NET中的
连接池
机制,包括其工作原理、如何启用和禁用
连接池
,以及
连接池
的管理和维护等内容。通过实际案例展示了
连接池
在提高数据库访问效率方面的作用。
黑猴子的家:JDBC -> 数据库
连接池
简述
本文深入探讨了JDBC数据库
连接池
的重要性,分析了其在Web应用程序中的必要性,对比了传统连接方式的不足,详细解释了
连接池
的工作原理及其带来的性能提升和资源管理优势,并介绍了两种流行的开源数据库
连接池
实现。
Web 开发
81,111
社区成员
341,723
社区内容
发帖
与我相关
我的任务
Web 开发
Java Web 开发
复制链接
扫一扫
分享
社区描述
Java Web 开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章