JAVA_java数据库连接池_第1页
JAVA_java数据库连接池_第2页
JAVA_java数据库连接池_第3页
JAVA_java数据库连接池_第4页
JAVA_java数据库连接池_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JAVA数据库连接池基本概念及原理 数据库连接池是为了解决数据库对象 的共享出错问题。实际就是建立一个 缓冲池。原理 预先在缓冲池中放入一定数量的连接, 当需要建立数据库连接时,只需从连接 池中取出一个,使用完毕之后再放回 去。JDBC的API中没有提供连接池的方法。连接池关键问题分析 使用线程同步来解决并发问题 使用一个单例模式的连接池管理类来 解决连接多个不同数据库。具体方法: 在连接池管理类的唯一实例被创建 时读取一个资源文件,其中资源文件 中存放着多个数据库的 url 地址 () 、 用 户 名 () 、 密 码 () 等 信 息 。 如 tx.url=23 :

2、5000/tx_it , tx.user=yang , tx.password=yang321 。根据资源文件提供的信息,创建多 个连接池类的实例,每一个实例都是 一个特定数据库的连接池。连接池管 理类实例为每个连接池实例取一个 名字,通过不同的名字来管理不同的 连接池。使用资源文件来解决同一个数据库有 多个用户使用不同的名称和密码访问 的情况。具体方法:资源文件中设置多个具有相同 url 地址,但具有不同用户名和密码的数 据库连接信息。可采用每一个事务独占一个连接来实 现事务处理 , 这种方法可以大大降低 事务管理的复杂性。具体方法 :Connection 类 可 以 通 过 设 置 Con

3、nection 的 AutoCommit 属性为 false, 然后显式的调用 commit 或 rollback 方法来实现。 使用空闲池来解决连接池的分配与释 放处理。具体办法 :把已经创建但尚未分配出去的连接 按创建时间存放到一个空闲池中。每当用户请求一个连接时,系统首 先检查空闲池内有没有空闲连接: 如果有就把建立时间最长 ( 通过容 器的顺序存放实现 ) 的那个连接分 配给他 ( 实际是先做连接是否有效 的判断,如果可用就分配给用户, 如不可用就把这个连接从空闲池删 掉,重新检测空闲池是否还有连 接)。如果没有则检查当前所建连接池是 否达到连接池所允许的最大连接数 (maxConn)

4、, 如果没有达到,就新建 一个连接,如果已经达到,就等待 一定的时间 (timeout) 。如果在等 待的时间内有连接被释放出来就可 以把这个连接分配给等待的用户, 如果等待时间超过预定时间 timeout, 则返回空值 (null) 。系统对已经分配出去正在使用的连 接只做计数,当使用完后再返还给空 闲池。连接池的配置与维护 连接池中到底应该放置多少连接, 才能使系统的性能最佳 ?设置连接最小数 ( 系统启动时连接 池所创建的连接数 ) 、最大数 ( 使用 连接池时所允许连接最大连接数 目) 如何确保连接池中的最小连接数 呢?动态策略 : 每隔一定时间就对连 接池进行检测,如果发现连接数量

5、小于最小连接数,则补充相应数量 的新连接 , 以保证连接池的正常运 转。静态策略 : 发现空闲连接不够时 再去检查。连接池的实现连接池模型DBConnectionPoolManager( 连接池管理外覆类 (wrapper), 符合 单例模式 )DBConnectionPool( 连 接 池 内 部 类)从连接池获取或创建可用连接 ; public Connection getConnection() 使用完毕之后,把连接返还给连接 池;public synchronized void freeConnection(Connection con) 在系统关闭前,断开所有连接并释 放连接占用的系

6、统资源 ;public synchronized void release() 还能够处理无效连接 ( 原来登记为 可用的连接,由于某种原因不再可 用,如超时,通讯问题 ) ,并能够 限制连接池中的连接总数不低于某 个预定值和不超过某个预定值。 private int checkedOut;/ 已被分配出去的连接数private int minConn;/ 连接池里连接的最小数量private int maxConn;/连接池里允许存在的最大连接数private Stri ng name; /为这个连接池取个名字,方便管理应用示例:import java.io.*;import java.sq

7、l.*;import java.util.*;import java.util.Date;/ 建立 DBConnectionManagerpublic class DBConnectionManager static private DBConnectionManager instanee ;static private int clients ;private Vector drivers = new Vector。;private PrintWriter log ;private Hashtable pools = new Hashtable();/返回唯一的实列staticsynchro

8、ni zedpublic DBConnectionMan ager get In sta nce() if ( instanee = null ) in sta nee = new DBConnectionMan ager();clie nts +;return instanee ;/构造函数!private DBConnectionMan ager() in it(); /结束构造函数/释放一个连接public void freeConnection(String name, Connection con) DBConn ecti on Pool pool = (DBC onnection

9、Pool)pools .get (n ame);if (pool != null ) pool.freeC onnection(con);/结束释放一个连接/取得一个连接public Connection getC onnection( Stri ng n ame) DBConn ecti on Pool pool = (DBC onnection Pool)pools .get (n ame);if (pool != null ) retur n pool.getC onn ecti on();return null ;long time) pools .get(name);public C

10、onnection getC onn ectio n(String n ame, DBCo nn ectio nPool pool = (DBCo nn ectio nPool) if (pool != null ) retur n pool.getC onn ecti on( time);returnnull ; / 结束 getconnection/关闭所有连接public synchronizedvoid release() if (- clients != 0)return ;Enumeration allPools =pools .elements();while (allPools

11、.hasMoreElements() DBCo nn ectio nPool pool = (DBCo nn ectio nPool) allPools. nextEleme nt(); pool.release();Enu merati on allDrivers =drivers .eleme nts();while (allDrivers.hasMoreElements() Driver driver = (Driver) allDrivers .n extEleme nt();try DriverManager. deregisterDriver (driver);log("

12、撤消 JDB(驱动程序"+ driver.getClass().getName(); catch (SQLException e) log(e,"无法撤消JDB(驱区动程序的注册” + driver.getClass().getName();private void createPools(Properties props) Enu merati on propNames = pertyNames();while (propNames.hasMoreElements() Stri ng n ame = (Stri ng) propNames .n extE

13、leme nt();if (name.endsWith( ".url" ) II II);Stri ng poolName = n ame.substri ng(0, n ame .l astI ndexOf(String url = props.getProperty(poolName +".url" );if (url = null ) log("没有连接池"+ poolName +"指定的URL');continue ;".user");".password");&quo

14、t;.maxconn" , "0");String user = props.getProperty(poolName +String password = props.getProperty(poolName +String maxc onn = props.getProperty(poolName + int max;try max = Integer.valueOf (maxconn).intValue();".连接池"+ poolName); catch (NumberFormatException e) log("错误的最大

15、连接数:"+ maxconn + max = 0;DBConnection Pool pool =new DBConnection Pool(poolName, url,user, password, max);pools .put(poolName, pool);log("成功创建连接池"+ poolName);private void init() In putStream is = getClass().getResourceAsStream("/perties" );Properties dbProps = new Prop

16、erties();try dbProps .lo ad(is); catch (Exception e) System. err .println("不能读取属性文件。请确保 perties 在你的 CLASSPATH");return ;String logFile = dbProps.getProperty("logfile" ,"DBCo nn ectio nMan ager.log");try log = new PrintWriter( new FileWriter(logFile,true ), true );

17、 catch (lOException e) System. err .println(”无法打开日志文件:” + logFile);log = new PrintWriter(System. err);loadDriver(dbProps); createPools(dbProps);private void loadDriver(Properties props) String driverClasses = props.getProperty("drivers" );Strin gToke ni zer st =new Strin gToke ni zer(drive

18、rClasses);while (st.hasMoreElements() Stri ng driverClassName = st .n extToke n().trim();try Driver driver = (Driver) Class.forName(driverClassName).newln sta nce();DriverMa nager. registerDriver (driver);drivers .addElement(driver);log("成功注册驱动程序 "+ driverClassName); catch (Exception e) lo

19、g("无法注册驱动程序:"+ 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 );/ 建立 DBConnectionPool 内部类class DBConnectionPool priva

20、teint checkOut;private Vector freeC onn ecti ons= new Vector();privateint maxc onn;privateStringn ameprivateStringpassword;privateStri ngURL;private String user;public DBConnectionPool(String name, String URL, String user,String password, int maxconn) this . name= name;this . URL= URL;this . passwor

21、d = password;this . user = user;this . maxconn = maxconn;public synchroni zed freeC onnectionsvoid freeConnection(Connection con) .addEleme nt(c on);checkOut -; n otifyAII();public synchroni zed Connection getC onnection() Connection con = null ;if ( freeConnections .size() > 0) con = (Connection

22、) freeC onnections .firstEleme nt(); freeC onn ecti ons .removeEleme ntAt(O);try if (con.isClosed() log("从连接池” + name+ "删除一个连接”); con = getC onnection(); catch (SQLException e) log("从连接池” + name+ "删除一个连接”); con = getC onnection(); else if ( maxconn = 0 | checkOut < maxconn) con = n ewC onn ecti on();if (con != null ) checkOut +;return con;public synchroni zed Connection getC onnection(long timeout) long startTime = Connection con;new Date().getTime()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论