1. 接手商城项目后的第一件事:别急着启动,先把环境盘清楚
先说个我自己的经历。去年接了一个二手商城项目的维护和二次开发,代码是从前一个团队手里转过来的,技术栈是 Spring Boot + MySQL + Redis + Nginx,前端用的是 Vue。拿到代码那天,我以为环境部署这种体力活两小时就能搞定——JDK 装上,MySQL 起来,npm install 一下,数据库导入,完事。结果当天从下午两点折腾到晚上十一点,中间大部分时间都耗在了环境上,真正看业务代码的时间不到一小时。
后来我把整个过程的坑逐一记录下来,再结合后来在多个项目里的部署经验,整理成了一套比较稳妥的流程。这篇文章就是围绕“商城项目的环境部署和数据查询”这条主线来写的,适合刚接触商城类项目、打算自己从零搭一套环境跑通前后端的新手,也适合那些跟我一样经常被环境问题折磨、想找一份“避坑手册”的开发者。
先说一个最核心的结论:商城项目的环境部署,难点不在“安装软件”,而在“版本匹配”和“组件之间的协作关系”。JDK 版本不一致会让项目启动直接报错;MySQL 字符集没配好,商品详情页的中文标题会变成问号;Redis 没设置密码,生产环境随时可能被写入垃圾数据;docker-compose 里依赖顺序不对,服务启动后数据库还没就绪,后端应用启动三次必挂一次。这些问题都不是什么高深的技术,但它们就是会拦住你。
我在这篇文章里会把环境部署拆成两部分来讲:第一部分是传统方式(本机直接装 JDK、MySQL、Redis),适合本地开发和调试;第二部分是基于 docker-compose 的容器化部署,适合测试环境以及正式上线的场景。然后会重点讲数据查询,也就是数据库表结构设计、索引优化、慢查询排查这套东西——因为商城项目一旦跑起来,环境部署的问题会被掩盖,数据查询的性能问题才是真正影响用户体验的拦路虎。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 传统方式部署商城项目:JDK、MySQL、Redis 的版本匹配陷阱
2.1 JDK 环境:并非“装个 Java 就能跑”
商城后端最常见的技术栈是 Java。而 Java 环境部署不像想象中的“装完就结束”,它有几个特别容易踩的坑。
第一个坑是 JDK 版本。很多商城项目用的是 Spring Boot 2.x,这个版本对 Java 8 的支持最稳定,也能跑在 Java 11 上,但部分依赖在 Java 11 下面会有兼容问题,尤其是那些早期写的自定义类加载器或反射代码。而我接手那个项目,代码里有个旧的加密工具类,在高版本 JDK 下反射访问私有字段直接抛 InaccessibleObjectException,找人查了半天才发现是 JDK 版本的问题。所以我现在的习惯是:拿到代码第一时间看 pom.xml 里 Spring Boot 的版本,再决定上哪个 JDK。Spring Boot 2.2.x 之前,老老实实用 JDK 8;2.3.x 之后可以用 JDK 11;如果你拿到的是 Spring Boot 3.x 的项目,那 JDK 17 是跑不掉的。
第二个坑是环境变量。不要以为安装完 JDK 就算环境配好了。JAVA_HOME、PATH、CLASSPATH 三个变量都得检查。我在另一台服务器上部署一个老商城项目时,明明已经用 java -version 确认了版本是 1.8,但启动脚本就是报 UnsupportedClassVersionError。查到最后发现,脚本里写的 JAVA_HOME 指向的是另一个 JDK 目录,版本是 17,而 PATH 里的 java 命令从 alternatives 链接到了 1.8,两边不一致导致混乱。
正确的检查方式是同时执行三条命令:
bash复制java -version
echo $JAVA_HOME
which java
如果 JAVA_HOME 为空或者跟 which java 指向的目录不一致,配置就会出问题。在 /etc/profile 或 ~/.bashrc 里加上:
bash复制export JAVA_HOME=/usr/local/jdk1.8.0_202
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
第三个坑是 Maven。商城项目通常有几十个依赖,本地仓库如果之前没拉过相关包,第一次构建会很慢。这时候不要干等,先检查 Maven 的 settings.xml 里有没有配置阿里云镜像:
xml复制<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
我当时就是没配镜像,一个商城项目光下载依赖就花了四十分钟,中途还因为网络波动断了两次。配置完镜像后同样的项目两分钟就拉完了。
2.2 MySQL 初始化:字符集和数据导入
商城项目的数据库部署,一个容易被忽略的是字符集。MySQL 8.0 默认字符集是 utf8mb4,但如果你用的是 5.7 版本,默认字符集可能是 latin1,导入有中文注释的 sql 文件会出现乱码,更麻烦的是商品表里的中文数据会变成问号存进去。
所以建库之前务必显式指定字符集:
sql复制CREATE DATABASE mall CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
这里解释一下为什么要用 utf8mb4 而不只是 utf8。MySQL 里的 utf8 是“阉割版”,最多只能存三个字节的字符,像 emoji 表情这种四个字节的字符直接存不进去。商城项目里的用户昵称、商品评价这种字段,用户真的会往里面放 emoji,你拦都拦不住。用 utf8mb4 就没有这个限制。
还有一个细节是时区。如果你在连接串里不加 serverTimezone 参数,Spring Boot 连接 MySQL 8.0 时经常报 The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized。解决办法是在连接串后面加上:
properties复制jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
allowPublicKeyRetrieval=true 这个是 MySQL 8.0 的新参数,不加的话 JDBC 客户端在某些安全策略下会报 caching_sha2_password 相关的错误。还有,驱动版本要跟数据库版本对应,MySQL 8.0 数据库至少要用 mysql-connector-java 8.0.x 驱动。
导入 sql 文件的时候我建议用命令行方式而不是图形化工具:
bash复制mysql -uroot -p --default-character-set=utf8mb4 mall < /data/sql/mall_init.sql
导入完成后,可以顺手验证一下表数据:
sql复制SELECT id, name FROM mall_product LIMIT 5;
如果中文显示正常,说明字符集没问题;如果显示问号,先检查 sql 文件本身的编码格式,用 file 命令查看,确保是 UTF-
