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