几种常用数据库连接池的使用

 

一、应用程序直接获取数据库连接的缺点

  用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。如下图所示:

  

几种常用数据库连接池的使用

二、使用数据库连接池优化程序性能

2.1、数据库连接池的基本概念

  数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。如下图所示:

  

几种常用数据库连接池的使用

       数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中, 这些数据库连接的数量是由最小数据库连接数来设定的.无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量.连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中.

       数据库连接池的最小连接数和最大连接数的设置要考虑到以下几个因素:

  1. 最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费.
  2. 最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作
  3. 如果最小连接数与最大连接数相差很大:那么最先连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接.不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,他将被放到连接池中等待重复使用或是空间超时后被释放.

2.2、编写数据库连接池

  编写连接池需实现java.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法:

  • Connection getConnection()
  • Connection getConnection(String username, String password)

  实现DataSource接口,并实现连接池功能的步骤:

  1. 在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中。
  2. 实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。
  3. 当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。Collection保证将自己返回到LinkedList中是此处编程的难点

 数据库连接池核心代码

  使用动态代理技术构建连接池中的connection

包结构:

几种常用数据库连接池的使用

 JdbcPool.java:

大致思路:1、读取配置文件,将属性值取出

                   2、注册jdbc驱动

                   3、通过数据库连接数和驱动管理器获得相应连接(.getConnection()),因为DataSource是接口,所以这个方法需要                           我们手动实现

                   4、重点:实现getConnection()方法

                          思考:当外部有连接需求时,直接从connectList拿出一个connect,就实现了这个方法,但是我们再想想,它用完了怎么回收呢,确实,有close()方法,但是这个方法作用是将这个连接还给数据库,而不是数据库连接池,这样会导致数据库连接池中 的连接越来越少,这样可不行,但是我们也不能影响它的正常使用吧,在这种情况下,我们想要监测这个连接对象的动态,在它调用close()方法时,我们将其再添加进connectList,这样连接池中的连接不就没少了吗,在java中对于监听一个对象的动态,最常用也最实用的便是动态代理,对于动态代理,其实我们可以把它想象成就是一个大盒子,里面装着一个真实对象小盒子,这就在大盒子和小盒子间形成了一个横切空隙,而真实做事的还是这个对象,代理只是个接活的,接到活就给内部的小盒子干,自然这个空隙可以用来监测真实对象的事务,也就是监听对象的方法。具体可以看看这个,动态代理:https://www.cnblogs.com/xdp-gacl/p/3971367.html

来源:孤傲的小狼

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年1月11日
下一篇 2019年1月11日

相关推荐