返回顶部
首页 > 资讯 > 前端开发 > VUE >SpringBoot中的连接池是怎么样的
  • 491
分享到

SpringBoot中的连接池是怎么样的

2024-04-02 19:04:59 491人浏览 薄情痞子
摘要

这期内容当中小编将会给大家带来有关SpringBoot中的连接池是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。回想起之前在部署springboot项目到正线时,

这期内容当中小编将会给大家带来有关SpringBoot中的连接池是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

回想起之前在部署springboot项目到正线时,线上环境要求jdk7,可项目是基于jdk8开发的,springboot也是用的springboot2以上的版本,可以说缝缝补补一整天才搞好能满足线上环境的代码,搞完后当然需要小小的了解一下背后的秘密。

好了,话不多说,我们直接进入正题。

其实切换还不算太麻烦,坑就坑在SpringBoot2切换到SpringBoot1后,默认使用的连接池发生了变化,之前做的压力测试又重新搞了一遍

接下里我们就一起来检验下SpringBoot2和SpringBoot1使用的默认数据源吧!

一、SpringBoot2的HikariCP首先在pom文件中需要引入的依赖包:

<parent>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-parent</artifactId>         <version>2.0.4.RELEASE</version>     </parent>      <properties>         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>         <java.version>1.8</java.version>         <mybatis.spring.boot.version>1.3.1</mybatis.spring.boot.version>     </properties>      <dependencies>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter</artifactId>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-WEB</artifactId>         </dependency>         <dependency>             <groupId>Mysql</groupId>             <artifactId>mysql-connector-java</artifactId>         </dependency>         <dependency>             <groupId>org.mybatis.spring.boot</groupId>             <artifactId>mybatis-spring-boot-starter</artifactId>             <version>${mybatis.spring.boot.version}</version>         </dependency>         <dependency>             <groupId>org.projectlombok</groupId>             <artifactId>lombok</artifactId>         </dependency>      </dependencies>

其次在配置文件中需要定义如下属性(不定义时会自动使用默认值)

# 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]这部分就点明了使用的连接池类型

二、SpringBoot1的tomcat-jdbc降低版本后,我没有看到上面的信息打印,一时差点不知道使用了什么连接池,不过网上都说是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文件也能看出其中的门道:

<dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-jdbc</artifactId>    </dependency>

依赖文件中的这一个依赖其实就是表明了SpringBoot1使用的是tomcat-jdbc连接池。

哎,现在才知道SpringBoot2.0和SpringBoot1.0版本使用的默认数据库是不一样的。

现在原因是找到了,可是如何解决呢?要不然把SpringBoot1版本的默认连接池修改成和SpringBoot2版本的一样。好,有了想法,那就开干。

SpringBoot中的连接池是怎么样的

其实,在SpringBoot1的版本也是可以使用HikariCP连接池的,操作就是:

首先引入默认配置的数据源处排除掉tomcat-jdbc

<!--配置默认数据源 -->         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-jdbc</artifactId>             <exclusions>                 <!-- 排除默认的tomcat-jdbc数据源 -->                 <exclusion>                     <groupId>org.apache</groupId>                     <artifactId>tomcat-jdbc</artifactId>                 </exclusion>             </exclusions>         </dependency>         <!-- 引用SpringBoot2默认的HikariCP数据源 -->         <dependency>             <groupId>com.zaxxer</groupId>             <artifactId>HikariCP</artifactId>             <version>3.3.1</version>         </dependency>

再在.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)

正如官网的这个对比图显示的一样:它更快

SpringBoot中的连接池是怎么样的

其实话又说回来,要是我一开始就是用第三方数据库,岂不是就不存在这些自己搞出来的幺蛾子了!

SpringBoot中的连接池是怎么样的

比如阿里巴巴的Druid连接池不就是个优秀的产品么!它到底有多优秀呢?你先看它的使用:

三、其它连接池(如:Druid)3.1、SpringBoot1.0中引用Druid

和前文的SpringBoot1.0中引用HikariCP一样,先排除默认数据源tomcat-jdbc再引用想要使用的连接池

3.1.1、首先引入默认配置的数据源处排除掉tomcat-jdbc

<!--配置默认数据源 -->         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-jdbc</artifactId>             <exclusions>                 <!-- 排除默认的tomcat-jdbc数据源 -->                 <exclusion>                     <groupId>org.apache</groupId>                     <artifactId>tomcat-jdbc</artifactId>                 </exclusion>             </exclusions>         </dependency>         <!-- 引用阿里巴巴的druid数据源 -->         <dependency>             <groupId>com.alibaba</groupId>             <artifactId>druid-spring-boot-starter</artifactId>             <version>1.1.10</version>         </dependency>         <dependency>             <groupId>com.alibaba</groupId>             <artifactId>druid</artifactId>             <version>1.0.31</version>         </dependency>

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   :

3.2、SpringBoot2.0中引用Druid

在SpringBoot2.0中引用Druid和在SpringBoot1.0中引入类似;

3.2.1、不需要排除默认配置的数据源,直接引入置Druid数据源

<!-- 引用阿里巴巴的druid数据源 -->         <dependency>             <groupId>com.alibaba</groupId>             <artifactId>druid-spring-boot-starter</artifactId>             <version>1.1.10</version>         </dependency>         <dependency>             <groupId>com.alibaba</groupId>             <artifactId>druid</artifactId>             <version>1.0.31</version>         </dependency>

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]

3.3、优秀在哪?

看了上面的使用,超级简单又木有?

首先我们看看druid官网给出的几个传统连接池之间的对比吧:

SpringBoot中的连接池是怎么样的

从上表可以看出,Druid连接池在性能、监控、诊断、安全、扩展性这些方面远远超出竞品。

官网是这样介绍它的:

Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。

上述就是小编为大家分享的SpringBoot中的连接池是怎么样的了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网VUE频道。

--结束END--

本文标题: SpringBoot中的连接池是怎么样的

本文链接: https://lsjlt.com/news/84584.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot中的连接池是怎么样的
    这期内容当中小编将会给大家带来有关SpringBoot中的连接池是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。回想起之前在部署springboot项目到正线时,...
    99+
    2024-04-02
  • Springboot中怎么加入druid连接池
    本篇内容介绍了“Springboot中怎么加入druid连接池”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.DRUID连接池介绍Drui...
    99+
    2023-06-26
  • SpringBoot 是怎样连接数据库的
    Spring Boot 是一款流行的 Java 开发框架,它可以轻松地连接各种类型的数据库,包括关系型数据库和非关系型数据库。本文将介绍 Spring Boot 是如何连接数据库的,包括其原理和代码示...
    99+
    2023-09-18
    数据库 spring boot java
  • 什么是SQLServer中的连接池
    在SQL Server中,连接池是一种用于管理数据库连接的技术。连接池允许应用程序在需要时从一个事先创建好的连接集合中获取数据库连接...
    99+
    2024-04-09
    SQLServer
  • Oracle中的连接池是什么
    Oracle连接池是一个数据库连接池,用于管理和复用数据库连接对象,以提高应用程序的性能和可伸缩性。连接池在应用程序启动时创建并初始...
    99+
    2024-04-09
    Oracle
  • SpringBoot 是怎样连接 MySql 数据库的
    Spring Boot 是一款流行的 Java 开发框架,它可以轻松地连接各种类型的数据库,包括关系型数据库和非关系型数据库。本文将介绍 Spring Boot 是如何连接数据库的,包括其原理和代码示例。 一、Spring Boot 连接...
    99+
    2023-08-18
    数据库 spring boot mysql
  • Springboot中加入druid连接池
    目录1.DRUID连接池介绍2.DRUID 的参数3.配置依赖4.添加文件1.DRUID连接池介绍 Druid是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前最好的数据...
    99+
    2024-04-02
  • SpringBoot中使用MongoDB的连接池配置
    目录引入依赖 配置文件 配置文件映射为JavaBean 覆盖MongoDbFactory MongoDB测试 创建数据实体 创建Dao接口及实现 编写测试代码 在SpringBoot...
    99+
    2024-04-02
  • 数据库连接池泄露后的思考是怎样的
    数据库连接池泄露后的思考是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 一:初步排查早上作为能效平台系统的使...
    99+
    2024-04-02
  • SpringBoot整合Tomcat连接池的使用
    连接池大小及性能选项 maxActive:最主要参数,配置连接池同时能维持的最大连接数,如果客户端理论上需要100个连接,则这个值设为100。 maxIdle:如...
    99+
    2024-04-02
  • 怎么在SpringBoot中使用Druid数据库连接池
    这篇文章主要介绍怎么在SpringBoot中使用Druid数据库连接池,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Druid是阿里开源的一款数据库连接池,除了常规的连接池功能外,它还提供了强大的监控和扩展功能。这对...
    99+
    2023-06-14
  • 数据库连接池dbcp的原理及配置是怎样的
    这篇文章将为大家详细讲解有关数据库连接池dbcp的原理及配置是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. 简介DBCP(DataBa...
    99+
    2024-04-02
  • 基于MysqlConnector/C++的数据库连接池的实现是怎样的
    基于MysqlConnector/C++的数据库连接池的实现是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.连接池的介绍:1.1...
    99+
    2024-04-02
  • Oracle数据库中的连接池是什么
    Oracle数据库中的连接池是一种用于管理数据库连接的机制。连接池允许应用程序在需要时从一个预先创建的连接池中获取数据库连接,而不是...
    99+
    2024-03-02
    Oracle
  • SpringBoot集成Druid连接池连接MySQL8.0.11的示例分析
    这篇文章主要介绍SpringBoot集成Druid连接池连接MySQL8.0.11的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.配置依赖依赖管理我们可以使用maven或者gradleMySQL Conn...
    99+
    2023-06-20
  • python数据库连接池中数据库连接池技术的优点是什么
    本篇文章给大家分享的是有关python数据库连接池中数据库连接池技术的优点是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。昨天测试了一下开500个线程去请求数据库,不过这个...
    99+
    2023-06-17
  • MariaDB连接池的含义是什么
    MariaDB连接池是一种用来管理数据库连接的技术,它可以帮助提高应用程序对数据库的性能和效率。连接池会在应用程序启动时创建一定数量...
    99+
    2024-04-09
    MariaDB
  • ADO.NET连接池是什么
    这篇文章主要讲解了“ADO.NET连接池是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ADO.NET连接池是什么”吧!知道现在编程什么是最宝贵的?数据库连接,它其实是很耗费资源的。这里...
    99+
    2023-06-17
  • 什么是redis连接池
    Redis连接池是用于管理Redis连接的工具,它可以有效地管理和复用Redis连接,提高连接的使用效率和性能。在使用Redis时,...
    99+
    2023-09-09
    redis
  • java的mysql连接池怎么写
    利用java编写mysql连接池的方法具体内容如下:public class ConnecionPool {private int size;List connections = new ArrayList();public Conneci...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作