程序員的頓悟
這次寫一篇與代碼優(yōu)化相關(guān)的難忘經(jīng)歷 ① 第一次是產(chǎn)品覺得功能列表顯示很慢,但部門不太忙,只剩下我一個(gè)人,所以讓我優(yōu)化。作為一個(gè)工作時(shí)間不長(zhǎng)的新人,我的心仍然很困惑。我首先定位了相關(guān)的業(yè)務(wù)代碼,發(fā)現(xiàn)有很多表需要查詢,需要查詢的數(shù)據(jù)需要處理。因此,斷點(diǎn)位于一些較慢的地方。果不其然,其中一種查詢數(shù)據(jù)庫的方法速度特別慢。在我的腦海中,我瘋狂地回憶起當(dāng)時(shí)記憶中的SQL優(yōu)化。取出SQL后,我發(fā)現(xiàn)查詢是針對(duì)整個(gè)表數(shù)據(jù)的,沒有使用傳遞的參數(shù),但方法傳遞的參數(shù)顯然包括在內(nèi),對(duì)吧??我一步一步地查看了SQL連接,最終發(fā)現(xiàn)查詢條件沒有連接,導(dǎo)致查詢整個(gè)表數(shù)據(jù)。此外,隨后的處理也是從整個(gè)表數(shù)據(jù)中進(jìn)行過濾和處理 改裝后,速度確實(shí)更快了,但仍然沒有達(dá)到產(chǎn)品的預(yù)期。因此,使用多線程來使用不同的線程查詢不同的表,并使用CountDownLatch來控制線程,以便在執(zhí)行下一步之前完成所有數(shù)據(jù)查詢。修改后速度快多了 在使用多線程時(shí),注意線程安全問題很重要,因?yàn)槲覀円郧坝龅竭^每次查詢的數(shù)據(jù)總是較少。最后,我們使用了Collections。synchronizedList(new ArrayList<>)以確保集合的安全 ② 第二次是數(shù)據(jù)量太大,無法在前端顯示,所以我們通過導(dǎo)出HTML對(duì)其進(jìn)行了優(yōu)化。起初,我只需要修改后端返回到前端的結(jié)構(gòu)。由于它是一個(gè)樹結(jié)構(gòu),我們使用了遞歸。在遞歸之前,我們首先使用Java的流流根據(jù)父ID對(duì)數(shù)據(jù)進(jìn)行分組。這樣,在遞歸過程中,我們可以直接根據(jù)父ID找到相應(yīng)的集合,而不必每次遍歷整個(gè)集合。 當(dāng)前端調(diào)用時(shí),發(fā)現(xiàn)超過300000個(gè)數(shù)據(jù)卡在數(shù)據(jù)庫查詢中,無法進(jìn)行我編寫的遞歸 所以我在Oracle數(shù)據(jù)庫中使用了rownum()方法,每次查詢數(shù)以萬計(jì)的項(xiàng)目,并進(jìn)行批量查詢。為了確保數(shù)據(jù)不重復(fù),我需要按ID進(jìn)行排序,這可能很慢,但可以生成。至于進(jìn)一步的優(yōu)化,我將使用線程,但由于它已經(jīng)可以生成,因此沒有必要對(duì)其進(jìn)行優(yōu)化。 關(guān)于優(yōu)化,到目前為止,我接觸到的基本上是數(shù)據(jù)庫方面的SQL優(yōu)化,創(chuàng)建索引,在業(yè)務(wù)中使用多線程(注意線程安全),以及通過添加服務(wù)器部署集群進(jìn)行部署。至于Jvm優(yōu)化,我還沒有學(xué)會(huì)這些更高級(jí)的方法。
¥ 議價(jià)
1、標(biāo)的信息為賣家提供,中介網(wǎng)不對(duì)該信息真實(shí)性或準(zhǔn)確性作保證。
2、若需查詢更多信息請(qǐng)聯(lián)系中介網(wǎng)經(jīng)紀(jì)人核實(shí)。
3、為了安全起見,不要輕易與賣家進(jìn)行線下交易;非平臺(tái)線上中介的項(xiàng)目,出現(xiàn)任何后果均與中介網(wǎng)無關(guān),無論賣家以任何理由要求線下交易的,請(qǐng)聯(lián)系中介網(wǎng)經(jīng)紀(jì)人舉報(bào)。


















