這是一個(gè)整合IDEA+Maven+SSM框架的高并發(fā)的商品秒殺項(xiàng)目。我們將分為以下幾篇文章來(lái)進(jìn)行詳細(xì)的講解:
項(xiàng)目的效果圖 秒殺商品列表 開(kāi)始秒殺提示界面 秒殺結(jié)束提示界面 新建一個(gè)Maven項(xiàng)目 以IntelliJ IDEA為例,點(diǎn)擊File > New > Project > Maven 然后點(diǎn)擊Next繼續(xù); 填寫(xiě)相關(guān)信息,點(diǎn)擊Next; 最后點(diǎn)擊Finish,完成創(chuàng)建。 如果右下角彈出下面這個(gè)提示,點(diǎn)擊Enable Auto-Import 創(chuàng)建webapp目錄 點(diǎn)擊File > Project Structure 步驟1 步驟2 步驟3 步驟4 步驟5 步驟6 步驟7 步驟8 構(gòu)建pom文件 Maven項(xiàng)目創(chuàng)建好了,接下來(lái)我們要添加一些jar包的依賴,也就是在pom.xml中添加各種開(kāi)源組件的坐標(biāo)。 完整的代碼,請(qǐng)查看項(xiàng)目里的pom.xml文件 到此,我們項(xiàng)目的初始化工作完成。 秒殺系統(tǒng)業(yè)務(wù)分析 秒殺系統(tǒng)業(yè)務(wù)流程如下: 由圖可以發(fā)現(xiàn),整個(gè)系統(tǒng)其實(shí)是針對(duì)庫(kù)存做的系統(tǒng)。用戶成功秒殺商品,對(duì)于我們系統(tǒng)的操作就是:
記錄用戶的秒殺成功信息,我們需要記錄:1、誰(shuí)購(gòu)買成功了。2、購(gòu)買成功的時(shí)間/有效期。3、付款/發(fā)貨信息。這些數(shù)據(jù)組成了用戶的秒殺成功信息,也就是用戶的購(gòu)買行為。 為什么我們的系統(tǒng)需要事務(wù)?看如下這些故障:1、若是用戶成功秒殺商品我們記錄了其購(gòu)買明細(xì)卻沒(méi)有減庫(kù)存。導(dǎo)致商品的超賣。2、減了庫(kù)存卻沒(méi)有記錄用戶的購(gòu)買明細(xì)。導(dǎo)致商品的少賣。對(duì)于上述兩個(gè)故障,若是沒(méi)有事務(wù)的支持,損失最大的無(wú)疑是我們的用戶和商家。在MySQL中,它內(nèi)置的事務(wù)機(jī)制,可以準(zhǔn)確的幫我們完成減庫(kù)存和記錄用戶購(gòu)買明細(xì)的過(guò)程。 MySQL實(shí)現(xiàn)秒殺的難點(diǎn)分析:當(dāng)用戶A秒殺id為10的商品時(shí),此時(shí)MySQL需要進(jìn)行的操作是:1、開(kāi)啟事務(wù)。2、更新商品的庫(kù)存信息。3、添加用戶的購(gòu)買明細(xì),包括用戶秒殺的商品id以及唯一標(biāo)識(shí)用戶身份的信息如電話號(hào)碼等。4、提交事務(wù)。若此時(shí)有另一個(gè)用戶B也在秒殺這件id為10的商品,他就需要等待,等待到用戶A成功秒殺到這件商品然后MySQL成功的提交了事務(wù)他才能拿到這個(gè)id為10的商品的鎖從而進(jìn)行秒殺,而同一時(shí)間是不可能只有用戶B在等待,肯定是有很多很多的用戶都在等待拿到這個(gè)行級(jí)鎖。秒殺的難點(diǎn)就在這里,如何高效的處理這些競(jìng)爭(zhēng)?如何高效的完成事務(wù)?在后面第4個(gè)模塊如何進(jìn)行高并發(fā)的優(yōu)化為大家講解。 我們這個(gè)系統(tǒng)需要完成秒殺的哪些功能?先來(lái)看看天貓的一個(gè)秒殺庫(kù)存系統(tǒng): 大家看了是不是覺(jué)得很復(fù)雜?當(dāng)然不用擔(dān)心,我們只是實(shí)現(xiàn)秒殺的一些功能:1、秒殺接口的暴露。2、執(zhí)行秒殺的操作。3、相關(guān)查詢,比如說(shuō)列表查詢,詳情頁(yè)查詢。我們實(shí)現(xiàn)這三個(gè)功能即可。接下來(lái)進(jìn)行具體的編碼工作,首先是建立數(shù)據(jù)庫(kù)以及Dao層的編碼。 建立數(shù)據(jù)庫(kù) 完整的數(shù)據(jù)庫(kù)sql代碼,在項(xiàng)目的sql文件夾里的ngu_seckill.sql 創(chuàng)建實(shí)體類 先創(chuàng)建秒殺商品類com/nnngu/entity/Seckill.java 創(chuàng)建秒殺狀態(tài)類com/nnngu/entity/SuccessKilled.java 為實(shí)體類創(chuàng)建對(duì)應(yīng)的mapper接口,也就是dao接口 com/nnngu/dao/SeckillMapper.java com/nnngu/dao/SuccessKilledMapper.java 創(chuàng)建對(duì)應(yīng)的mapper.xml在resources目錄下創(chuàng)建com.nnngu.dao包,然后創(chuàng)建SeckillMapper.xml和SuccessKilledMapper.xml,如下圖: 創(chuàng)建Mybatis的配置文件mybatis-config.xml mybatis-config.xml配置文件的內(nèi)容參照項(xiàng)目的源代碼 建立連接數(shù)據(jù)庫(kù)的配置文件jdbc.properties 注意: jdbc.properties 建立Spring的dao的配置文件 創(chuàng)建applicationContext-dao.xml如下圖: applicationContext-dao.xml 文件的具體代碼請(qǐng)參照項(xiàng)目的源代碼。 測(cè)試 創(chuàng)建測(cè)試類com/nnngu/dao/SeckillMapperTest.java 該文件的具體代碼請(qǐng)參照項(xiàng)目的源代碼。 測(cè)試結(jié)果 測(cè)試查詢所有商品的方法queryAll() 測(cè)試結(jié)果如下: 到此,我們成功完成了Dao層開(kāi)發(fā)及測(cè)試。 源代碼請(qǐng)復(fù)制下鏈接: data:text/html;charset=UTF-8;base64, 5p625p6E5biI5a2m5Lmg5Lqk5rWB576k5Y+35pivNTc1NzUxODU0Cg== 復(fù)制粘貼在網(wǎng)站即可! |
|
來(lái)自: Frank_Chia > 《JAVA》