电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

玩轉(zhuǎn)SpringBoot中的那些連接池(小結(jié))

瀏覽:3日期:2023-04-03 08:08:50

回想起前幾天在部署springboot項(xiàng)目到正線時,線上環(huán)境要求jdk7,可項(xiàng)目是基于jdk8開發(fā)的,springboot也是用的springboot2以上的版本,可以說縫縫補(bǔ)補(bǔ)一整天才搞好能滿足線上環(huán)境的代碼,搞完后當(dāng)然需要小小的了解一下背后的秘密。

好了,話不多說,我們直接進(jìn)入正題。

其實(shí)切換還不算太麻煩,坑就坑在SpringBoot2切換到SpringBoot1后,默認(rèn)使用的連接池發(fā)生了變化,之前做的壓力測試又重新搞了一遍。

玩轉(zhuǎn)SpringBoot中的那些連接池(小結(jié))

怨天尤人貌似消極了哈,小編我可是一個正能量滿滿的人,所以總結(jié)下自己就是:雖然會用,但是沒了解技術(shù)背后的真相而鬧出的烏龍。

接下里我們就一起來檢驗(yàn)下SpringBoot2和SpringBoot1使用的默認(rèn)數(shù)據(jù)源吧!

一、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>

其次在配置文件中需要定義如下屬性(不定義時會自動使用默認(rèn)值)

# spring的相關(guān)配置spring: application: name: HikariCP測試 # 數(shù)據(jù)源的配置 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 startup2020-01-16 16:23:12.913 INFO 9996 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Bean with name ’dataSource’ has been autodetected for JMX exposure2020-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]這部分就點(diǎn)明了使用的連接池類型

二、SpringBoot1的tomcat-jdbc

降低版本后,我沒有看到上面的信息打印,一時差點(diǎn)不知道使用了什么連接池,不過網(wǎng)上都說是tomcat-jdbc;但是相信眼見為實(shí)的我,肯定要在哪里打印一下才放心,于是乎,我進(jìn)行了如下操作:

搞了一個controller來簡單的打印一下連接池的信息

@RestControllerpublic class testController { @Resource private DataSource dataSource; @GetMapping('/query') public void query(){ System.out.println('查詢到的數(shù)據(jù)源連接池信息是:'+dataSource); System.out.println('查詢到的數(shù)據(jù)源連接池類型是:'+dataSource.getClass()); System.out.println('查詢到的數(shù)據(jù)源連接池名字是:'+dataSource.getPoolProperties().getName()); }}

然后我就看到了如下的打印信息,果真是用的tomcat-jdbc

查詢到的數(shù)據(jù)源連接池信息是: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; }

查詢到的數(shù)據(jù)源連接池類型是:class org.apache.tomcat.jdbc.pool.DataSource

查詢到的數(shù)據(jù)源連接池名字是:Tomcat Connection Pool[1-1715657818]

其實(shí),我們從pom文件也能看出其中的門道:

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

依賴文件中的這一個依賴其實(shí)就是表明了SpringBoot1使用的是tomcat-jdbc連接池。

哎,現(xiàn)在才知道SpringBoot2.0和SpringBoot1.0版本使用的默認(rèn)數(shù)據(jù)庫是不一樣的。

現(xiàn)在原因是找到了,可是如何解決呢?要不然把SpringBoot1版本的默認(rèn)連接池修改成和SpringBoot2版本的一樣。好,有了想法,那就開干。

玩轉(zhuǎn)SpringBoot中的那些連接池(小結(jié))

其實(shí),在SpringBoot1的版本也是可以使用HikariCP連接池的,操作就是:

首先引入默認(rèn)配置的數(shù)據(jù)源處排除掉tomcat-jdbc

<!--配置默認(rèn)數(shù)據(jù)源 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <exclusions><!-- 排除默認(rèn)的tomcat-jdbc數(shù)據(jù)源 --><exclusion> <groupId>org.apache</groupId> <artifactId>tomcat-jdbc</artifactId></exclusion> </exclusions> </dependency> <!-- 引用SpringBoot2默認(rèn)的HikariCP數(shù)據(jù)源 --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>3.3.1</version> </dependency>

再在.yml文件中配置HikariCP數(shù)據(jù)源的相關(guān)信息

# spring的相關(guān)配置spring: # 數(shù)據(jù)源的配置 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

為什么說我此處要將數(shù)據(jù)源切換成SpringBoot2.0使用的默認(rèn)數(shù)據(jù)源呢?因?yàn)槭褂肧pringBoot1.0的tomcat-jdbc數(shù)據(jù)源我怕壓力測試出來達(dá)不到要求,為了不給測試增加工作壓力(小編我就是這么好的一個人)

玩轉(zhuǎn)SpringBoot中的那些連接池(小結(jié))

所以我進(jìn)行了上面的替換操作。

不過這樣做肯定也是有好處的。好處就在于HikariCP那迷人的優(yōu)勢:

1、字節(jié)碼級別優(yōu)化(很多方法通過JavaAssist生成)

2、大量小改進(jìn)

用FastStatementList代替ArrayList 無鎖集合ConcurrentBag 代理類的優(yōu)化(比如:,用invokestatic代替invokevirtual)

正如官網(wǎng)的這個對比圖顯示的一樣:它更快

玩轉(zhuǎn)SpringBoot中的那些連接池(小結(jié))

其實(shí)話又說回來,要是我一開始就是用第三方數(shù)據(jù)庫,豈不是就不存在這些自己搞出來的幺蛾子了!

玩轉(zhuǎn)SpringBoot中的那些連接池(小結(jié))

比如阿里巴巴的Druid連接池不就是個優(yōu)秀的產(chǎn)品么!它到底有多優(yōu)秀呢?你先看它的使用:

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

和前文的SpringBoot1.0中引用HikariCP一樣,先排除默認(rèn)數(shù)據(jù)源tomcat-jdbc再引用想要使用的連接池

3.1.1、首先引入默認(rèn)配置的數(shù)據(jù)源處排除掉tomcat-jdbc

<!--配置默認(rèn)數(shù)據(jù)源 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <exclusions><!-- 排除默認(rèn)的tomcat-jdbc數(shù)據(jù)源 --><exclusion> <groupId>org.apache</groupId> <artifactId>tomcat-jdbc</artifactId></exclusion> </exclusions> </dependency> <!-- 引用阿里巴巴的druid數(shù)據(jù)源 --> <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數(shù)據(jù)源的相關(guān)信息

spring: # 數(shù)據(jù)源的配置 datasource: # 連接池的配置 type: com.alibaba.druid.pool.DruidDataSourcedruid: 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、再寫個配置類加載數(shù)據(jù)源

@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 startup2020-01-17 16:59:32.806 INFO 8520 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Bean with name ’dataSourceOne’ has been autodetected for JMX exposure2020-01-17 16:59:32.808 INFO 8520 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Bean with name ’statFilter’ has been autodetected for JMX exposure2020-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)

3.2、SpringBoot2.0中引用Druid

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

3.2.1、不需要排除默認(rèn)配置的數(shù)據(jù)源,直接引入置Druid數(shù)據(jù)源

<!-- 引用阿里巴巴的druid數(shù)據(jù)源 --> <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數(shù)據(jù)源的相關(guān)信息同3.1.3一樣

3.2.3、再寫個配置類加載數(shù)據(jù)源同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、優(yōu)秀在哪?

看了上面的使用,超級簡單又木有?

首先我們看看druid官網(wǎng)給出的幾個傳統(tǒng)連接池之間的對比吧:

玩轉(zhuǎn)SpringBoot中的那些連接池(小結(jié))

從上表可以看出,Druid連接池在性能、監(jiān)控、診斷、安全、擴(kuò)展性這些方面遠(yuǎn)遠(yuǎn)超出競品。

官網(wǎng)是這樣介紹它的:

Druid連接池是阿里巴巴開源的數(shù)據(jù)庫連接池項(xiàng)目。Druid連接池為監(jiān)控而生,內(nèi)置強(qiáng)大的監(jiān)控功能,監(jiān)控特性不影響性能。功能強(qiáng)大,能防SQL注入,內(nèi)置Loging能診斷Hack應(yīng)用行為。

所以,小編我倒騰了這么久,想明白了一件事,我以后還是用阿里爸爸的Druid連接池吧,接入簡單,還自帶監(jiān)控,并且它可是經(jīng)過阿里巴巴各大系統(tǒng)考驗(yàn)過的產(chǎn)品,值得信賴,省事省心啊。

玩轉(zhuǎn)SpringBoot中的那些連接池(小結(jié))

參考:

1:HikariCP的優(yōu)點(diǎn):https://www.jianshu.com/p/129efe2c8e49

2、druid官網(wǎng):https://github.com/alibaba/druid/

到此這篇關(guān)于玩轉(zhuǎn)SpringBoot中的那些連接池(小結(jié))的文章就介紹到這了,更多相關(guān)SpringBoot 連接池內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 亚克力制品定制,上海嘉定有机玻璃加工制作生产厂家—官网 | 高清视频编码器,4K音视频编解码器,直播编码器,流媒体服务器,深圳海威视讯技术有限公司 | 厂厂乐-汇聚海量采购信息的B2B微营销平台-厂厂乐官网 | 权威废金属|废塑料|废纸|废铜|废钢价格|再生资源回收行情报价中心-中废网 | 中医治疗皮肤病_潍坊银康医院「山东」重症皮肤病救治平台 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | CE认证_FCC认证_CCC认证_MFI认证_UN38.3认证-微测检测 CNAS实验室 | 首页_中夏易经起名网 | 美能达分光测色仪_爱色丽分光测色仪-苏州方特电子科技有限公司 | led全彩屏-室内|学校|展厅|p3|户外|会议室|圆柱|p2.5LED显示屏-LED显示屏价格-LED互动地砖屏_蕙宇屏科技 | 电动手术床,医用护理床,led手术无影灯-曲阜明辉医疗设备有限公司 | 上海刑事律师|刑事辩护律师|专业刑事犯罪辩护律师免费咨询-[尤辰荣]金牌上海刑事律师团队 | 免费B2B信息推广发布平台 - 推发网 | 广州办公室设计,办公室装修,写字楼设计,办公室装修公司_德科 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 深圳离婚律师咨询「在线免费」华荣深圳婚姻律师事务所专办离婚纠纷案件 | 二手回收公司_销毁处理公司_设备回收公司-找回收信息网 | 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 | 并离网逆变器_高频UPS电源定制_户用储能光伏逆变器厂家-深圳市索克新能源 | 液氨泵,液化气泵-淄博「亚泰」燃气设备制造有限公司 | 活性炭厂家-蜂窝活性炭-粉状/柱状/果壳/椰壳活性炭-大千净化-活性炭 | 冷藏车厂家|冷藏车价格|小型冷藏车|散装饲料车厂家|程力专用汽车股份有限公司销售十二分公司 | 绿叶|绿叶投资|健康产业_绿叶投资集团有限公司 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 溶氧传感器-pH传感器|哈美顿(hamilton) | WTB5光栅尺-JIE WILL磁栅尺-B60数显表-常州中崴机电科技有限公司 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 物流公司电话|附近物流公司电话上门取货 | 实战IT培训机构_IT培训班选大学生IT技术培训中心_中公优就业 | 乐泰胶水_loctite_乐泰胶_汉高乐泰授权(中国)总代理-鑫华良供应链 | 优宝-汽车润滑脂-轴承润滑脂-高温齿轮润滑油脂厂家 | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 抓斗式清污机|螺杆式|卷扬式启闭机|底轴驱动钢坝|污水处理闸门-方源水利机械 | 空冷器|空气冷却器|空水冷却器-无锡赛迪森机械有限公司[官网] | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 电主轴,车床电磨头,变频制动电机-博山鸿达特种电机 | 斗式提升机,斗式提升机厂家-淄博宏建机械有限公司 | 全自动包衣机-无菌分装隔离器-浙江迦南科技股份有限公司 | 淘气堡_室内儿童乐园_户外无动力儿童游乐设备-高乐迪(北京) |