什么是连接池?

数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放

配置缺省值说明性能优化备注
namenull配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this). 另外配置此属性至少在1.0.5版本中是不起作用的,强行设置name会出错。详情-点此处。//
urlnull连接数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto//
usernamenull连接数据库的用户名//
passwordnull连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里//
driverClassName根据url自动识别这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName//
initialSize 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时可以配置和maxActive相同数量/
maxActive8最大连接池数量//
maxIdle8已经不再使用,配置了也没效果//
minIdlenull最小连接池数量建议配置和maxActive相同数量/
maxWaitnull获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。//
dataSouce.setUseUnfairLock(true)配置了maxWait之后,缺省启用公平锁,并发效率会有所下降//
poolPreparedStatementsfalse是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。oracle下可以配置/
maxPoolPreparedStatementPerConnectionSize-1要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100oracle下可以配置/
validationQuerynull用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。//
validationQueryTimeoutnull单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法//
testOnBorrowtrue申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。不建议配置/
testOnReturnfalse归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。不建议配置/
testWhileIdlefalse建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。建议取代testOnBorrow和testOnReturn,其会影响获取db连接时的性能配合testWhileIdle=true 和timeBetweenEvictionRunsMillis来优化,无需在每次借用和归还连接时检测连接可用性,而是定期在连接空闲时进行检测,减少性能损耗
keepAlivefalse (1.0.28)连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。//
defualtAutoCommittrue事务自动提交
timeBetweenEvictionRunsMillis1分钟(1.0.14)有两个含义: 1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明//
numTestsPerEvictionRun30分钟(1.0.14)不再使用,一个DruidDataSource只支持一个EvictionRun//
minEvictableIdleTimeMillis连接保持空闲而不被驱逐的最小时间//
connectionInitSqls物理连接初始化的时候执行的sql//
exceptionSorter根据dbType自动识别当数据库抛出一些不可恢复的异常时,抛弃连接//
filtersnull属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall//
proxyFiltersnull类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系//
removeAbandonedfalse配置removeAbandoned对性能会有一些影响,建议怀疑存在泄漏之后再打开。在上面的配置中,如果连接超过30分钟未关闭,就会被强行回收,并且日志记录连接申请时的调用堆栈/如果开启此配置,默认会打印堆栈信息,对性能影响较大

数据库连接池技术的优点

资源重用

由于数据库连接得以重用,避免了频繁创建、释放数据库连接引起的大量性能开销。在减少系统消耗的基础上,增加了系统运行环境的平稳性。

更快的系统反应速度

数据库连接池在初始化过程中,已经创建了若干数据库连接置于连接池中备用,此时连接的初始化工作已经完成。对于业务请求而言,直接利用已有的连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间。

新的资源分配手段

对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据资源。

统一的连接管理,避免数据库连接泄露

在较为完善的数据库连接池实现中,可根据预先设定的占用超时设定,强制回收被占用连接,从而避免了传统数据库连接操作中可能出现的资源泄露。

原理

  1. 装载数据库驱动程序;
  2. 通过JDBC建立数据库连接;
  3. 访问数据库,执行SQL语句
  4. 断开数据库连接。

连接池机制

  1. 程序初始化时创建连接池
  2. 使用时向连接池申请可用连接
  3. 使用完毕,将连接返还给连接池
  4. 程序退出时,断开所有连接,并释放资源

配置连接池

1、在tomcat源文件中打开conf目录

tomcat目录

2、选择context.xml文件右键进行选择打开方式

打开进行编辑

3、在Context标签内进行配置

配置连接池

    <!--配置数据连接池-->
    <Resource name="jdbc/microblog" auth="Container" type="javax.sql.DataSource"
              url="jdbc:mysql://127.0.0.1:3306/microblog?useUnicode=true&amp;characterEncoding=utf-8"
              driverClassName="com.mysql.jdbc.Driver"
              username="root"
              password="123456"
              maxTotal="100" maxIdle="10" maxWaitMillis="60000"
    />

测试

配置context.xml

   <!--配置数据连接池-->
    <Resource name="jdbc/microblog" auth="Container" type="javax.sql.DataSource"
              url="jdbc:mysql://127.0.0.1:3306/microblog?useUnicode=true&amp;characterEncoding=utf-8"
              driverClassName="com.mysql.jdbc.Driver"
              username="root"
              password="123456"
              maxTotal="100" maxIdle="10" maxWaitMillis="60000"
    />

BseDao

package dao;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class BaseDao {
    public Connection getConnection() {
        try {
            Context ctx = new InitialContext();
            DataSource dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/microblog");
            return dataSource.getConnection();

        } catch (NamingException | SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

JSP

<%
  BaseDao baseDao = new BaseDao();
  Connection connection = baseDao.getConnection();
  out.println(connection);
%>
最后修改:2023 年 02 月 14 日
如果觉得我的文章对你有用,请随意赞赏