# seckill
SSM(spring+spring_mybatis)实现高并发秒杀系统,包含详细笔记
## 1、整体业务分析
1)展示商品所有列表;
![image-20200402170951943](assets/image-20200402170951943.png)
2)点击链接进入商品详情页;
## ![image-20200402170653798](assets/image-20200402170653798.png)
![image-20200402171017154](assets/image-20200402171017154.png)
![image-20200402171044948](assets/image-20200402171044948.png)
![image-20200402171101994](assets/image-20200402171101994.png)
## 2、DAO层设计与开发
### 2.1 Mysql&&NoSQL
关系型数据库(Mysql/Oracle/SqlServer等)和非关系型数据库(HBase/redis/mongoDB/Neo4j等)。
关系型和非关系型数据库的主要差异是数据存储的方式,关系型数据天然就是表格式的,非关系型数据是基于键值对的,通常存储在数据集中,就像文档、键值对或者图结构,所有非关系型数据存储天然就是分布式的,其真正的价值在操作的扩展性和大数据量处理。
SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务,其在事务性操作上性能和稳定性比NoSQL好很多。并且目前事务机制是目前最可靠的落地方案。
### 2.2 Mysql实现秒杀业务的难点
当多个用户同时参与到秒杀活动时,会出现“竞争”,对于Mysql来说难点在于"事务+行级锁"
`start transaction`
`update 库存数量`**(出现竞争,行级锁:一条事务执行,其余事务全部在等待,直到commit)**
`insert 购买明细`
`Commit`
*<u>该问题在高并发部分解决!</u>*
### 2.3 数据库设计
将DDL(数据库定义语言)卸载了“/sql/sechema.sql”文件中,再对数据库进行操作。
建立一个seckill数据库,2张表:seckill、success_killed
### 2.4 Mybatis实现DAO理论
Mybatis主要特点在于:参数 + SQL = Entity/List
Mybatis在哪些SQL:XML提供SQL
Mybaits如何实现接口: Mapper自动实现DAO接口, 通过Dao找Mapper文件下的同名的SQL语句,一个Dao对 应一个Mapper
### 2.5 Mybatis整合Spring理论
整合目标:更少的编码(只写接口不写实现类);
更少的配置(1、使用别名,通过org.seckill.entity包扫描将 org.seckill.entity.Seckill—>Seckill
2、配置扫描,扫描sql配置文件:mapper需要的xml文件
3、dao的实现,自动实现dao接口,自动注入spring容器);
足够的灵活性(可以自己定义SQL语句、可以自由的通过表达式传递参数,最终实现结果集自动赋 值。)
### 2.6 DAO实体/接口设计以及基于Mybatis实现
(1)配置Mybatis全局属性"resources/mybatis-config.xml"。
(2)**将数据库中的表——>Java中entity实体(org.seckill.entity),将表中的列与实体类中的属性一一对应**
如果业务逻辑中出现**多对一**的情况,需要在多方的实体类中定义一方的实体类。在秒杀系统中多个成功秒杀的实体对应的是同一个秒杀对象实体,所在在SuccessKilled类中定义Seckill实体类:private Seckill seckill。
(3)实体类对应的接口设计,常用的是实体下的增删改查操作。(**org.seckill.dao**)
(4)为DAO接口的方法提供SQL语句:"resources/mapper/*.xml",namespace对应文件路径,id对应方法名,resultType对应返回值类型,parameterType对应参数类型,当出现多个参数的时候,接口方法中需要对参数进行注解,比如(@Param("seckillId") long seckillId, @Param("killTime")Date killTime)。
(5)Spring整合Mybatis,相关文件“resources/jdbc.properties”和“resources/spring/spring-dao”
配置数据库相关参数“resources/jdbc.properties”、 数据库池连接、**配置sqlSessionFactory对象**、配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中
## 3、Service层开发
### 3.1 秒杀Service接口设计
(1)业务接口要站在使用者的角度设置接口。
从三个方面入手:方法定义的粒度(从用户操作的角度入手,一般每个button都会对应一个方法)、参数(越简练越好)、返回类型(return 类型/异常)。
(2)service需要的package
service包:用来存放service接口及其实现类"./service/Impl/SeckillServiceImpl";
exception包:存放service接口所需要的一些异常,比如重复秒杀、秒杀结束、内部错误等;
dto包:数据传输包 ,存放一个service和web之前的数据传递。
### 3.2 Spring IOC整合Service
Spring会通过对象工厂和依赖管理实现一个一致性的访问接口。
IOC的优点:对象创建统一托管、规范的生命周期管理、灵活的依赖注入、一致的获取对象(从容器中一致获取) 。
Spring IOC 的注入方式:XML(用bean来实现第三方类库,如DataSource, 需要命名空间配置,如context、aop、mvc等),注解(项目中自身开发使用的类,可以在代码中使用注解,如@Service @Controller等)、java配置类(自定义修改类库,不建议)。
本项目中IOC使用:XML配置——>package-scan包扫描(**扫描service包下所有使用注解的类型,这些类由Spring统一托管,不需要新建而是自动加载对象的实例到Spring 容器中**)——>Annotation注解(默认使用注解来管理事务行为)
### ![image-20200402142114095](assets/image-20200402142114095.png)
### 3.3 声明式事务运用
对事务的处理交由Spring进行统一的管理,当你的业务方法不发生异常(或者发生异常,但该异常也被配置信息允许提交事务)时,Spring就会让事务管理器提交事务,而发生异常(并且该异常不被你的配置信息所允许提交事务)时,则让事务管理器回滚事务。
注意try..catch..中的异常,Spring 可能感知不到。
采用注解的方式实现声明式事务@Transactional
```
使用注解控制事务方法的优点:
1、开发团队达成一直约定,约定明确标注事务方法的编程风格。
2、保证事务方法的执行时间尽可能短,不要穿插其他的网络操作(RPC/HTTP请求),或者剥离/封装到方法外面。
3、不是所有的方法都需要事务,如只有一条修改操作、只读操作。
```
## 4、Web层开发
### 4.1 Restful接口设计与使用
一种优雅的URI表达方式、能表示资源的状态(名词)和状态的转移。
GET用于查询操作,POST用于添加和修改操作,PUT用于修改操作,DELETE用于删除操作
URL设计:/模块/资源/{标志}/集合1/... 如:/user/{uid}/friends 好友列表
![image-20200402150122102](assets/image-20200402150122102.png)
### 4.2 Spring MVC 框架运作流程
#### 4.2.1 Spring MVC理论
![image-20200402150528468](assets/image-20200402150528468.png)
返回一个页面
```java
@RequestMapping(value = "/{seckillId}/detail", method = RequestMethod.GET)
public String detail(@PathVariable("seckillId") Long seckillId, Model model) {
if (null == seckillId) {
return "redirect:/seckill/list";
}
Seckill seckill = seckillService.getById(seckillId);
if (null == seckill) {
return "forward:/seckill/list";
}
model.addAttribute("seckill", seckill);//承载最终要返回给用户的数据,返回Seckill类数据
return "detail";//view,在spring-web1里面配置
}
```
返回一个json(**现在大部分开发使用的方法**)
```java
@RequestMapping(value = "/{seckillId}/exposer",
method = {RequestMethod.POST,RequestMethod.GET},
produces = {"application/json;charset=utf-8"})
@ResponseBody //最后数据会封装成一个json,返回json数据
public SeckillResult<Exposer> ex
![avatar](https://profile-avatar.csdnimg.cn/6b2ea2d510824682ac2af676104b9caf_abackcab.jpg!1)
毕业小助手
- 粉丝: 2767
- 资源: 5583
最新资源
- 被忽视的成本:中国城市扩张导致的生态系统服务损失从三耦合的角度来看
- 永磁同步电机PMSM参数辨识的粒子群优化算法实现流程解析与案例探索,基于粒子群优化算法的PMSM参数精准辨识与迭代更新策略,基于粒子群优化算法的永磁同步电机PMSM参数辨识 关键词:永磁同步电机 粒子
- 揭示城市扩张对植被碳的影响封存能力-以长江经济带为例(软件翻译)
- 双馈风电机组与同步发电机组四机两区域Simulink仿真建模及风光储联合调频与多种控制策略结合混合储能技术研究,双馈风电机组与同步发电机组四机两区域Simulink仿真建模及风光储联合调频控制策略,混
- 电气安装工 初级工.pdf
- 清华大学:普通人如何抓住DeepSeek红利
- Swift 编程语言的入门教程,适合零基础或有一定编程经验的读者快速上手
- 清华出品(104页)DeepSeek从入门到精通
- DeepSeek指导手册(24页)
- 研究机翼在不同速度下产生的噪音和性能表现
- JimuFlow RPA工具MacOS版v1.0.0
- MATLAB滚动轴承故障机理建模与仿真分析:基于ODE45的数值计算与多类型故障诊断预测研究,MATLAB轴承动力学模拟:滚动轴承故障机理建模与数值计算,多故障类型模拟及数据分析报告(含故障类型识别与
- 基于改进Relief算法的特征选取与关联向量机在短期负荷预测中的Matlab应用复现,基于改进Relief算法的特征选取与关联向量机在短期负荷预测中的实践(Matlab复现),相关向量机和特征选取技术
- COMSOL模拟技术揭秘:金属合金凝固过程及连铸工艺精确分析-相场流场与温度场的综合运用探究坯壳厚度计算,金属合金凝固与连铸过程数值模拟:相场流场温度场分析下的坯壳厚度计算,comsol数值模拟
- JimuFlow RPA工具Ubuntu版v1.0.0
- 煤层瓦斯渗透扩散与煤体孔隙裂隙二重介质特性研究-基于修正的P-M渗透率模型与气固耦合效应的模拟分析,煤层瓦斯渗透扩散的深部采煤模型研究:建立孔隙裂隙二重介质特性P-M渗透率模型与气固耦合模型的解析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)