这是Java极客技术第312篇原创文章你好~各位读者新年快乐,我是鸭血粉(大家会亲切的叫我“粉”),我是一名程序员喜欢吃鸭血的粉丝!回想前几天springboot项目部署到主线上的时候,线上环境需要jdk7,但是项目是基于jdk8开发的,而且springboot还用了springboot2以上的版本,可以说是修复了需要一整天完成能满足线上环境的代码。当然,做完之后,还需要稍微了解一下它背后的秘密。好了,废话不多说,开门见山。其实切换也不算太麻烦。坑就是坑。从SpringBoot2切换到SpringBoot1后,默认的连接池发生了变化。之前做的压力测试又做了一遍。人很多,所以我自己可以总结为:虽然我知道怎么用,但是没看懂技术背后的道理,乌龙了。下面我们一起看看SpringBoot2和SpringBoot1默认使用的数据源吧!1、SpringBoot2的HikariCP首先需要在pom文件中引入依赖包:org.springframework.bootspring-boot-starter-parent2.0.4.RELEASEUTF-8UTF-81.81.3.1org.springframework.bootspring-boot-starterorg.springframework.bootspring-boot-starter-web复制代码artifactId>mysqlmysql-connector-javaorg.mybatis.spring.bootmybatis-spring-boot-starter<版本>${mybatis.spring.boot.version}org.projectlomboklombokfollowedby在配置文件中需要定义以下属性(不定义会自动使用默认值)zaxxer.hikari.HikariDataSourcehikari:minimum-idle:5maximum-pool-size:15connection-test-query:SELECT1max-lifetime:1800000connection-timeout:30000pool-name:Datebook配置好HikariCP后,可以看到类似这样的打印信息它成功启动:2020-01-1616:23:12.911INFO9996---[main]o.s.j.e.a.AnnotationMBeanExporter:RegisteringbeansforJMXexposureonstartup2020-01-1616:23:12.913INFO9996---[main]o.s.j.e.a.AnnotationMBeanExporter:Beanwithname'data'source'已自动检测到JMXexposure2020-01-1616:23:12.924INFO9996---[main]o.s.j.e.a.AnnotationMBeanExporter:LocatedMBean'dataSource':registeringwithJMXserverasMBean[com.zaxxer.hikari:name=dataSource,type=HikariDataSource:2]212.994-INFO9996--[main]o.s.b.w.embedded.tomcat.TomcatWebServer:Tomcatstartedonport(s):18001(http)withcontextpath''2020-01-1616:23:13.002INFO9996---[main]c.j.mmzsblog.DatasourceTestApplication:StartedDatasourceTestApplication:StartedDatasourceTestApplication724seconds(JVMrunningfor8.883)第三行[com.zaxxer.hikari:name=dataSource,type=HikariDataSource]这部分指出了使用的连接池类型。2、SpringBoot1的tomcat-jdbc版本降级后,没看到上面的信息打印出来,差点不知道用的是什么连接池,网上说的是tomcat-jdbc;但我相信眼见为实,一定要在某个地方打印出来才能放心,所以我进行了如下操作:创建了一个controller来简单打印连接池信息(){System.out.println("查询到的数据源连接池信息为:"+dataSource);System.out.println("查询到的数据源连接池类型为:"+dataSource.getClass());System.out.println("查询到的数据源连接池名称为:"+dataSource.getPoolProperties().getName());}}然后看到如下打印信息,真是的tomcat-jdbc查询到的数据源连接池信息为:org.apache.tomcat.jdbc.pool.DataSource@181d8899{ConnectionPool[defaultAutoCommit=null;defaultReadOnly=null;defaultTransactionIsolation=-1;defaultCatalog=null;driverClassName=com.mysql.jdbc.Driver;maxActive=100;maxIdle=100;minIdle=10;initialSize=10;maxWait=30000;testOnBorrow=true;testOnReturn=false;timeBetweenEvictionRunsMillis=5000;numTestsPerEvictionRun=0;minEvictableIdleTimeMillis=60hiIdletest=W=60000;;testOnConnect=false;密码=********;url=jdbc:mysql://localhost:3306/xxxxxx;用户名=xxxx;validationQuery=SELECT1;validationQueryTimeout=-1;validatorClassName=null;validationInterval=3000;accessToUnderlyingConnectionAllowed=true;removeAbandoned=false;removeAbandonedTimeout=60;logAbandoned=false;connectionProperties=null;initSQL=null;jdbcInterceptors=null;jmxEnabled=true;fairQueue=true;useEquals=true;abandonWhenPercentageFull=0;maxAge=0;useLock=false;dataSource=null;dataSourceJNDI=null;suspectTimeout=0;alternateUsernameAllowed=false;commitOnReturn=false;rollbackOnReturn=false;useDisposableConnectionFacade=true;logValidationStateErrors=false;propagateInterrule;ignoreExceptionOnPreLoad=false;useStatementFacade=true;}查询的数据源连接池类型为:classorg.apache.tomcat.jdbc.pool.DataSource查询的数据源连接池名称为:TomcatConnectionPool[1-1715657818]其实,我们从pom文件也可以看出门道:org.springframework.bootspring-boot-starter-jdbc依赖这个在该文件的依赖实际上表明SpringBoot1使用的是tomcat-jdbc连接池。现在知道SpringBoot2.0和SpringBoot1.0默认使用的数据库是不一样的。现在原因找到了,但是怎么解决呢?或者修改SpringBoot1版本的默认连接池与SpringBoot2版本相同。好吧,如果你有想法,那就去做吧。其实HikariCP连接池在SpringBoot1版本也可以使用。操作是:先引入默认配置数据源排除tomcat-jdbcorg.springframework.bootspring-boot-starter-jdbcorg.apachetomcat-jdbc/exclusion>com.zaxxerHikariCP3.3.1然后在.yml文件中配置HikariCP数据源的相关信息#spring相关配置spring:#数据源配置datasource:#连接池配置type:com.zaxxer.hikari.HikariDataSourcehikari:minimum-idle:5maximum-pool-size:15connection-test-query:SELECT1max-lifetime:1800000connection-timeout:30000为什么要切换数据源为defaul呢SpringBoot2.0使用的t数据源?因为我用的是SpringBoot1.0的tomcat-jdbc数据源,怕压力测试达不到要求。真是个好人)所以我做了上面的替换,但这样做肯定有好处。优势在于HikariCP令人着迷的优势:1.字节码级优化(很多方法由JavaAssist生成)2.大量小改进使用FastStatementList代替ArrayList无锁集合ConcurrentBag代理类优化(例如使用invokestatic而不是invokevirtual)as官网的对比图显示一样:速度更快。其实如果一开始就用第三方数据库,那岂不是就没有自己搞的飞蛾扑火了!比如阿里巴巴的Druid连接池是不是一个优秀的产品?它有多好?你先看看它的用途:3.其他连接池(如:Druid)3.1、SpringBoot1.0指的是Druid,之前的SpringBoot1.0指的是HikariCP,先把默认数据源tomcat-jdbc排除掉,再参考要使用3.1.1的连接池,首先导入默认配置的数据源并排除tomcat-jdbcorg.springframework.bootspring-boot-starter-jdbcorg.apachetomcat-jdbccom.alibabadruid-spring-boot-starter1.1.10依赖>com.alibabadruid1.0.313.1.2,然后在.yml文件中配置Druid数据源信息spring:#数据源配置datasource:#连接池配置type:com.alibaba.druid.pool.DruidDataSourcedruid:initial-size:5max-active:10min-idle:5max-wait:30000pool-prepared-statements:truemax-pool-prepared-statement-per-connection-size:20validation-query:SELECT1FROMDUALvalidation-query-timeout:60000test-on-borrow:falsetest-on-return:falsetest-while-idle:truetime-between-eviction-runs-millis:60000min-evictable-idle-time-millis:1000003.1.3,再写一个配置类加载数据源@Configuration@ConditionalOnClass(DruidDataSource.class)@ConditionalOnProperty(name="spring.datasource.type",havingValue="com.alibaba.druid.pool.DruidDataSource",matchIfMissing=true)publicclassDataSourceConfig{@Bean@ConfigurationProperties("spring.datasource.druid")publicDataSourcedataSourceOne(){returnDruidDataSourceBuilder.create().build();}}3.1.4、启动效果:2020-01-1716:59:32.804INFO8520---[main]o.s.j.e.a.AnnotationMBeanExporter:RegisteringbeansforJMXexposureonstartup2020-01-1716:59:32.806-INFO8520-[main]o.s.j.e.a.AnnotationMBeanExporter:Beanwithname'dataSourceOne'hasbeenautodetectedforJMXexposure2020-01-1716:59:32.808INFO8520---[main]o.s.j.e.a.AnnotationMBeanExporter:Beanwithname'statFilter'hasbeenautodetectedforJMXexposure2020-01-1716:59:32.818INFO8520---[main]o.s.j.e.a.AnnotationMBeanExporter:LocatedMBean'dataSourceOne':registeringwithJMXserverasMBean[com.alibaba.druid.spring.boot.autoconfigure:name=dataSourceOne,type=DruidDataSourceWrapper]2020-01-1716:59:32.822INFO8520---[主要]o.s.j.e.a.AnnotationMBeanExporter'statFilter':registeringwithJMXserverasMBean[com.alibaba.druid.filter.stat:name=statFilter,type=StatFilter]2020-01-1716:59:32.932INFO8520---[main]s.b.c.e.t.TomcatEmbeddedServletContainer:Tomcatstartedonport(s):18001(HTTP)2020-01-1716:59:32.943INFO8520---[main]c.j.mmzsblog.DatasourceTestApplication:3.2、SpringBoot2.0中引用的Druid类似于SpringBoot2.0中Druid的引入和SpringBoot1.0中的引入;3.2.1、不需要排除默认配置的数据源,直接导入Druid数据源com.alibabadruid-spring-boot-starter<版本>1.1.10com.alibabadruid1.0.313.2.2、.yml文件中配置的Druid数据源的相关信息同3.1.33.2.3,然后写一个配置类加载数据源同3.1.33.2.4,启动后也可以看到类似的打印信息LocatedMBean'dataSourceOne':registeringwithJMXserverasMBean[com.alibaba.druid.spring.boot.autoconfigure:name=dataSourceOne,type=DruidDataSourceWrapper]3.3。优秀在哪里?看完上面的用法,是不是超级简单,没用?首先我们来看一下druid官网给出的几种传统连接池的对比:从上表可以看出,Druid的连接池在性能、监控、诊断、安全、扩展性等方面都远超竞品。druid官网是这样介绍的:?Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控功能不影响性能。功能强大,可以防止SQL注入,内置Logging可以诊断Hack应用程序行为。?所以,阿粉,我纠结了这么久,我想明白一件事。以后用阿里爸爸的德鲁伊连池。接入简单,自带监控,经过阿里巴巴各大系统测试。产品值得信赖,省事省心。