oracle数据用户链接池,Oracle数据库 关于连接池一

Oracle数据库 关于连接池一

作者:chinaitlab 佚名

2005-11-24 00:00

评论

分享

【IT168 服务器学院】到目前为目,JDBC2的连结池只是一个接口,没有真正的实现,JDBC3正在开发中,据报已经支持连结池,但JDBC3用了JNDI技术,连结池的配置可以让一个高手都烦死.

目前第三方已经实现的连结池当然是poolman,1.0版对一般用户来说已经足够用了.配置也简单,2.0版虽然增加了一些功能,但配置也是采用JNDI,对RMI和EJB不懂的朋友可能很烦.建议用1.0的了.

如果有兴趣,自己也可以实现连结池,最关键的技术也就是把连结作为参数传给一个BEAN,用完后返回这个参数连结而不是关闭.

下面是一个简单的实现:

DBConnectionManager.java程序清单如下:

001 import java.io.*;

002 import java.sql.*;

003 import java.util.*;

004 import java.util.Date;

005

006 /**

007 * 管理类DBConnectionManager支持对一个或多个由属性文件定义的数据库连接

008 * 池的访问.客户程序可以调用getInstance()方法访问本类的唯一实例.

009 */

010 public class DBConnectionManager {

011 static private DBConnectionManager instance; // 唯一实例

012 static private int clients;

013

014 private Vector drivers = new Vector();

015 private PrintWriter log;

016 private Hashtable pools = new Hashtable();

017

018 /**

019 * 返回唯一实例.如果是第一次调用此方法,则创建实例

020 *

021 * @return DBConnectionManager 唯一实例

022 */

023 static synchronized public DBConnectionManager getInstance() {

024 if (instance == null) {

025 instance = new DBConnectionManager();

026 }

027 clients++;

028 return instance;

029 }

030

031 /**

032 * 建构函数私有以防止其它对象创建本类实例

033 */

034 private DBConnectionManager() {

035 init();

036 }

037

038 /**

039 * 将连接对象返回给由名字指定的连接池

040 *

041 * @param name 在属性文件中定义的连接池名字

042 * @param con 连接对象\\r

043 */

044 public void freeConnection(String name, Connection con) {

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

046 if (pool != null) {

047 pool.freeConnection(con);

048 }

049 }

050

051 /**

052 * 获得一个可用的(空闲的)连接.如果没有可用连接,且已有连接数小于最大连接数

053 * 限制,则创建并返回新连接

054 *

055 * @param name 在属性文件中定义的连接池名字

056 * @return Connection 可用连接或null

057 */

058 public Connection getConnection(String name) {

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

060 if (pool != null) {

061 return pool.getConnection();

062 }

063 return null;

064 }

065

066 /**

067 * 获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制,

068 * 则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接.

069 *

070 * @param name 连接池名字

071 * @param time 以毫秒计的等待时间\\r

072 * @return Connection 可用连接或null

073 */

074 public Connection getConnection(String name, long time) {

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

076 if (pool != null) {

077 return pool.getConnection(time);

078 }

079 return null;

080 }

081

082 /**

083 * 关闭所有连接,撤销驱动程序的注册\\r

084 */

085 public synchronized void release() {

086 // 等待直到最后一个客户程序调用

087 if (--clients != 0) {

088 return;

089 }

090

091 Enumeration allPools = pools.elements();

092 while (allPools.hasMoreElements()) {

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

094 pool.release();

095 }

096 Enumeration allDrivers = drivers.elements();

097 while (allDrivers.hasMoreElements()) {

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

099 try {

100 DriverManager.deregisterDriver(driver);

101 log("撤销JDBC驱动程序 " + driver.getClass().getName()+"的注册\\\");

102 }

103 catch (SQLException e) {

104 log(e, "无法撤销下列JDBC驱动程序的注册: " + driver.getClass().getName());

105 }

106 }

107 }

108

109 /**

110 * 根据指定属性创建连接池实例.

111 *

112 * @param props 连接池属性

113 */

114 private void createPools(Properties props) {

115 Enumeration propNames = props.propertyNames();

116 while (propNames.hasMoreElements()) {

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

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

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

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

121 if (url == null) {

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

123 continue;

124 }

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

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

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

128 int max;

129 try {

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

131 }

132 catch (NumberFormatException e) {

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

134 max = 0;

135 }

136 DBConnectionPool pool =

137 new DBConnectionPool(poolName, url, user, password, max);

138 pools.put(poolName, pool);

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

140 }

141 }

142 }

143

144 /**

145 * 读取属性完成初始化

146 */

147 private void init() {

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

149 Properties dbProps = new Properties();

150 try {

151 dbProps.load(is);

152 }

153 catch (Exception e) {

154 System.err.println("不能读取属性文件. " +

155 "请确保db.properties在CLASSPATH指定的路径中");

156 return;

157 }

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

159 try {

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

161 }

162 catch (IOException e) {

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

164 log = new PrintWriter(System.err);

165 }

166 loadDrivers(dbProps);

167 createPools(dbProps);

168 }

169

170 /**

171 * 装载和注册所有JDBC驱动程序\\r

172 *

173 * @param props 属性

174 */

175 private void loadDrivers(Properties props) {

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

177 StringTokenizer st = new StringTokenizer(driverClasses);

178 while (st.hasMoreElements()) {

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

180 try {

181 Driver driver = (Driver)

182 Class.forName(driverClassName).newInstance();

183 DriverManager.registerDriver(driver);

184 drivers.addElement(driver);

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

186 }

187 catch (Exception e) {

188 log("无法注册JDBC驱动程序: " +

189 driverClassName + ", 错误: " + e);

190 }

191 }

192 }

193

194 /**

195 * 将文本信息写入日志文件

196 */

197 private void log(String msg) {

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

199 }

200

201 /**

202 * 将文本信息与异常写入日志文件

203 */

204 private void log(Throwable e, String msg) {

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

206 e.printStackTrace(log);

207 }

208

209 /**

210 * 此内部类定义了一个连接池.它能够根据要求创建新连接,直到预定的最\\r

0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值