2021SC@SDUSC
连接池是什么
在系统启动时或者在getConnection,创建若干连接,放到连接池里(durid里本质上是用hashMap存的,key是DuridPooledConnection),对连接进行一个复用
一次数据库的连接要经历那些过程?
为什么要用连接池
因为连接是可以复用,没必要每次运行sql前创建,运行完SQL后就关闭
复用连接能减少频繁创建和销毁连接带来的开销,增加程序运行的效率
druid连接池中管理连接池的常用参数
initialSize | 0 | 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 |
maxActive | 8 | 最大连接池数量 |
maxIdle | 8 | 已经不再使用,配置了也没效果 |
minIdle | 最小连接池数量 | |
maxWait | 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁 |
线程从连接池里获取连接,如果有空闲连接,就取走,如果没有并且没有超过最大连接数,就新建一个连接,如果不能新建,则等待一定的时间,如果还是获取不到,就重试若干次,还是获取不到就报错了。
druid里有定时任务专门去清理那些空闲的连接,如果连接空闲超过一定的时间,并且剩余连接minIdle就释放那些空闲的连接。
druid因为使用hashmap存的,就没有连接归还给连接池这个操作
应用了责任链模式
getConnection()
getConnection()->getConnection(this.maxWait)0>this.getConnectionDirect(maxWaitMillis);