相比传统的数据连接而言,每次使用Connection 连接数据库时(增删查改)每次都会调用new一个连接对象,去访问数据库,而Connection对象的每次使用,在调用close()方法时,这时候的connection 它只是处于一种关闭的状态,实际而言,他还是存在与内存当中的,这样当我们的业务需求量大大增加时,这样会很耗费我们客户端的内存资源。
而数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数。
当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中(你可以想象一下,当我们打10086时,我们就是相当与调用连接池的connection对象,而超过一定人数时,我们就听到提示音:请稍后。。正在为您接通。。)。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:
1. 最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
2. 最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作
3. 最小连接数与最大连接数差距:最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
那么如何使用连接池呢?以mysql为例
第一步:配置context.xml文件,在Tomcat conf 文件的context.xml编写如下代码
<Resource name="jdbc/amilsms" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="20" maxWait="10000" username="root"
password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/amilsms?useUnicode=true&characterEncoding=UTF-8"/>
name:标识Resource的JBDI名字
auth:指定管理Resource的Manager
maxActive:最大连接数,
maxIdle 最小连接数
maxWait,数据库连接处于空闲状态的最长时间,超过则抛出异常,所需要等待的时间毫秒为单位
username:连接数据库的用户名
password:连接数据库的密码
driverClassName:数据库驱动类型
url:连接地址
第二步:配置完context.xml文件之后,然后就需要配置web项目中WEB-INF的web.xml文件
<resource-ref>
<description>news DataSource</description>
<res-ref-name>连接的数据库名</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
第三步:加载数据库驱动
第四步:再编写BaseDao用于获取数据库连接的方法
1.获取Context.xml 配置文件
Context tx=new InitialContext();
2.再使用lookup() 方法查找数据源获得数据库信息
DataSource ds=(DataSource ) ct.lookup("java:comp/env/数据库名");
3.获取连接对象
Connection con=ds.getConnection();
在配置数据连接池,比较容易犯的几个错误
1.配置context.xml文件和web.xml配置项目文件连接的数据库名不一致
2.配置完数据连接池之后,在创建servlet 时自动生成的web.xml,节点生成发生错误
3.找不到驱动程序,把驱动复制到项目文件中,在重新生成