SpringBoot優(yōu)化連接數(shù)的方法詳解
由于springboot內(nèi)置web容器是Tomcat,所以我們?cè)谑褂胹pringboot時(shí),如果內(nèi)置Tomcat參數(shù)不滿足要求時(shí),可按需優(yōu)化。
SpringBoot內(nèi)置Tomcat,在默認(rèn)設(shè)置中,Tomcat的最大線程數(shù)是200,最大連接數(shù)是10000。支持的并發(fā)量是指連接數(shù),也就是說(shuō) 支持最大并發(fā)量是一萬(wàn)(默認(rèn))。
Tomcat有兩種處理連接的模式,
1,是BIO,一個(gè)線程只處理一個(gè)Socket連接,
2,是NIO,一個(gè)線程處理多個(gè)Socket連接。
由于HTTP請(qǐng)求不會(huì)太耗時(shí),而且多個(gè)連接一般不會(huì)同時(shí)來(lái)消息,所以一個(gè)線程處理多個(gè)連接沒有太大問題。一個(gè)線程處理多個(gè)連接數(shù)會(huì)很慢 有可能會(huì)超時(shí)。
springboot 配置Tomcat參數(shù):
server: tomcat: accept-count: 80 #掛起的請(qǐng)求隊(duì)列最大連接數(shù),默認(rèn)100 max-connections: 2000 #最大連接數(shù),默認(rèn)10000,tomcat內(nèi)tcp連接池的大小 max-threads: 200 #最大線程數(shù),默認(rèn)200,超過加入等待隊(duì)列,默認(rèn)是100,當(dāng)?shù)却?duì)列達(dá)到100后,直接拒絕此次請(qǐng)求返回connection refused。連接超時(shí)時(shí)間默認(rèn)為20秒 min-spare-threads: 5 #最小工作線程數(shù) connection-timeout: 60000 #server端的socket超時(shí)間,默認(rèn)60s accesslog: enabled: true #啟動(dòng)tomcat訪問日志
靜態(tài)內(nèi)部類Accesslog:主要用于配置Tomcat訪問日志的參數(shù)信息:
- enabled:是否啟用訪問日志
- pattern:訪問日志的格式化模式,默認(rèn)為common
- directory:創(chuàng)建日志文件的目錄??梢允墙^對(duì)或相對(duì)于Tomcat的基目錄,默認(rèn)是logs
- prefix:日志文件名稱前綴,默認(rèn)access_log
- suffix:日志文件名稱后綴,默認(rèn).log
- rotate:是否啟用訪問日志旋轉(zhuǎn),默認(rèn)為true
- renameOnRotate:是否推遲將日期戳包含在文件名中
- fileDateFormat:日志文件名稱中的日期格式,默認(rèn)為.yyyy-MM-dd。
- requestAttributesEnabled:為請(qǐng)求使用的IP地址、主機(jī)名、協(xié)議和端口設(shè)置請(qǐng)求屬性
- buffered:是否緩沖輸出,使其只定期刷新,默認(rèn)為true
優(yōu)化完內(nèi)置Tomcat配置,我們可以按需再優(yōu)化下數(shù)據(jù)庫(kù)連接配置:
查詢mysql最大連接數(shù):
show variables like "%max_connections%";
MySQL 最大連接數(shù)的默認(rèn)值是 100,這個(gè)數(shù)值對(duì)于并發(fā)連接很多的數(shù)據(jù)庫(kù)應(yīng)用是遠(yuǎn)不夠用的。當(dāng)連接請(qǐng)求大于默認(rèn)連接數(shù)后,就會(huì)出現(xiàn)無(wú)法連接數(shù)據(jù)庫(kù)的錯(cuò)誤,因此我們需要把它適當(dāng)調(diào)大一些。在使用 MySQL 數(shù)據(jù)庫(kù)的時(shí)候,經(jīng)常會(huì)遇到一個(gè)問題,就是 “Can not connect to MySQL server. Too many connections” -mysql 1040 錯(cuò)誤,這是因?yàn)樵L問 MySQL 且還未釋放的連接數(shù)已經(jīng)達(dá)到 MySQL 的上限。通常,MySQL 的最大連接數(shù)默認(rèn)是 100,,最大可以達(dá)到 16384。
常用的修改MySQL最大連接數(shù)的兩種方式如下:
第一種:命令行修改最大連接數(shù) (max_connections),設(shè)置最大連接數(shù)為 1000。
set global max_connections = 1000;
這種方式有個(gè)問題,就是設(shè)置的最大連接數(shù)只在 MySQL 當(dāng)前服務(wù)進(jìn)程有效,一旦 MySQL 重啟,又會(huì)恢復(fù)到初始狀態(tài)。因?yàn)?MySQL 啟動(dòng)后的初始化工作是從其配置文件中讀取數(shù)據(jù)的,而這種方式?jīng)]有對(duì)其配置文件做更改。
第二種:通過修改配置文件來(lái)修改 MySQL 最大連接數(shù) (max_connections)。
進(jìn)入 MySQL 安裝目錄,打開 MySQL 配置文件 my.ini 或 my.cnf 查找 max_connections=100,修改為 max_connections=1000,重啟 MySQL 服務(wù)即可。
mybatis 的并發(fā)上限優(yōu)化:
spring.datasource.name=druidDataSource spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://192.168.1.1:13306/test?useUnicode=true&characterEncoding=utf8&useTimezone=true&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=123456test spring.datasource.filters=stat,wall,log4j,config spring.datasource.max-active=100 spring.datasource.initial-size=1 spring.datasource.max-wait= 60000 spring.datasource.min-idle=1 spring.datasource.time-between-eviction-runs-millis=60000 spring.datasource.min-evictable-idle-time-millis=300000 spring.datasource.validation-query=select 'x' spring.datasource.test-while-idle=true spring.datasource.test-on-borrow=false spring.datasource.test-on-return=false spring.datasource.pool-prepared-statements=true spring.datasource.max-open-prepared-statements=50 spring.datasource.max-pool-prepared-statement-per-connection-size=20
總結(jié)
到此這篇關(guān)于SpringBoot優(yōu)化連接數(shù)的文章就介紹到這了,更多相關(guān)SpringBoot優(yōu)化連接數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatisPlus分頁(yè)時(shí)排序的實(shí)現(xiàn)
本文主要介紹了MyBatisPlus分頁(yè)時(shí)排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03JAVA下單接口優(yōu)化實(shí)戰(zhàn)TPS性能提高10倍
今天小編就為大家分享一篇關(guān)于JAVA下單接口優(yōu)化實(shí)戰(zhàn)TPS性能提高10倍,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12JavaEE中用response向客戶端輸出中文數(shù)據(jù)亂碼問題分析
這篇文章主要介紹了JavaEE中用response向客戶端輸出中文數(shù)據(jù)亂碼問題分析,需要的朋友可以參考下2014-10-10Java基于解釋器模式實(shí)現(xiàn)定義一種簡(jiǎn)單的語(yǔ)言功能示例
這篇文章主要介紹了Java基于解釋器模式實(shí)現(xiàn)定義一種簡(jiǎn)單的語(yǔ)言功能,簡(jiǎn)單描述了解釋器模式的概念、功能及Java使用解釋器模式定義一種簡(jiǎn)單語(yǔ)言的相關(guān)實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2018-05-05Java倒計(jì)時(shí)三種實(shí)現(xiàn)方式代碼實(shí)例
這篇文章主要介紹了Java倒計(jì)時(shí)三種實(shí)現(xiàn)方式代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07spring boot 默認(rèn)異常處理的實(shí)現(xiàn)
這篇文章主要介紹了spring boot 默認(rèn)異常處理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04