druid1.2.8源码阅读:第二天

druid1.2.8源码阅读:第二天

一、问题

我在想如果我要开发一个数据源连接池,我会怎么做。简单的JDBC要经历如下步骤:

  • 第一步:加载数据库驱动;
  • 第二步:建立数据库连接;
  • 第三步:通过Statement执行SQL;
  • 第四步:从RestSet中获取返回结果;

二、当new DruidDataSource()时,在执行什么

调用父类DruidAbstractDataSource的构造函数

首先,初始化参数

// 默认参数
// 默认自定提交打开
protected volatile boolean defaultAutoCommit = true;
// 初始化大小为0
protected volatile int initialSize  = DEFAULT_INITIAL_SIZE;
// 最大活跃数位0
protected volatile int maxActive = DEFAULT_MAX_ACTIVE_SIZE;
// 最小空闲连接数 0
protected volatile int minIdle = DEFAULT_MIN_IDLE;
// 最大空闲连接数 8
protected volatile int maxIdle = DEFAULT_MAX_IDLE;
// 最大等待毫秒数:-1,无限长。超过这个时间就报错
protected volatile long maxWait = DEFAULT_MAX_WAIT;
// 拿链接失败重试的次数
protected int notFullTimeoutRetryCount = 0;
// 用于验证的查询语句:默认为null
protected volatile String validationQuery = DEFAULT_VALIDATION_QUERY;
// 验证语句查询超时时间:默认无限长
protected volatile int validationQueryTimeout = -1;
// 从连接池获取申请链接时,连接池判断这连接是否是可用的。默认为false
protected volatile boolean testOnBorrow = DEFAULT_TEST_ON_BORROW;
// 使用完连接,连接池回收的时候判断该连接是否可用。默认为false
protected volatile boolean testOnReturn = DEFAULT_TEST_ON_RETURN;
// 从连接池申请连接时,如果testOnBorrow=false,验证是否为空闲连接,如果是验证连接是否可用。默认为false
protected volatile boolean testWhileIdle = DEFAULT_WHILE_IDLE;
// 是否缓存游标,对支持游标的数据库性能提升巨大。默认为false
protected volatile boolean poolPreparedStatements = false;
// 是否缓存preparedStatement, 也就是PSCache,默认为false
protected volatile boolean sharePreparedStatements = false;
// 每个连接上PSCache的大小
protected volatile int maxPoolPreparedStatementPerConnectionSize = 10;
//
protected volatile boolean inited = false;
//
protected volatile boolean initExceptionThrow = true;
private boolean clearFiltersEnable = true;
// 驱动
protected Driver driver;
// 执行查询的超时时间(秒)
protected volatile int queryTimeout;
// 执行一个事务的超时时间(秒)
protected volatile int transactionQueryTimeout;
// 
protected long createTimespan;
// 最大等待线程,默认不限个数
protected volatile int maxWaitThreadCount = -1;
// 
protected volatile boolean accessToUnderlyingConnectionAllowed = true;
// 作为DestroyTask执行的时间周期, 默认60s。如果连接数大于minIdle,则关闭多余的,如果小于minIdle,则创建
protected volatile long timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
//  每次检查多少个连接
protected volatile int numTestsPerEvictionRun = DEFAULT_NUM_TESTS_PER_EVICTION_RUN;
// 空闲线程逐出线程池时间,默认30分钟
protected volatile long minEvictableIdleTimeMillis = DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
// 当连接池中连接个数小于minIdle,这些线程空闲多久关闭。默认7小时
protected volatile long maxEvictableIdleTimeMillis = DEFAULT_MAX_EVICTABLE_IDLE_TIME_MILLIS;

// 当连接的空闲时间大于keepAliveBetweenTimeMillis(默认2分钟),但是小于minEvictableIdleTimeMillis(默认30分钟),Druid会通过调用validationQuery保持该连接的有效性。
//当连接空闲时间大于minEvictableIdleTimeMillis,Druid会直接将该连接关闭,keepAlive会无效。
protected volatile long keepAliveBetweenTimeMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS * 2;
// 物理连接超时时间,默认-1
protected volatile long phyTimeoutMillis = DEFAULT_PHY_TIMEOUT_MILLIS;
// 物理连接最大使用数量
protected volatile long phyMaxUseCount = -1;
// 默认创建一个 非公平的锁: 不保证先来的线程先得到锁
protected ReentrantLock lock = new ReentrantLock(lockFair);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值