您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > Java > Javajdbc数据库连接池总结
数据库连接池ppt:Javajdbc数据库连接池整理总结疯狂代码ĵ:http:/CrazyCoder.cn/BlogDigest/Article74573.html1.引言 近年来随着Internet/Intranet建网技术飞速发展和在世界范围内迅速普及计算机 应用已从传统桌面应用转到Web应用基于B/S(Browser/Server)架构3层开发模式逐渐取代C/S(Client/Server)架构开发模式成为开发企业级应用和电子商务普遍采用技术在Web应用开发早期主要使用技术是CGI﹑ASP﹑PHP等的后Sun公司推出了基于Java语言Servlet+Jsp+JavaBean技术相比传统开发技术它具有跨平台﹑安全﹑有效﹑可移植等特性这使其更便于使用和开发 Java应用访问数据库基本原理 在Java语言中JDBC(JavaDataBaseConnection)是应用和数据库沟通桥梁, 即Java语言通过JDBC技术访问数据库JDBC是种“开放”方案它为数据库应用开发人员﹑数据库前台工具开发人员提供了种标准应用设计接口使开发人员可以用纯Java语言编写完整数据库应用JDBC提供两种API分别是面向开发人员API和面向底层JDBC驱动API底层主要通过直接JDBC驱动和JDBC-ODBC桥驱动实现和数据库连接 般来说Java应用访问数据库过程(如图1所示)是: ①装载数据库驱动; ②通过JDBC建立数据库连接; ③访问数据库执行SQL语句; ④断开数据库连接border=0alt=/图1Java数据库访问机制 JDBC作为种数据库访问技术具有简单易用优点但使用这种模式进行Web应用 开发存在很多问题:首先每次Web请求都要建立次数据库连接建立连接是个费时活动每次都得花费0.05s~1s时间而且系统还要分配内存资源这个时间对于次或几次数据库操作或许感觉不出系统有多大开销可是对于现在Web应用尤其是大型电子商务网站WebSite同时有几百人甚至几千人在线是很正常事在这种情况下频繁进行数据库连接操作势必占用很多系统资源网站WebSite响应速度必定下降严重甚至会造成服务器崩溃不是危言耸听这就是制约某些电子商务网站WebSite发展技术瓶颈问题其次对于每次数据库连接使用完后都得断开否则如果出现异常而未能关闭将会导致数据库系统中内存泄漏最终将不得不重启数据库还有这种开发不能控制被创建连接对象数系统资源会被毫无顾及分配出去如连接过多也可能导致内存泄漏服务器崩溃; 数据库连接池(connectionpool)工作原理 1、基本概念及原理由上面分析可以看出问题根源就在于对数据库连接资源低效管理我们知道 对于共享资源有个很著名设计模式:资源池(ResourcePool)该模式正是为了解决资源频繁分配﹑释放所造成问题为解决上述问题可以采用数据库连接池技术数据库连接池基本思想就是为数据库连接建立个“缓冲池”预先在缓冲池中放入定数量连接当需要建立数据库连接时只需从“缓冲池”中取出个使用完毕的后再放回去我们可以通过设定连接池最大连接数来防止系统无尽和数据库连接更为重要是我们可以通过连接池管理机制监视数据库连接数量﹑使用情况为系统开发﹑测试及性能调整提供依据连接池基本工作原理见下图2border=0alt=/图2连接池基本工作原理 2、服务器自带连接池 JDBCAPI中没有提供连接池思路方法些大型WEB应用服务器如BEAWebLogic和IBMWebSphere等提供了连接池机制但是必须有其第3方专用类思路方法支持连接池使用方法 连接池关键问题分析 1、并发问题 为了使连接管理服务具有最大通用性必须考虑多线程环境即并发问题这个问题相对比较好解决Java语言自身提供了对并发管理支持使用synchronized关键字即可确保线程是同步使用思路方法为直接在类思路方法前面加上synchronized关键字如:publicsynchronizedConnectiongetConnection() 2、多数据库服务器和多用户 对于大型企业级应用常常需要同时连接区别数据库(如连接Oracle和Sybase)如何连接区别数据库呢?我们采用策略是:设计个符合单例模式连接池管理类在连接池管理类唯例子被创建时读取个资源文件其中资源文件中存放着多个数据库url地址(poolName.url)﹑用户名(poolName.user)﹑密码(poolName.password)等信息如tx.url=192.168.1.123:5000/tx_ittx.user=cyltx.password=123456根据资源文件提供信息创建多个连接池类例子每个例子都是个特定数据库连接池连接池管理类例子为每个连接池例子取个名字通过区别名字来管理区别连接池 对于同个数据库有多个用户使用区别名称和密码访问情况也可以通过资源文件处理即在资源文件中设置多个具有相同url地址但具有区别用户名和密码数据库连接信息 3、事务处理 我们知道事务具有原子性此时要求对数据库操作符合“ALL-ALL-NOTHING”原则,即对于组SQL语句要么全做要么全不做在Java语言中Connection类本身提供了对事务支持可以通过设置ConnectionAutoCommit属性为false,然后显式commit或rollback思路方法来实现但要高效进行Connection复用就必须提供相应事务支持机制可采用每个事务独占个连接来实现这种思路方法可以大大降低事务管理复杂性 4、连接池分配和释放 连接池分配和释放对系统性能有很大影响合理分配和释放可以提高连接复用度从而降低建立新连接开销同时还可以加快用户访问速度 对于连接管理可使用空闲池即把已经创建但尚未分配出去连接按创建时间存放到个空闲池中每当用户请求个连接时系统首先检查空闲池内有没有空闲连接如果有就把建立时间最长(通过容器顺序存放实现)那个连接分配给他(实际是先做连接是否有效判断如果可用就分配给用户如不可用就把这个连接从空闲池删掉重新检测空闲池是否还有连接);如果没有则检查当前所开连接池是否达到连接池所允许最大连接数(maxConn),如果没有达到就新建个连接如果已经达到就等待定时间(timeout)如果在等待时间内有连接被释放出来就可以把这个连接分配给等待用户如果等待时间超过预定时间timeout,则返回空值(null)系统对已经分配出去正在使用连接只做计数当使用完后再返还给空闲池对于空闲连接状态可开辟专门线程定时检测这样会花费定系统开销但可以保证较快响应速度也可采取不开辟专门线程只是在分配前检测思路方法 5、连接池配置和维护 连接池中到底应该放置多少连接才能使系统性能最佳?系统可采取设置最小连接数(minConn)和最大连接数(maxConn)来控制连接池中连接最小连接数是系统启动时连接池所创建连接数如果创建过多则系统启动就慢但创建后系统响应速度会很快;如果创建过少则系统启动很快响应起来却慢这样可以在开发时设置较小最小连接数开发起来会快而在系统实际使用时设置较大这样对访问客户来说速度会快些最大连接数是连接池中允许连接最大数目具体设置多少要看系统访问量可通过反复测试找到最佳点 如何确保连接池中最小连接数呢?有动态和静态两种策略动态即每隔定时间就对连接池进行检测如果发现连接数量小于最小连接数则补充相应数量新连接,以保证连接池正常运转静态是发现空闲连接不够时再去检查连接池实现 1、连接池模型 本文讨论连接池包括个连接池类(DBConnectionPool)和个连接池管理类(DBConnetionPoolManager)和个配置文件操作类(ParseDSConfig)连接池类是对某数据库所有连接“缓冲池”主要实现以下功能:①从连接池获取或创建可用连接;②使用完毕的后把连接返还给连接池;③在系统关闭前断开所有连接并释放连接占用系统资源;④还能够处理无效连接(原来登记为可用连接由于某种原因不再可用如超时通讯问题)并能够限制连接池中连接总数不低于某个预定值和不超过某个预定值(5)当多数据库时,且数据库是动态增加话,将会加到配置文件中 连接池管理类是连接池类外覆类(wrapper),符合单例模式即系统中只能有个连接池管理类例子其主要用于对多个连接池对象管理具有以下功能:①装载并注册特定数据库JDBC驱动;②根据属性文件给定信息创建连接池对象;③为方便管理多个连接池对象为每个连接池对象取个名字实现连接池名字和其例子的间映射;④跟踪客户使用连接情况以便需要是关闭连接释放资源连接池管理类引入主要是为了方便对多个连接池使用和管理如系统需要连接区别数据库或连接相同数据库但由于安全性问题需要区别用户使用区别名称和密码;;;;;;;;2、连接池实现(经过本人改版,可以适用多数据库类型应用以及种数据库类型多个数据库且数据;库数量可以动态增加应用);;;;;;;;1),DBConnectionPool.java;;数据库连接池类;;;;;;;;2),DBConnectionManager;.java;;数据库管理类;;;;;;;;3),DSConfigBean;.java;;;;;;;;;;;;;;;单个数据库连接信息Bean;;;;;;;;4),ParseDSConfig.java;;;;;;;;;;;;;;;操作多(这个'多'包括区别数据库和同种数据库有多个数据库);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;数据配置文件xml;;;;;;;;5),ds.config.xml;;;;;;;;;;;;;;;;;;;;;;;;;;数据库配置文件xml;;;;;;;;原代码如下:;;;;;;;;DBConnectionPool.java;;;;;;;;;----------------------------------------------------------;;;;;/**;*;数据库连接池类;*/packagecom.chunkyo.db;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.Timer;/**;*@authorchenyanlin;*;*/publicDBConnectionPoolimplementsTimerListener{;privateConnectioncon=null;;privateinUsed=0;;;;//使用连接数;privateArrayListfreeConnections=ArrayList;//容器空闲连接;privateminConn;;;;;//最小连接数;privatemaxConn;;;;;//最大连接;privateStringname;;;;;//连接池名字;privateStringpassword;//密码;privateStringurl;;;;;;//数据库连接地址;privateStringdriver;;;//驱动;privateStringuser;;;;;//用户名;publicTimertimer;;;;;;//定时;/**;*;*/;publicDBConnectionPool{;;//TODOAuto-generatedconstructorstub;};/**;*创建连接池;*@paramdriver;*@paramname;*@paramURL;*@paramuser;*@parampassword;*@parammaxConn;*/;publicDBConnectionPool(Stringname,Stringdriver,StringURL,Stringus
本文标题:Javajdbc数据库连接池总结
链接地址:https://www.777doc.com/doc-6437882 .html