在我们平时开发中,使用数据库连接池时使用阿里的Druid连接池已经比较常见了,但是我们在集成到Springboot时似乎非常简单,只需要简单的配置即可使用,那么Druid是怎么加载的呢,本文就从源码层面进行揭秘
首先简单的介绍下如何使用
1、pom.xml加载jar包,直接使用集成springboot的jar
2、application.properties进行配置
主要配置参数就是初始化连接数和最大连接数,最大连接数一般不需要配置的太大,一般8核cpu使用8个线程就可以了,原因是8核cpu同时可以处理的线程数只有8,设置的太大反而会造成CPU时间片的频繁切换
初始化了一个DataSource,实现类是DruidDataSourceWrapper,这个DataSource就是我们jdk提供jdbc操作的一个很重要的接口
到这里DataSource已经初始化完成了
我们开始从使用的地方入手,我的项目是基于Mybatis查询数据库的,这里从Mybatis查询开始入手
我们都知道Mybatis查询最终必定会从mybatis的Executor的query开始执行
所以我们在BaseExecutor的query方法打上断点,果然进来了,然后我们继续看
我们只看核心代码,进入queryFromDatabase
继续跟
这里我们看到获取了一个Statement ,这个Statement 是我们java原生操作数据库的一个很重要的类,这个Statement 应该是需要从一个数据库连接(Connection)上获取的,这里就很重要了,所以我们就需要看在里面是怎么获取Connection的就可以了
继续
核心代码,获取Connection,进入了SpringManagedTransaction的getConnection方法
继续
核心代码处,这个this.dataSource就是我们一开始通过自动装配初始化的。
DataSourceUtils这个类是spring提供的,也就是最终数据源的策略是通过spring提供的扩展机制,实现不同的dataSource来实现不同功能的
继续
继续
这里的核心代码1也很重要的,这里我们后续再看
继续看dataSource_connect
继续,进入了StatFilter的dataSource_getConnection
继续,然后又回到了FilterChainImpl的dataSource_connect
这个时候走了下面这个方法
核心代码1处获取了一个DruidConnectionHolder,DruidConnectionHolder里面有个关键的成员变量,就是我们的连接Connection
这里的decrementPoolingCount就是把一个int的变量poolingCount-1,然后在connections数组里面取某一个Connection
这里就已经看到核心代码了,connections就是我们的线程池了,是一个数组类型,里面存放了我们需要的连接,依靠一个指针poolingCount来控制当前应该可以取哪一个下标的Connection
接下来再看下之前没看的init
核心代码1,初始化了一个最大连接数的数组
核心代码2,初始化初始连接数数量的线程池连接
到这里,核心代码就全部看完了,本文是从Mybatis查询开始看代码的,实际上核心代码可以直接从DataSource的getConnection方法开始看
Druid连接池的核心功能主要就是注册一个DataSource的bean,连接池、获取连接等都依赖于DataSource的实现类DruidDataSourceWrapper,连接池功能主要是维护了一个数组,在项目启动时提前创建了一些数据库连接放到了里面复用
参考:https://blog.csdn.net/_/article/details/
到此这篇druid数据库连接池(druid数据库连接池原理)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sjkxydsj/72278.html