Github: https://github.com/nnngu
项目源代码: https://github.com/nnngu/nguSeckill
这是一个整合 IDEA+Maven+SSM 框架的高并发的商品秒杀项目. 我们将分为以下几篇文章来进行详细的讲解:
01 Java 高并发秒杀项目之业务分析与 DAO 层
02 Java 高并发秒杀项目之 Service 层
03 Java 高并发秒杀项目之 web 层
04 Java 高并发秒杀项目之高并发优化
项目的效果图
秒杀商品列表
秒杀未开始 (此时正在倒计时)
开始秒杀提示界面
秒杀结束提示界面
新建一个 Maven 项目
以 IntelliJ IDEA 为例, 点击
File> New> Project> Maven
然后点击 Next 继续;
填写相关信息, 点击 Next;
最后点击 Finish, 完成创建.
如果右下角弹出下面这个提示, 点击 Enable Auto-Import
创建 webapp 目录
点击
File> Project Structure
步骤 1
步骤 2
步骤 3
步骤 4
步骤 5
步骤 6
步骤 7
步骤 8
构建 pom 文件
Maven 项目创建好了, 接下来我们要添加一些 jar 包的依赖, 也就是在 pom.xml 中添加各种开源组件的坐标.
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.nnngu</groupId>
- <artifactId>nguSeckill</artifactId>
- <version>1.0-SNAPSHOT</version>
- <!-- 代码省略, 请参照项目的源代码 -->
- ... ...
完整的代码, 请查看项目里的 pom.xml 文件
到此, 我们项目的初始化工作完成.
秒杀系统业务分析
秒杀系统业务流程如下:
由图可以发现, 整个系统其实是针对库存做的系统. 用户成功秒杀商品, 对于我们系统的操作就是:
减库存
记录用户的购买明细. 下面看看我们用户对库存的业务分析:
记录用户的秒杀成功信息, 我们需要记录: 1, 谁购买成功了. 2, 购买成功的时间 / 有效期. 3, 付款 / 发货信息. 这些数据组成了用户的秒杀成功信息, 也就是用户的购买行为.
为什么我们的系统需要事务? 看如下这些故障: 1, 若是用户成功秒杀商品我们记录了其购买明细却没有减库存. 导致商品的超卖. 2, 减了库存却没有记录用户的购买明细. 导致商品的少卖. 对于上述两个故障, 若是没有事务的支持, 损失最大的无疑是我们的用户和商家. 在 MySQL 中, 它内置的事务机制, 可以准确的帮我们完成减库存和记录用户购买明细的过程.
MySQL 实现秒杀的难点分析: 当用户 A 秒杀 id 为 10 的商品时, 此时 MySQL 需要进行的操作是: 1, 开启事务. 2, 更新商品的库存信息. 3, 添加用户的购买明细, 包括用户秒杀的商品 id 以及唯一标识用户身份的信息如电话号码等. 4, 提交事务. 若此时有另一个用户 B 也在秒杀这件 id 为 10 的商品, 他就需要等待, 等待到用户 A 成功秒杀到这件商品然后 MySQL 成功的提交了事务他才能拿到这个 id 为 10 的商品的锁从而进行秒杀, 而同一时间是不可能只有用户 B 在等待, 肯定是有很多很多的用户都在等待拿到这个行级锁. 秒杀的难点就在这里, 如何高效的处理这些竞争? 如何高效的完成事务? 在后面第 4 个模块如何进行高并发的优化为大家讲解.
我们这个系统需要完成秒杀的哪些功能? 先来看看天猫的一个秒杀库存系统:
大家看了是不是觉得很复杂? 当然不用担心, 我们只是实现秒杀的一些功能: 1, 秒杀接口的暴露. 2, 执行秒杀的操作. 3, 相关查询, 比如说列表查询, 详情页查询. 我们实现这三个功能即可. 接下来进行具体的编码工作, 首先是建立数据库以及 Dao 层的编码.
建立数据库
-- 创建一个数据库
CREATE DATABASE ngu_seckill;
-- 使用数据库
USE ngu_seckill;
-- 省略...
... ...
完整的数据库 sql 代码, 在项目的 sql 文件夹里的 ngu_seckill.sql
创建实体类
先创建秒杀商品类
com/nnngu/entity/Seckill.java
- package com.nnngu.entity;
- import java.io.Serializable;
- import java.time.LocalDateTime;
- /**
- * 秒杀商品
- */
- public class Seckill implements Serializable {
- private static final long serialVersionUID = 2912164127598660137L;
- /* 主键 ID*/
- private long seckillId;
- /* 秒杀商品名字 */
- private String name;
- /* 代码省略, 请参照项目的源代码 */
- ... ...
创建秒杀状态类
com/nnngu/entity/SuccessKilled.java
- package com.nnngu.entity;
- import java.io.Serializable;
- import java.time.LocalDateTime;
- /**
- * 秒杀后的状态
- */
- public class SuccessKilled implements Serializable {
- private static final long serialVersionUID = 1834437127882846202L;
- private long seckillId;
- /* 用户的手机号码 */
- private long userPhone;
- /* 代码省略, 请参照项目的源代码 */
- ... ...
为实体类创建对应的 mapper 接口, 也就是 dao 接口
com/nnngu/dao/SeckillMapper.java
- package com.nnngu.dao;
- import com.nnngu.entity.Seckill;
- import org.apache.ibatis.annotations.Param;
- import java.time.LocalDateTime;
- import java.util.List;
- import java.util.Map;
- public interface SeckillMapper {
- /* 代码省略, 请参照项目的源代码 */
- ... ...
- }
- com/nnngu/dao/SuccessKilledMapper.java
- package com.nnngu.dao;
- import com.nnngu.entity.SuccessKilled;
- import org.apache.ibatis.annotations.Param;
- public interface SuccessKilledMapper {
- /* 代码省略, 请参照项目的源代码 */
- ... ...
- }
创建对应的 mapper.xml
在 resources 目录下创建 com.nnngu.dao 包, 然后创建 SeckillMapper.xml 和
SuccessKilledMapper.xml
, 如下图:
com.nnngu.dao/SeckillMapper.xml
- <!-- 这里的代码省略 -->
- <!-- 请参照项目的源代码 -->
- com.nnngu.dao/SuccessKilledMapper.xml
- <!-- 这里的代码省略 -->
- <!-- 请参照项目的源代码 -->
创建 Mybatis 的配置文件 mybatis-config.xml
mybatis-config.xml 配置文件的内容参照项目的源代码
建立连接数据库的配置文件 jdbc.properties
注意: jdbc.properties 里面的属性要根据自己的情况进行修改.
建立 Spring 的 dao 的配置文件
创建
applicationContext-dao.xml
如下图:
applicationContext-dao.xml
文件的具体代码请参照项目的源代码.
测试
创建测试类
com/nnngu/dao/SeckillMapperTest.java
如下图:
该文件的具体代码请参照项目的源代码.
测试结果
测试查询所有商品的方法 queryAll()
测试结果如下:
到此, 我们成功完成了 Dao 层开发及测试. 下篇文章 02 Java 高并发秒杀项目之 Service 层
https://github.com/nnngu/LearningNotes/blob/master/nguSeckill/02 Java高并发秒杀项目之Service层.md
来源: https://cloud.tencent.com/developer/article/1035848?fromSource=waitui