新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇文章给大家分享的是有关SpringBoot中的连接池有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
成都创新互联公司是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的十载时间我们累计服务了上千家以及全国政企客户,如三轮搅拌车等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致夸奖。一、SpringBoot2的HikariCP
首先在pom文件中需要引入的依赖包:
org.springframework.boot spring-boot-starter-parent 2.0.4.RELEASE UTF-8 UTF-8 1.8 1.3.1 org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-web mysql mysql-connector-java org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis.spring.boot.version} org.projectlombok lombok
其次在配置文件中需要定义如下属性(不定义时会自动使用默认值)
# spring的相关配置 spring: application: name: HikariCP测试 # 数据源的配置 datasource: # 连接池的配置 type: com.zaxxer.hikari.HikariDataSource hikari: minimum-idle: 5 maximum-pool-size: 15 connection-test-query: SELECT 1 max-lifetime: 1800000 connection-timeout: 30000 pool-name: DatebookHikariCP
配置好后,启动成功时你能看到类似这样子的打印信息:
2020-01-16 16:23:12.911 INFO 9996 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2020-01-16 16:23:12.913 INFO 9996 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'dataSource' has been autodetected for JMX exposure
2020-01-16 16:23:12.924 INFO 9996 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'dataSource': registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
2020-01-16 16:23:12.994 INFO 9996 --- [ main ] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 18001 (http) with context path ''
2020-01-16 16:23:13.002 INFO 9996 --- [ main ] c.j.mmzsblog.DatasourceTestApplication : Started DatasourceTestApplication in 6.724 seconds (JVM running for 8.883)
其中第3行[com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
这部分就点明了使用的连接池类型
降低版本后,我没有看到上面的信息打印,一时差点不知道使用了什么连接池,不过网上都说是tomcat-jdbc;但是相信眼见为实的我,肯定要在哪里打印一下才放心,于是乎,我进行了如下操作:
搞了一个controller来简单的打印一下连接池的信息
@RestController public class testController { @Resource private DataSource dataSource; @GetMapping("/query") public void query(){ 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=60000; testWhileIdle=false; testOnConnect=false; password=********; url=jdbc:mysql://localhost:3306/xxxxxx; username=xxxx; validationQuery=SELECT 1; 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; logValidationErrors=false; propagateInterruptState=false; ignoreExceptionOnPreLoad=false; useStatementFacade=true; }
查询到的数据源连接池类型是:class org.apache.tomcat.jdbc.pool.DataSource
查询到的数据源连接池名字是:Tomcat Connection Pool[1-1715657818]
其实,我们从pom文件也能看出其中的门道:
org.springframework.boot spring-boot-starter-jdbc
依赖文件中的这一个依赖其实就是表明了SpringBoot1使用的是tomcat-jdbc连接池。
哎,现在才知道SpringBoot2.0和SpringBoot1.0版本使用的默认数据库是不一样的。
现在原因是找到了,可是如何解决呢?要不然把SpringBoot1版本的默认连接池修改成和SpringBoot2版本的一样。好,有了想法,那就开干。
其实,在SpringBoot1的版本也是可以使用HikariCP连接池的,操作就是:
首先引入默认配置的数据源处排除掉tomcat-jdbc
org.springframework.boot spring-boot-starter-jdbc org.apache tomcat-jdbc com.zaxxer HikariCP 3.3.1
再在.yml文件中配置HikariCP数据源的相关信息
# spring的相关配置 spring: # 数据源的配置 datasource: # 连接池的配置 type: com.zaxxer.hikari.HikariDataSource hikari: minimum-idle: 5 maximum-pool-size: 15 connection-test-query: SELECT 1 max-lifetime: 1800000 connection-timeout: 30000
为什么说我此处要将数据源切换成SpringBoot2.0使用的默认数据源呢?因为使用SpringBoot1.0的tomcat-jdbc数据源我怕压力测试出来达不到要求,为了不给测试增加工作压力(小编我就是这么好的一个人)
所以我进行了上面的替换操作。
不过这样做肯定也是有好处的。好处就在于HikariCP那迷人的优势:
1、字节码级别优化(很多方法通过JavaAssist生成)
2、大量小改进
用FastStatementList代替ArrayList
无锁集合ConcurrentBag
代理类的优化(比如:,用invokestatic代替invokevirtual)
正如官网的这个对比图显示的一样:它更快
其实话又说回来,要是我一开始就是用第三方数据库,岂不是就不存在这些自己搞出来的幺蛾子了!
比如阿里巴巴的Druid连接池不就是个优秀的产品么!它到底有多优秀呢?你先看它的使用:
和前文的SpringBoot1.0中引用HikariCP一样,先排除默认数据源tomcat-jdbc再引用想要使用的连接池
3.1.1、首先引入默认配置的数据源处排除掉tomcat-jdbc
org.springframework.boot spring-boot-starter-jdbc org.apache tomcat-jdbc com.alibaba druid-spring-boot-starter 1.1.10 com.alibaba druid 1.0.31
3.1.2、再在.yml文件中配置Druid数据源的相关信息
spring: # 数据源的配置 datasource: # 连接池的配置 type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 5 max-active: 10 min-idle: 5 max-wait: 30000 pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 validation-query: SELECT 1 FROM DUAL validation-query-timeout: 60000 test-on-borrow: false test-on-return: false test-while-idle: true time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 100000
3.1.3、再写个配置类加载数据源
@Configuration @ConditionalOnClass(DruidDataSource.class) @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.alibaba.druid.pool.DruidDataSource", matchIfMissing = true) public class DataSourceConfig { @Bean @ConfigurationProperties("spring.datasource.druid") public DataSource dataSourceOne() { return DruidDataSourceBuilder.create().build(); } }
3.1.4、启动效果:
2020-01-17 16:59:32.804 INFO 8520 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2020-01-17 16:59:32.806 INFO 8520 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'dataSourceOne' has been autodetected for JMX exposure
2020-01-17 16:59:32.808 INFO 8520 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'statFilter' has been autodetected for JMX exposure
2020-01-17 16:59:32.818 INFO 8520 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'dataSourceOne': registering with JMX server as MBean [com.alibaba.druid.spring.boot.autoconfigure:name=dataSourceOne,type=DruidDataSourceWrapper]
2020-01-17 16:59:32.822 INFO 8520 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'statFilter': registering with JMX server as MBean [com.alibaba.druid.filter.stat:name=statFilter,type=StatFilter]
2020-01-17 16:59:32.932 INFO 8520 --- [ main ] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 18001 (http)
2020-01-17 16:59:32.943 INFO 8520 --- [ main ] c.j.mmzsblog.DatasourceTestApplication : Started DatasourceTestApplication in 8.328 seconds (JVM running for 10.941)
在SpringBoot2.0中引用Druid和在SpringBoot1.0中引入类似;
3.2.1、不需要排除默认配置的数据源,直接引入置Druid数据源
com.alibaba druid-spring-boot-starter 1.1.10 com.alibaba druid 1.0.31
3.2.2、在.yml文件中配置的Druid数据源的相关信息同3.1.3一样
3.2.3、再写个配置类加载数据源同3.1.3一样
3.2.4、启动后你同样能看到打印出类似的信息
Located MBean 'dataSourceOne': registering with JMX server as MBean [com.alibaba.druid.spring.boot.autoconfigure:name=dataSourceOne,type=DruidDataSourceWrapper]
看了上面的使用,超级简单又木有?
首先我们看看druid官网给出的几个传统连接池之间的对比吧:
从上表可以看出,Druid连接池在性能、监控、诊断、安全、扩展性这些方面远远超出竞品。
官网是这样介绍它的:
Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。
以上就是SpringBoot中的连接池有哪些,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。