`
22cgreen
  • 浏览: 53631 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

tomcat数据库连接池的研究

阅读更多
数据库连接池可能很多人一直不明白真正的作,也无法真实的体会其明显的作用,
很多初级开发者可能大我都是用完就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类型的。
0
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics