站實(shí)戰(zhàn):MySQL+MyBatis-Plus+Thymeleaf全棧搭建)
簡介本資源是一套基于SSM框架與Vue前端的完整電影網(wǎng)站系統(tǒng)源碼面向Java Web初學(xué)者及課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)階段的學(xué)生解決Web全棧項(xiàng)目從需求分析到部署上線的實(shí)踐閉環(huán)問題。壓縮包共880個(gè)文件涵蓋144個(gè)Java后端邏輯類、53個(gè)Vue組件、167個(gè)JS交互腳本、55個(gè)CSS樣式文件及79個(gè)GIF動(dòng)效素材輔以SQL建表語句、BAT一鍵部署腳本和ElementUI界面組件結(jié)構(gòu)清晰模塊完整。資源大小18.85MB已吸引2594人學(xué)習(xí)下載。讀者可直接導(dǎo)入IDE運(yùn)行獲得含用戶管理、電影信息展示、圖片與視頻素材管理的可執(zhí)行系統(tǒng)配套摘要文檔、三級目錄結(jié)構(gòu)說明及技術(shù)選型詳解便于理解B/S架構(gòu)下前后端分離開發(fā)流程與SSMVue協(xié)同機(jī)制。1. 用 Java Spring Boot 快速搭起一個(gè)可上線的電影網(wǎng)站不是 Demo是能查片、搜人、看詳情、分頁加載的真實(shí) Web 項(xiàng)目你手頭有一份“電影網(wǎng)站 Java 源碼”但打開后發(fā)現(xiàn)Tomcat 跑不起來、MySQL 連不上、前端頁面全是 404、連登錄入口都找不到——這不是代碼有 bug而是缺了真實(shí)業(yè)務(wù)場景下的工程骨架。這個(gè)標(biāo)題里反復(fù)出現(xiàn)的“基于 Web 的電影網(wǎng)站設(shè)計(jì)與實(shí)現(xiàn)”本質(zhì)不是寫個(gè) CRUD 就交差而是要解決「用戶怎么找新片」「管理員怎么批量導(dǎo)入豆瓣數(shù)據(jù)」「海報(bào)圖如何不崩」「搜索響應(yīng)怎么壓到 300ms 內(nèi)」這些具體問題。它面向的是剛學(xué)完 Servlet/JDBC 的 Java 初學(xué)者也面向需要快速交付教學(xué)系統(tǒng)或課程設(shè)計(jì)的高校開發(fā)者核心訴求不是炫技而是結(jié)構(gòu)清晰、數(shù)據(jù)庫可填、接口可測、前端能點(diǎn)、部署不報(bào)錯(cuò)。本文不講 MVC 理論直接從spring-boot-starter-web開始把“電影網(wǎng)站”拆成「數(shù)據(jù)建模 → 接口分層 → 前端聯(lián)動(dòng) → 性能兜底」四步每一步都給出可粘貼運(yùn)行的代碼、必須改的配置項(xiàng)、以及本地調(diào)試時(shí)最??ㄗ〉娜齻€(gè)檢查點(diǎn)。2. 用 MySQL MyBatis-Plus 建好電影領(lǐng)域模型讓「影片」「導(dǎo)演」「演員」「分類」真正關(guān)聯(lián)起來電影網(wǎng)站的數(shù)據(jù)絕不是一張movie表就能撐住的。用戶搜“周星馳”得列出他導(dǎo)演參演的所有片點(diǎn)開《大話西游》要顯示類型喜劇/愛情、主演周星馳/朱茵、上映年份、豆瓣評分——這要求至少 5 張表形成主外鍵閉環(huán)。常見錯(cuò)誤是直接照著豆瓣 API 字段建表比如加douban_id字段結(jié)果導(dǎo)致后續(xù)無法做國產(chǎn)片篩選或年代排序。正確做法是先定義業(yè)務(wù)實(shí)體邊界再映射關(guān)系。2.1 設(shè)計(jì) 5 張核心表并生成實(shí)體類我們采用MyBatis-Plus 3.5.3.1 MySQL 8.0組合避免 XML 手寫 SQL。建表語句必須包含邏輯刪除字段deleted和時(shí)間戳create_time這是后期支持軟刪和審計(jì)的基礎(chǔ)-- 影片主表含基礎(chǔ)信息狀態(tài) CREATE TABLE movie ( id bigint NOT NULL AUTO_INCREMENT, title varchar(100) NOT NULL COMMENT 中文片名, original_title varchar(100) DEFAULT NULL COMMENT 原名, year smallint DEFAULT NULL COMMENT 上映年份, rating decimal(2,1) DEFAULT NULL COMMENT 豆瓣評分, duration varchar(20) DEFAULT NULL COMMENT 片長, summary text COMMENT 劇情簡介, poster_url varchar(255) DEFAULT NULL COMMENT 海報(bào)地址, status tinyint DEFAULT 1 COMMENT 狀態(tài)1-上架, 0-下架, deleted tinyint DEFAULT 0, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 分類表如劇情 / 動(dòng)作 / 愛情 CREATE TABLE category ( id bigint NOT NULL AUTO_INCREMENT, name varchar(20) NOT NULL UNIQUE, deleted tinyint DEFAULT 0, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 影片-分類關(guān)聯(lián)表多對多 CREATE TABLE movie_category ( movie_id bigint NOT NULL, category_id bigint NOT NULL, PRIMARY KEY (movie_id,category_id), KEY idx_category_id (category_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 人員表統(tǒng)一存導(dǎo)演/演員 CREATE TABLE person ( id bigint NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL, avatar_url varchar(255) DEFAULT NULL, type tinyint NOT NULL COMMENT 1-導(dǎo)演, 2-演員, deleted tinyint DEFAULT 0, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 影片-人員關(guān)聯(lián)表帶角色字段 CREATE TABLE movie_person ( movie_id bigint NOT NULL, person_id bigint NOT NULL, role varchar(20) DEFAULT NULL COMMENT 導(dǎo)演/主演/配角, PRIMARY KEY (movie_id,person_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;提示建表后立刻執(zhí)行SELECT COUNT(*) FROM movie;確認(rèn)表存在且無語法錯(cuò)誤。若用 Navicat 導(dǎo)入失敗請檢查是否啟用了innodb_file_per_tableONMySQL 8.0 默認(rèn)開啟。2.2 用 MyBatis-Plus 自動(dòng)生成實(shí)體與 Mapper在pom.xml中引入關(guān)鍵依賴Spring Boot 2.7.x 兼容版dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency配置application.yml數(shù)據(jù)源注意serverTimezoneGMT%2B8防止時(shí)間錯(cuò)亂spring: datasource: url: jdbc:mysql://localhost:3306/movie_db?useUnicodetruecharacterEncodingUTF-8serverTimezoneGMT%2B8 username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver使用 MyBatis-Plus 官方代碼生成器AutoGenerator生成Movie.java、Category.java等實(shí)體類。關(guān)鍵參數(shù)必須設(shè)置參數(shù)值說明globalConfig.setAuthor(dev)固定作者名避免生成文件含非法字符packageConfig.setModuleName(movie)模塊名設(shè)為movie保證包路徑為com.example.movie.entitystrategyConfig.addInclude(movie,category,movie_category)顯式指定表名防止生成無關(guān)表strategyConfig.setTablePrefix(t_)留空本例表名無前綴設(shè)為空字符串生成后Movie實(shí)體需手動(dòng)添加關(guān)聯(lián)注解// Movie.java TableName(movie) public class Movie { TableId(type IdType.AUTO) private Long id; private String title; private Integer year; private BigDecimal rating; // ...其他字段 TableField(exist false) // 不映射到數(shù)據(jù)庫字段 private ListCategory categories; // 關(guān)聯(lián)分類列表 TableField(exist false) private ListPerson directors; // 導(dǎo)演列表 TableField(exist false) private ListPerson actors; // 演員列表 }2.3 編寫多表關(guān)聯(lián)查詢的自定義 SQLMyBatis-Plus 的QueryWrapper無法處理movie → movie_category → category三層 JOIN。必須手寫 XML 映射。在MovieMapper.xml中添加!-- 根據(jù) ID 查詢影片詳情含分類、導(dǎo)演、主演 -- select idselectMovieWithRelations resultTypecom.example.movie.entity.Movie SELECT m.*, GROUP_CONCAT(c.name SEPARATOR ,) as categoryNames, GROUP_CONCAT(d.name SEPARATOR ,) as directorNames, GROUP_CONCAT(a.name SEPARATOR ,) as actorNames FROM movie m LEFT JOIN movie_category mc ON m.id mc.movie_id LEFT JOIN category c ON mc.category_id c.id AND c.deleted 0 LEFT JOIN movie_person mp_d ON m.id mp_d.movie_id AND mp_d.role 導(dǎo)演 LEFT JOIN person d ON mp_d.person_id d.id AND d.type 1 AND d.deleted 0 LEFT JOIN movie_person mp_a ON m.id mp_a.movie_id AND mp_a.role 主演 LEFT JOIN person a ON mp_a.person_id a.id AND a.type 2 AND a.deleted 0 WHERE m.id #{id} AND m.deleted 0 GROUP BY m.id /select對應(yīng) Mapper 接口方法// MovieMapper.java Mapper public interface MovieMapper extends BaseMapperMovie { Select(SELECT * FROM movie WHERE deleted 0 ORDER BY create_time DESC LIMIT #{offset}, #{limit}) ListMovie selectPage(Param(offset) int offset, Param(limit) int limit); Movie selectMovieWithRelations(Param(id) Long id); }注意GROUP_CONCAT在 MySQL 中默認(rèn)長度限制為 1024若某部電影有超長分類名如“科幻/冒險(xiǎn)/動(dòng)作/奇幻/家庭/兒童”會截?cái)?。生產(chǎn)環(huán)境需在 MySQL 配置中增加group_concat_max_len 4096。3. 用 Spring Boot REST Controller 暴露標(biāo)準(zhǔn)接口讓前端 Vue 或 HTML 頁面能直接調(diào)用電影網(wǎng)站的接口不能只返回 JSON 數(shù)據(jù)還要解決「分頁怎么傳參」「搜索關(guān)鍵詞怎么防 SQL 注入」「海報(bào) URL 怎么統(tǒng)一補(bǔ)前綴」這些落地細(xì)節(jié)。很多源碼把所有邏輯塞進(jìn)RestController導(dǎo)致后期無法單元測試。這里采用Controller → Service → Mapper 三層分離且每個(gè)層都有明確職責(zé)邊界。3.1 定義標(biāo)準(zhǔn) REST 接口路徑與請求參數(shù)遵循 RESTful 最佳實(shí)踐 電影資源路徑統(tǒng)一為/api/movies操作動(dòng)詞用 HTTP 方法區(qū)分請求方式路徑說明示例參數(shù)GET/api/movies獲取影片列表支持分頁、搜索、分類篩選?page1size12keyword西游category喜劇GET/api/movies/{id}獲取單部影片詳情含關(guān)聯(lián)數(shù)據(jù)id123POST/api/movies后臺新增影片需登錄JSON body 含 title/year/rating 等PUT/api/movies/{id}更新影片狀態(tài)上架/下架{status:0}提示不要用/movie/list這類非標(biāo)準(zhǔn)路徑。搜索引擎和前端路由庫如 Vue Router對/api/movies更友好也便于 Nginx 反向代理統(tǒng)一管理。3.2 編寫帶條件查詢的 Service 層邏輯MovieService是核心業(yè)務(wù)膠水層負(fù)責(zé)拼裝查詢條件、調(diào)用 Mapper、組裝返回對象Service public class MovieService { Autowired private MovieMapper movieMapper; public PageResultMovie listMovies(int page, int size, String keyword, String category) { // 1. 計(jì)算分頁偏移量 int offset (page - 1) * size; // 2. 構(gòu)建動(dòng)態(tài) WHERE 條件防 SQL 注入 StringBuilder whereSql new StringBuilder(); ListObject params new ArrayList(); if (StringUtils.isNotBlank(keyword)) { whereSql.append( AND (m.title LIKE ? OR m.original_title LIKE ?)); params.add(% keyword %); params.add(% keyword %); } if (StringUtils.isNotBlank(category)) { whereSql.append( AND c.name ?); params.add(category); } // 3. 執(zhí)行分頁查詢注意MyBatis-Plus 的 IPage 不支持多表 JOIN 分頁必須手寫 String sql SELECT m.*, COUNT(*) OVER() AS total FROM movie m LEFT JOIN movie_category mc ON m.id mc.movie_id LEFT JOIN category c ON mc.category_id c.id WHERE m.deleted 0 whereSql.toString() GROUP BY m.id ORDER BY m.create_time DESC LIMIT ?, ?; params.add(offset); params.add(size); // 使用 JdbcTemplate 執(zhí)行原生 SQL比 MyBatis XML 更靈活 ListMapString, Object rows jdbcTemplate.queryForList(sql, params.toArray()); // 4. 封裝分頁結(jié)果 long total rows.isEmpty() ? 0 : ((Number) rows.get(0).get(total)).longValue(); ListMovie movies rows.stream().map(this::mapToMovie).collect(Collectors.toList()); return new PageResult(movies, total, page, size); } private Movie mapToMovie(MapString, Object row) { Movie movie new Movie(); movie.setId(((Number) row.get(id)).longValue()); movie.setTitle((String) row.get(title)); movie.setYear(((Number) row.get(year)).intValue()); // ...其他字段賦值 return movie; } }3.3 Controller 層做參數(shù)校驗(yàn)與響應(yīng)封裝MovieController只做三件事接收參數(shù)、調(diào)用 Service、包裝響應(yīng)。禁止在 Controller 里寫業(yè)務(wù)邏輯RestController RequestMapping(/api/movies) public class MovieController { Autowired private MovieService movieService; GetMapping public ResponseEntityApiResponsePageResultMovie list( RequestParam(defaultValue 1) int page, RequestParam(defaultValue 12) int size, RequestParam(required false) String keyword, RequestParam(required false) String category) { // 參數(shù)校驗(yàn)頁碼不能為負(fù)數(shù) if (page 1 || size 1 || size 100) { return ResponseEntity.badRequest() .body(ApiResponse.error(參數(shù)錯(cuò)誤page1, size in [1,100])); } try { PageResultMovie result movieService.listMovies(page, size, keyword, category); return ResponseEntity.ok(ApiResponse.success(result)); } catch (Exception e) { log.error(查詢影片列表失敗, e); return ResponseEntity.status(500) .body(ApiResponse.error(服務(wù)內(nèi)部錯(cuò)誤請稍后重試)); } } GetMapping(/{id}) public ResponseEntityApiResponseMovie detail(PathVariable Long id) { if (id null || id 0) { return ResponseEntity.badRequest() .body(ApiResponse.error(影片ID無效)); } Movie movie movieService.getDetail(id); if (movie null) { return ResponseEntity.notFound().build(); } return ResponseEntity.ok(ApiResponse.success(movie)); } }其中ApiResponse是統(tǒng)一響應(yīng)格式避免前端反復(fù)解析不同結(jié)構(gòu)public class ApiResponseT { private int code; private String message; private T data; public static T ApiResponseT success(T data) { ApiResponseT res new ApiResponse(); res.code 200; res.message success; res.data data; return res; } public static T ApiResponseT error(String message) { ApiResponseT res new ApiResponse(); res.code 400; res.message message; return res; } }注意RequestParam(required false)表示該參數(shù)可選但PathVariable必須存在。若前端傳/api/movies/末尾無 IDSpring Boot 會直接返回 404無需額外判空。4. 用 Thymeleaf 渲染靜態(tài)頁面零 JavaScript 也能跑通首頁、詳情頁、搜索頁很多“電影網(wǎng)站 Java 源碼”強(qiáng)行用 JSP 或裸 Servlet 輸出 HTML導(dǎo)致樣式混亂、JS 報(bào)錯(cuò)、圖片不顯示。Thymeleaf 是 Spring Boot 官方推薦的模板引擎它允許你在 HTML 文件里寫th:each循環(huán)瀏覽器直接打開.html文件能看到結(jié)構(gòu)開發(fā)時(shí)無需啟動(dòng)服務(wù)器即可預(yù)覽布局。4.1 配置 Thymeleaf 并創(chuàng)建基礎(chǔ)頁面結(jié)構(gòu)在pom.xml添加依賴dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependencyapplication.yml中啟用熱更新開發(fā)階段必備spring: thymeleaf: cache: false # 開發(fā)時(shí)關(guān)閉緩存 enabled: true prefix: classpath:/templates/ suffix: .html encoding: UTF-8 servlet: content-type: text/html創(chuàng)建src/main/resources/templates/layout.html作為母版含公共導(dǎo)航欄、CSS/JS 引入!DOCTYPE html html xmlns:thhttp://www.thymeleaf.org head meta charsetUTF-8/ title電影網(wǎng)站/title link relstylesheet th:href{/css/bootstrap.min.css} link relstylesheet th:href{/css/style.css} /head body div classcontainer-fluid !-- 頂部導(dǎo)航 -- nav classnavbar navbar-expand-lg navbar-light bg-light a classnavbar-brand href/ 電影網(wǎng)站/a form classform-inline my-2 my-lg-0 th:action{/search} methodget input classform-control mr-sm-2 typesearch nameq placeholder搜索影片... aria-labelSearch button classbtn btn-outline-success my-2 my-sm-0 typesubmit搜索/button /form /nav !-- 主體內(nèi)容占位符 -- div th:fragmentcontent div th:replacethis :: content/div /div /div script th:src{/js/bootstrap.bundle.min.js}/script /body /html4.2 編寫首頁index.html展示最新上映影片首頁需調(diào)用MovieService.listMovies(1, 12, null, null)獲取最新 12 部影片并用 Bootstrap Card 布局!DOCTYPE html html xmlns:thhttp://www.thymeleaf.org xmlns:layouthttp://www.ultraq.net.nz/thymeleaf/layout layout:decorate~{layout} head title首頁 - 電影網(wǎng)站/title /head body div layout:fragmentcontent h2 classmt-4 mb-3最新上映/h2 div classrow div classcol-md-3 mb-4 th:eachmovie : ${movies.data} div classcard h-100 !-- 海報(bào)圖若為空則顯示默認(rèn)占位圖 -- img th:src${#strings.isEmpty(movie.posterUrl) ? /images/default-poster.jpg : movie.posterUrl} classcard-img-top alt海報(bào) height300 div classcard-body h5 classcard-title th:text${movie.title}肖申克的救贖/h5 p classcard-text small classtext-muted th:text${movie.year} ?: 未知年份1994/small span th:if${movie.rating ! null} th:text★ ${movie.rating}★ 9.7/span /p a th:href{/movie/ ${movie.id}} classbtn btn-primary查看詳情/a /div /div /div /div !-- 分頁控件 -- nav aria-label分頁 ul classpagination justify-content-center li classpage-item th:classappend${page 1} ? disabled a classpage-link th:href{/?page${page - 1}} th:text上一頁上一頁/a /li li classpage-item active th:eachi : ${#numbers.sequence(1, totalPages)} a classpage-link th:href{/?page${i}} th:text${i} th:classappend${i page} ? active1/a /li li classpage-item th:classappend${page totalPages} ? disabled a classpage-link th:href{/?page${page 1}} th:text下一頁下一頁/a /li /ul /nav /div /body /html對應(yīng) Controller 返回 ModelGetMapping(/) public String index(Model model) { PageResultMovie result movieService.listMovies(1, 12, null, null); model.addAttribute(movies, result); model.addAttribute(page, 1); model.addAttribute(totalPages, (int) Math.ceil((double) result.getTotal() / 12)); return index; // 對應(yīng) templates/index.html }4.3 實(shí)現(xiàn)搜索功能GET 請求跳轉(zhuǎn) 后端模糊匹配搜索頁search.html復(fù)用首頁結(jié)構(gòu)僅替換循環(huán)數(shù)據(jù)源!-- search.html -- div layout:fragmentcontent h2 classmt-4 mb-3 th:text搜索結(jié)果 ${keyword}搜索結(jié)果/h2 div classalert alert-info th:if${movies.data.empty} 未找到與“[[${keyword}]]”相關(guān)的影片 /div div classrow th:if${!movies.data.empty} !-- 同 index.html 的 card 循環(huán) -- /div /divController 處理搜索請求注意GetMapping(/search)接收表單 GET 提交GetMapping(/search) public String search(RequestParam String q, Model model) { // 調(diào)用 service 的 listMovies 方法keywordq PageResultMovie result movieService.listMovies(1, 12, q, null); model.addAttribute(movies, result); model.addAttribute(keyword, q); model.addAttribute(page, 1); model.addAttribute(totalPages, (int) Math.ceil((double) result.getTotal() / 12)); return search; }提示Thymeleaf 的th:each會自動(dòng)處理空集合無需在 HTML 里寫th:if${not #lists.isEmpty(movies.data)}。但th:if用于顯示提示文案更直觀。5. 解決三大高頻部署問題海報(bào)圖 404、分頁跳轉(zhuǎn)失效、MySQL 連接超時(shí)本地開發(fā)跑通不等于能上線。很多“電影網(wǎng)站 Java 源碼”在學(xué)生交作業(yè)時(shí)正常一放到云服務(wù)器就掛——根本原因是沒處理生產(chǎn)環(huán)境特有約束。以下三個(gè)問題90% 的 Java Web 電影項(xiàng)目都會遇到且必須在編碼階段就埋入解決方案。5.1 海報(bào)圖路徑統(tǒng)一代理用 Spring ResourceHandler 映射 uploads 目錄用戶上傳的海報(bào)圖若直接存src/main/resources/static/images/打包成 JAR 后無法寫入。正確做法是將圖片存到服務(wù)器磁盤如/data/movie/posters/再通過ResourceHandler映射為 Web 路徑Configuration public class WebConfig implements WebMvcConfigurer { Value(${movie.upload-path:/data/movie/posters/}) private String uploadPath; Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 將 /uploads/** 請求映射到 uploadPath 目錄 registry.addResourceHandler(/uploads/**) .addResourceLocations(file: uploadPath); } }application.yml中配置路徑Linux 環(huán)境movie: upload-path: /data/movie/posters/前端 HTML 中引用海報(bào)圖img th:src/uploads/ ${movie.posterFileName} alt海報(bào)注意file:/data/movie/posters/路徑必須提前創(chuàng)建且 Java 進(jìn)程用戶如springboot要有讀寫權(quán)限。執(zhí)行sudo mkdir -p /data/movie/posters sudo chown springboot:springboot /data/movie/posters。5.2 分頁鏈接動(dòng)態(tài)生成用 Thymeleaf 的{...}保持上下文路徑當(dāng)項(xiàng)目部署到子路徑如https://example.com/movie/時(shí)硬編碼a href/page/2會跳轉(zhuǎn)到根域名。Thymeleaf 的{...}自動(dòng)拼接上下文路徑!-- 錯(cuò)誤寫法絕對路徑 -- a href/?page2第2頁/a !-- 正確寫法相對路徑 上下文自動(dòng)補(bǔ)全 -- a th:href{/?page${page 1}}下一頁/a同時(shí)在application.yml中聲明上下文路徑若部署在子目錄server: servlet: context-path: /movie # 訪問地址變?yōu)?https://example.com/movie/5.3 MySQL 連接池保活配置 HikariCP 防止連接閑置斷開阿里云 RDS 或騰訊云 CDB 默認(rèn) 300 秒無活動(dòng)連接自動(dòng)斷開。若 Spring Boot 未配置連接池心跳用戶首次訪問會報(bào)Communications link failure。在application.yml中加入spring: datasource: hikari: connection-timeout: 30000 validation-timeout: 3000 idle-timeout: 600000 # 10分鐘空閑后回收連接 max-lifetime: 1800000 # 連接最長存活30分鐘小于RDS的300秒 keepalive-time: 30000 # 每30秒發(fā)一次心跳包 minimum-idle: 5 maximum-pool-size: 20驗(yàn)證是否生效啟動(dòng)項(xiàng)目后執(zhí)行show processlist;查看 MySQL 連接應(yīng)看到Sleep狀態(tài)連接持續(xù)存在且Time字段不會歸零。提示max-lifetime必須小于云數(shù)據(jù)庫的wait_timeout值通常為 300 秒。若設(shè)為 36000001小時(shí)連接池會復(fù)用已斷開的連接導(dǎo)致后續(xù)請求報(bào)錯(cuò)。本文還有配套的精品資源點(diǎn)擊獲取