
Druid
文章平均质量分 55
hellboy0621
怕什么真理无穷,进一寸有一寸的欢喜。
展开
-
【Druid源码阅读】11. 小结
今天总结下,前几天分析的 Druid 源码。由于每天可投入的有效时间有限,只把 Druid 最基本的流程大概看了下,但还是有些疑惑点的。最重要的就是获取连接方法中的初始化方法 init(),连接对象保存在3个数组中,后续创建和销毁线层都是通过操作这3个数组来完成的。再有就是可重入锁 lock,以及可重入锁上的2个条件empty 和notEmpty。用来控制线程池中如果连接数已经达到最大连接数时,线程阻塞,不再创建新的连接; 如果连接池中没有可用连接时,阻塞,并且通知创建线程恢复,...原创 2022-05-21 01:43:59 · 229 阅读 · 0 评论 -
【Druid源码阅读】10. 过滤器工作原理
昨天以 StatFilter 分析了责任链模式,今天还以 StatFilter 来举例。StatFilter 就是用来统计数据,用来支撑 Druid 监控的。其实大概看一下 StatFilter 的结构,可以看到有很多 public 方法,第一个参数是 FilterChain,并且代码实现都是使用调用过滤器的同名方法,过滤方法有很多,除了昨天介绍的 dataSource_getConnection,再举个例子:@Overridepublic void connection_commi原创 2022-05-19 23:59:28 · 462 阅读 · 0 评论 -
【Druid源码阅读】9. 过滤器
在前面几天获取连接的代码中,经常会看到 filters 这个属性,今天一起来看下过滤器是如何工作的。找一个单侧,把里面连接串和用户名密码改成自己的:src/test/java/com/alibaba/druid/pool/Case0.java设置 stat 过滤器里面有一行代码,就是设置过滤器的:dataSource.setFilters("stat");public void setFilters(String filters) throws SQLException {原创 2022-05-19 00:45:10 · 1319 阅读 · 0 评论 -
【Druid源码阅读】8. 对于连接的管理
目录testOnBorrowtestWhileIdletestOnReturn结论第6篇中,分析了如何获取连接,那获取连接后,Druid 是如何管理这些连接的呢?可以先给结论,是通过几个关键参数来控制的testOnBorrowtestOnReturntestWhileIdletestOnBorrow首先看 testOnBorrow,从字面理解,是从连接池中获取连接时,要测试连接是否可用。下面是代码中使用这个属性的几处地方:1179 和 1193 行,原创 2022-05-19 22:20:43 · 581 阅读 · 0 评论 -
【Druid源码阅读】7. 驱动加载
在初始化 init() 方法中,可以看到2处关于 java.sql.Driver 驱动的方法:// bug fixed for dead lock, for issue #2980DruidDriver.getInstance();resolveDriver();先来看第1处,看注释是为了解决一个bug而增加的,主要解决了多线程死锁的问题,issue 链接:https://github.com/alibaba/druid/issues/2980DruidDriver 类的 static原创 2022-05-17 01:47:17 · 502 阅读 · 0 评论 -
【Druid源码阅读】5. 创建并运行销毁连接线程:createAndStartDestroyThread()
上一篇分析了创建连接线程,今天来看下销毁连接线程。1. 2种方式执行destroyTask 中封装的逻辑分2种情况,取决于使用者有没有在初始化连接池前设置destroyScheduler:protected void createAndStartDestroyThread() { // 这里创建真正销毁连接的任务 destroyTask = new DestroyTask(); // 如果在初始化连接池之前设置了销毁连接的定时执行器 destroySchedule..原创 2022-05-15 01:00:55 · 423 阅读 · 0 评论 -
【Druid源码阅读】6. 初始化后获取连接
前几天把 init 初始化方法大概分析了下,今天继续,把获取连接的部分分析完。public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException { init(); if (filters.size() > 0) { FilterChainImpl filterChain = new FilterChainImpl(this); return fil原创 2022-05-14 00:09:59 · 324 阅读 · 0 评论 -
【Druid源码阅读】4. 创建并运行创建连接线程:createAndStartCreatorThread()
现在我们来一起看下 创建并运行创建连接线程:createAndStartCreatorThread();protected void createAndStartCreatorThread() { // 只有在创建执行器没有设置时,才会创建创建连接线程 if (createScheduler == null) { String threadName = "Druid-ConnectionPool-Create-" + System.identityHashCode(..原创 2022-05-13 00:36:24 · 634 阅读 · 0 评论 -
【Druid源码阅读】3. 初始化连接之同步创建连接
书接上文,异步创建连接需要设置参数,如果不设置参数,使用默认配置,会进到同步创建连接的分支。if (createScheduler != null && asyncInit) { // 异步 for (int i = 0; i < initialSize; ++i) { submitCreateTask(true); }} else if (!asyncInit) { // 同步 // init connections..原创 2022-05-12 23:22:10 · 220 阅读 · 0 评论 -
【Druid源码阅读】2. 初始化连接之异步创建连接
今天就连着昨天的思路,来看下连接到底是如何初始化的。第14步: 初始化连接,数量为设置的初始连接数,并存放到数组中;(真正创建连接在这一步中)if (createScheduler != null && asyncInit) { // 异步 for (int i = 0; i < initialSize; ++i) { submitCreateTask(true); }} else if (!asyncInit) { //..原创 2022-05-12 01:04:07 · 1633 阅读 · 0 评论 -
【Druid源码阅读】1. 初识Druid
Druid源码阅读原创 2022-05-11 01:38:55 · 1399 阅读 · 0 评论