JAVA_java数据库连接池.doc

上传人:scccc 文档编号:13825862 上传时间:2022-01-24 格式:DOC 页数:12 大小:99KB
返回 下载 相关 举报
JAVA_java数据库连接池.doc_第1页
第1页 / 共12页
JAVA_java数据库连接池.doc_第2页
第2页 / 共12页
JAVA_java数据库连接池.doc_第3页
第3页 / 共12页
JAVA_java数据库连接池.doc_第4页
第4页 / 共12页
JAVA_java数据库连接池.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《JAVA_java数据库连接池.doc》由会员分享,可在线阅读,更多相关《JAVA_java数据库连接池.doc(12页珍藏版)》请在三一文库上搜索。

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

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(撤消 JDB

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

13、.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);.maxconn , 0);String user = props.getProperty(poolName +String password = props.getProperty(p

14、oolName +String maxc onn = props.getProperty(poolName + int max;try max = Integer.valueOf (maxconn).intValue();.连接池+ poolName); catch (NumberFormatException e) log(错误的最大连接数:+ maxconn + max = 0;DBConnection Pool pool =new DBConnection Pool(poolName, url,user, password, max);pools .put(poolName, pool)

15、;log(成功创建连接池+ poolName);private void init() In putStream is = getClass().getResourceAsStream(/db.properties );Properties dbProps = new Properties();try dbProps .lo ad(is); catch (Exception e) System. err .println(不能读取属性文件。请确保 db.properties 在你的 CLASSPATH);return ;String logFile = dbProps.getProperty(

16、logfile ,DBCo nn ectio nMan ager.log);try log = new PrintWriter( new FileWriter(logFile,true ), true ); catch (lOException e) System. err .println(”无法打开日志文件:” + logFile);log = new PrintWriter(System. err);loadDriver(dbProps); createPools(dbProps);private void loadDriver(Properties props) String driv

17、erClasses = props.getProperty(drivers );Strin gToke ni zer st =new Strin gToke ni zer(driverClasses);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);driv

18、ers .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 );/ 建立 DBConnectio

19、nPool 内部类class DBConnectionPool privateint 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

20、= name;this . URL= URL;this . password = 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 ( freeConnecti

21、ons .size() 0) con = (Connection) 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 = timeou

22、t) returnnull ;return con;public void release() Enu merati on allC onnections =freeC onnections .eleme nts();while (allConnections.hasMoreElements() Connection con = (Connection) allC onnections.n extEleme nt(); try con. close();log(关闭连接池” + name+ 中的连接”); catch (SQLException e) log(e,无法关闭连接池” + name+ 中的连接”);freeC onnections .removeAIIEIeme nts();private Connection n ewC onn ectio n() Connection con = null ;try con = DriverManager.getConnection (URL user, password );log(连接池” + name+ 创建一个新的连接”); catch (SQLException e) log(e,无法创建下列URL的连接” + URL; returnnull ;return con;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1