01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

nnngu發表於2018-01-30

Github:github.com/nnngu
專案原始碼:github.com/nnngu/nguSe…


這是一個整合IDEA+Maven+SSM框架的高併發的商品秒殺專案。我們將分為以下幾篇文章來進行詳細的講解:

  • 01 Java高併發秒殺專案之業務分析與DAO層
  • 02 Java高併發秒殺專案之Service層
  • 03 Java高併發秒殺專案之web層
  • 04 Java高併發秒殺專案之高併發優化

專案的效果圖

秒殺商品列表

秒殺商品列表

開始秒殺提示介面

開始秒殺提示介面

秒殺結束提示介面

秒殺結束提示介面

新建一個Maven專案

以IntelliJ IDEA為例,點選File > New > Project > Maven

然後點選Next繼續;

然後點選Next繼續;

填寫相關資訊,點選Next;

填寫相關資訊,點選Next;

最後點選Finish,完成建立。

最後點選Finish,完成建立。

如果右下角彈出下面這個提示,點選Enable Auto-Import

如果彈出這個提示,點選Enable Auto-Import

建立webapp目錄

點選File > Project Structure

步驟1

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

步驟2

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

步驟3

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

步驟4

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

步驟5

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

步驟6

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

步驟7

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

步驟8

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

構建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檔案

到此,我們專案的初始化工作完成。

秒殺系統業務分析

秒殺系統業務流程如下:

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

由圖可以發現,整個系統其實是針對庫存做的系統。使用者成功秒殺商品,對於我們系統的操作就是:

  1. 減庫存

  2. 記錄使用者的購買明細。下面看看我們使用者對庫存的業務分析:

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

記錄使用者的秒殺成功資訊,我們需要記錄: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個模組如何進行高併發的優化為大家講解。

我們這個系統需要完成秒殺的哪些功能?先來看看天貓的一個秒殺庫存系統:

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

大家看了是不是覺得很複雜?當然不用擔心,我們只是實現秒殺的一些功能: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.xmlSuccessKilledMapper.xml,如下圖:

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

com.nnngu.dao/SeckillMapper.xml

<!-- 這裡的程式碼省略 -->
<!-- 請參照專案的原始碼 -->
複製程式碼

com.nnngu.dao/SuccessKilledMapper.xml

<!-- 這裡的程式碼省略 -->
<!-- 請參照專案的原始碼 -->
複製程式碼

建立Mybatis的配置檔案mybatis-config.xml

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

mybatis-config.xml配置檔案的內容參照專案的原始碼

建立連線資料庫的配置檔案jdbc.properties

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

注意: jdbc.properties 裡面的屬性要根據自己的情況進行修改。

建立Spring的dao的配置檔案

建立applicationContext-dao.xml如下圖:

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

applicationContext-dao.xml檔案的具體程式碼請參照專案的原始碼。

測試

建立測試類 com/nnngu/dao/SeckillMapperTest.java 如下圖:

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

該檔案的具體程式碼請參照專案的原始碼。

測試結果

測試查詢所有商品的方法queryAll()

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

測試結果如下:

01 整合IDEA+Maven+SSM框架的高併發的商品秒殺專案之業務分析與DAO層

到此,我們成功完成了Dao層開發及測試。下篇文章 02 Java高併發秒殺專案之Service層

相關文章