设为首页 收藏本站
查看: 446|回复: 0

[经验分享] tomcat数据库连接池的研究

[复制链接]

尚未签到

发表于 2017-2-1 09:41:14 | 显示全部楼层 |阅读模式
数据库连接池可能很多人一直不明白真正的作,也无法真实的体会其明显的作用,
很多初级开发者可能大我都是用完就close了,要用时就打开,这是否对小的应用来说
用不用连接池效果不是很明显,还有一点就是初级开发者常常不记得关闭连接,使得
数据库服务器被连接占满,同时连接池因设定了最大连接数,而可能使得超过了连接时
数据库无法使用。有可能很多开发者因为以前用asp,php,vb等的原因,好像不关闭连接也没什么影响
但在J2EE中,数据库连接不关闭后果很严重。
  我们来看看数据连接耗时操作。
  1)分析URL连接参数,包括协议、IP地址、端口等的分析与验证。并分板URL成为参数,如把协议,DATABSE,userName,passWord等从中分出来放入Hashtable中
  2)注删及加载驱动
  3)在注册的驱动列表中查找能使用的驱动,一般驱动管理员会一个个驱动去试,驱动通过分析URL是否为自己URL。如果是返回true
  4)驱动用传入的参数实例化继承自Connection的对象,产生Connection实例。
  5)和URL指定的数据库服务器进行SOCKET连接,进行网络数据传输握手。
  6)登录数据库服务器,创建statement及resultSet,并设置语言环境及数据格式.
  7)完成初台化工作,返回Connection对象。
  
  很显然一次连接要做上面主要的7个部分的操作,部分操作还比较耗时。当然测试中发现一段建立一个连接的耗时为几百毫秒,快时也有几十毫秒。
  频率比较少的访问问题不大,但是访问量很大时,耗时就非常明显,大测试发现用连接池去执行sql语句几乎不耗时间的。
  
  连接是不是必需的,只是在访问量比较大时确实能省很多的时间,提高效率,但在访问题很少的情况下,也能提高数据的操作效率,同时节省数据库
  的连接开销。
  
  那么连接池怎么实现的呢?连接池的最少应实现那些功能。
  1)连接在使用后不应马上关闭,可能后面其它程式还要使用。
  2)保留一个最小活动连接,使其程式不需要在建立连接时消耗时间,活动连接,可以在初始化时首先建立,也可以在连接中回收。
  3)最大连接数,连接池中的连接最大不超过这个数,这样做也是避免把数据连接耗完,通常这样的问题是因为程式没有写好的原因。
  4)处理超时连接,也就是连接超过多长时间被认为过期,然后从连接池中清除。
  5)重写Connection的close方法,因为哪不重写,将会使用户使用close方法时真正关闭连接,而不是放入连接池。
  
  其实连接池也比较简单,主要是实现上面几个需求。如tomcat的连接池实现类就是为:
  org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
  
  因此连接池的逻辑为:
  1)取连接时,先到连接池中找,如果没有空闭的连接,而又没有超过最大连接数,建一个新的连接。
   如果超过了抛出异常。
  2)得到连接后,连接池减少1
  3)使用完后如果连接池没有超过最大连接数放入连接池,超过直接关闭。
  4)如果加入连接池的连接,连接池计数+1
  5)时间监听连接是否超时,如果超时将关闭,从连接池中-1,直到最后只有最少的活动连接数。
  
  这里我们有一个问题,连接池是怎么知道连接是否超过最大连接呢,有些连接在使用,他们在连接池中并没有计数,也就是说他们取出后计数器
  就-1了。,事实上我们可以用另一个记录正在使用的连接,如果用完就从中-1,也可以不去管在使用的连接,我们只用去管空闭的连接就行。
  应该我们设置连接池的最大连接数应是指空闭的最大连接数,而并非空闭连接数+正在使用的连接数。
  
  还要注意的一点是,连接池的列表应常驻内存,不然用完了就退出内存了,那前池子又要重建立,因此存入连接的对象应是static类型的。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-336000-1-1.html 上篇帖子: TOMCAT中连接池的配置 下篇帖子: JMX在Tomcat中的应用(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表