知识大全 连接池用法
Posted 知
篇首语:树木在森林中相依偎而生长, 星辰在银河中因辉映而璀璨。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 连接池用法相关的知识,希望对你有一定的参考价值。
JDBC Java Servlet作为首选的服务器端数据处理技术 正在迅速取代CGI脚本 Servlet超越CGI的优势之一在于 不仅多个请求可以共享公用资源 而且还可以在不同用户请求之间保留持续数据 本文介绍一种充分发挥该特色的实用技术 即数据库连接池 一 实现连接池的意义 动态Web站点往往用数据库存储的信息生成Web页面 每一个页面请求导致一次数据库访问 连接数据库不仅要开销一定的通讯和内存资源 还必须完成用户验证 安全上下文配置这类任务 因而往往成为最为耗时的操作 当然 实际的连接时间开销千变万化 但 到 秒延迟并非不常见 如果某个基于数据库的Web应用只需建立一次初始连接 不同页面请求能够共享同一连接 就能获得显著的性能改善 Servlet是一个Java类 Servlet引擎(它可能是Web服务软件的一部分 也可能是一个独立的附加模块)在系统启动或Servlet第一次被请求时将该类装入Java虚拟机并创建它的一个实例 不同用户请求由同一Servlet实例的多个独立线程处理 那些要求在不同请求之间持续有效的数据既可以用Servlet的实例变量来保存 也可以保存在独立的辅助对象中 用JDBC访问数据库首先要创建与数据库之间的连接 获得一个连接对象(Connection) 由连接对象提供执行SQL语句的方法 本文介绍的数据库连接池包括一个管理类DBConnectionManager 负责提供与多个连接池对象(DBConnectionPool类)之间的接口 每一个连接池对象管理一组JDBC连接对象 每一个连接对象可以被任意数量的Servlet共享 类DBConnectionPool提供以下功能 ) 从连接池获取(或创建)可用连接 ) 把连接返回给连接池 ) 在系统关闭时释放所有资源 关闭所有连接 此外 DBConnectionPool类还能够处理无效连接(原来登记为可用的连接 由于某种原因不再可用 如超时 通讯问题) 并能够限制连接池中的连接总数不超过某个预定值 管理类DBConnectionManager用于管理多个连接池对象 它提供以下功能 ) 装载和注册JDBC驱动程序 ) 根据在属性文件中定义的属性创建连接池对象 ) 实现连接池名字与其实例之间的映射 ) 跟踪客户程序对连接池的引用 保证在最后一个客户程序结束时安全地关闭所有连接池 本文余下部分将详细说明这两个类 最后给出一个示例演示Servlet使用连接池的一般过程 二 具体实现 DBConnectionManager java程序清单如下 import java io *; import java sql *; import java util *; import java util Date; /** * 管理类DBConnectionManager支持对一个或多个由属性文件定义的数据库连接 * 池的访问 客户程序可以调用getInstance()方法访问本类的唯一实例 */ public class DBConnectionManager static private DBConnectionManager instance; // 唯一实例 static private int clients; private Vector drivers = new Vector(); private PrintWriter log; private Hashtable pools = new Hashtable(); /** * 返回唯一实例 如果是第一次调用此方法 则创建实例 * * @return DBConnectionManager 唯一实例 */ static synchronized public DBConnectionManager getInstance() if (instance == null) instance = new DBConnectionManager(); clients++; return instance; /** * 建构函数私有以防止其它对象创建本类实例 */ private DBConnectionManager() init(); /** * 将连接对象返回给由名字指定的连接池 * * @param name 在属性文件中定义的连接池名字 * @param con 连接对象 */ public void freeConnection(String name Connection con) DBConnectionPool pool = (DBConnectionPool) pools get(name); if (pool != null) pool freeConnection(con); /** * 获得一个可用的(空闲的)连接 如果没有可用连接 且已有连接数小于最大连接数 * 限制 则创建并返回新连接 * * @param name 在属性文件中定义的连接池名字 * @return Connection 可用连接或null */ public Connection getConnection(String name) DBConnectionPool pool = (DBConnectionPool) pools get(name); if (pool != null) return pool getConnection(); return null; /** * 获得一个可用连接 若没有可用连接 且已有连接数小于最大连接数限制 * 则创建并返回新连接 否则 在指定的时间内等待其它线程释放连接 * * @param name 连接池名字 * @param time 以毫秒计的等待时间 * @return Connection 可用连接或null */ public Connection getConnection(String name long time) DBConnectionPool pool = (DBConnectionPool) pools get(name); if (pool != null) return pool getConnection(time); return null; /** * 关闭所有连接 撤销驱动程序的注册 */ public synchronized void release() // 等待直到最后一个客户程序调用 if ( clients != ) 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()); /** * 根据指定属性创建连接池实例 * * @param props 连接池属性 */ 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( 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 ); int max; try max = Integer valueOf(maxconn) intValue(); catch (NumberFormatException e) log( 错误的最大连接数限制: + maxconn + 连接池: + poolName); max = ; 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 (I cha138/Article/program/Java/JSP/201311/19437相关参考
Proxool连接池相关介绍 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Proxool连接池
监控Proxool连接池的活动连接变化情况 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 研究了
<!使用连接池获得连接JNDI javanamedriinterfacejava命名目录接口>
在默认通过myeclipse生成的配置里spring使用的是apache的dbcp连接池 <beanid=dataSource class=monsdbcpBasicDataSource
因为工作需要要使用到连接池所以拜读了互联网上众多前辈的文章学了不少经验这里想做一个小结加上自己的想法和在一起希望能给大家一些帮助 目的 消除数据库频繁连接带来的开销和瓶颈 解决方案 不
我从来都这样说:不是所有的应用都要采用连结池一般的轻载用了连结池反而会降低效率要用什么方式连结完全看你的系统瓶颈> 一个普通的连结过程中因为Connection一般要用到本地方法这些初始化是非常
/* *Copyright(C)Jackliu *<ahref="mailto:"></a> *WWWCNJAVAAllRightsReserved */ p
jboss配置 mysql数据库连接池实例 :配置: JDK JBoss &n
使用Spring管理数据源连接池 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nbs
Oracle数据库关于连接池一 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 到目前为目JDBC