www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]作者|?LianyouCQ,LeoXu,yale8848,開(kāi)源中國(guó)駐聯(lián)合國(guó)理事,super0555來(lái)源|?https://www.oschina.net/translate/10-common-mistakes-java-developers-make-when-writing-...

作者 |?LianyouCQ, LeoXu, yale8848, 開(kāi)源中國(guó)駐聯(lián)合國(guó)理事, super0555

來(lái)源 |?https://www.oschina.net/translate/10-common-mistakes-java-developers-make-when-writing-sqlJava程序員編程時(shí)需要混合面向?qū)ο笏季S和一般命令式編程的方法,能否完美的將兩者結(jié)合起來(lái)完全得依靠編程人員的水準(zhǔn):
  • 技能(任何人都能容易學(xué)會(huì)命令式編程)
  • 模式(有些人用“模式-模式”,舉個(gè)例子,模式可以應(yīng)用到任何地方,而且都可以歸為某一類模式)
  • 心境(首先,要寫個(gè)好的面向?qū)ο蟪绦蚴潜让钍匠绦螂y的多,你得花費(fèi)一些功夫)
但當(dāng)Java程序員寫SQL語(yǔ)句時(shí),一切都不一樣了。SQL是說(shuō)明性語(yǔ)言而非面向?qū)ο蠡蚴敲钍骄幊陶Z(yǔ)言。在SQL中要寫個(gè)查詢語(yǔ)句是很簡(jiǎn)單的。但在Java里類似的語(yǔ)句卻不容易,因?yàn)槌绦騿T不僅要反復(fù)考慮編程范式,而且也要考慮算法的問(wèn)題。下面是Java程序員在寫SQL時(shí)常犯的10個(gè)錯(cuò)誤(沒(méi)有特定的順序)。1、忘掉NULLJava程序員寫SQL時(shí)對(duì)NULL的誤解可能是最大的錯(cuò)誤。也許是因?yàn)椋ú⒎俏ㄒ焕碛桑㎞ULL也稱作UNKNOWN。如果被稱作 UNKNOWN,這還好理解些。另一個(gè)原因是,當(dāng)你從數(shù)據(jù)庫(kù)拿東西或是綁定變量時(shí),JDBC將SQL NULL 和Java中的null對(duì)應(yīng)了起來(lái)。這樣導(dǎo)致了NULL = NULL(SQL)和null=null(Java)的誤解。對(duì)于NULL最大的誤解是當(dāng)NULL被用作行值表達(dá)式完整性約束條件時(shí)。另一個(gè)誤解出現(xiàn)在對(duì)于NULL 在 NOT IN anti-joins的應(yīng)用中。解決方法:
  • 好好的訓(xùn)練你自己。當(dāng)你寫SQL時(shí)要不停得想到NULL的用法:
  • 這個(gè)NULL完整性約束條件是正確的?
  • NULL是否影響到結(jié)果?
2、在Java內(nèi)存中處理數(shù)據(jù)很少有Java開(kāi)發(fā)者能將SQL理解的很好。偶爾使用的JOIN,還有古怪的UNION,好吧,但是對(duì)于窗口函數(shù)呢?還有對(duì)集合進(jìn)行分組呢?許多 的Java開(kāi)發(fā)者將SQL數(shù)據(jù)加載到內(nèi)存中,將這些數(shù)據(jù)轉(zhuǎn)換成某些相近的集合類型,然后再那些集合上面使用邊界循環(huán)控制結(jié)構(gòu)(至少在Java8的集合升級(jí) 以前)執(zhí)行令人生厭的數(shù)學(xué)運(yùn)算。但是一些SQL數(shù)據(jù)庫(kù)支持先進(jìn)的(而且是SQL標(biāo)準(zhǔn)支持的)OLAP特性,這一特性表現(xiàn)更好而且寫起來(lái)也更加方便。一個(gè)(并不怎么標(biāo)準(zhǔn)的)例子就 是Oracle超棒的MODEL分句。只讓數(shù)據(jù)庫(kù)來(lái)做處理然后只把結(jié)果帶到Java內(nèi)存中吧。因?yàn)楫吘顾蟹浅B斆鞯募一镆呀?jīng)對(duì)這些昂貴的產(chǎn)品進(jìn)行了優(yōu) 化。因此實(shí)際上,通過(guò)將OLAP移到數(shù)據(jù)庫(kù),你將獲得一下兩項(xiàng)好處:
  • 便利性。這比在Java中編寫正確的SQL可能更加的容易。
  • 性能表現(xiàn)。數(shù)據(jù)庫(kù)應(yīng)該比你的算法處理起來(lái)更加快.而且更加重要的是,你不必再去傳遞數(shù)百萬(wàn)條記錄了。
解決方法:每次你使用Java實(shí)現(xiàn)一個(gè)以數(shù)據(jù)為中心的算法時(shí),問(wèn)問(wèn)自己:有沒(méi)有一種方法可以讓數(shù)據(jù)庫(kù)代替為我做這種麻煩事。Spring Boot 學(xué)習(xí)筆記,這個(gè)分享給你學(xué)習(xí)下。3、使用UNION 代替UNION ALL
  • UNION ALL(允許重復(fù))
  • UNION (去除了重復(fù))
移除重復(fù)行不僅很少需要(有時(shí)甚至是錯(cuò)的),而且對(duì)于帶很多行的大數(shù)據(jù)集合會(huì)相當(dāng)慢,因?yàn)閮蓚€(gè)子select需要排序,而且每個(gè)元組也需要和它的子序列元組比較。注意即使SQL標(biāo)準(zhǔn)規(guī)定了INTERSECT ALL和EXCEPT ALL,很少數(shù)據(jù)庫(kù)會(huì)實(shí)現(xiàn)這些沒(méi)用的集合操作符。解決方法:每次寫UNION語(yǔ)句時(shí),考慮實(shí)際上是否需要UNION ALL語(yǔ)句。4、通過(guò)JDBC分頁(yè)技術(shù)給大量的結(jié)果進(jìn)行分頁(yè)操作大部分的數(shù)據(jù)庫(kù)都會(huì)支持一些分頁(yè)命令實(shí)現(xiàn)分頁(yè)效果,譬如LIMIT..OFFSET,TOP..START AT,OFFSET..FETCH語(yǔ)句等。即使沒(méi)有支持這些語(yǔ)句的數(shù)據(jù)庫(kù),仍有可能對(duì)ROWNUM(Oracle)或者是ROW NUMBER()、OVER()過(guò)濾(DB2、SQL Server2008等),這些比在內(nèi)存中實(shí)現(xiàn)分頁(yè)更快速。在處理大量數(shù)據(jù)中,效果尤其明顯。解決方法:僅僅使用這些語(yǔ)句,那么一個(gè)工具(例如JOOQ)就可以模擬這些語(yǔ)句的操作。
5、在Java內(nèi)存中加入數(shù)據(jù)從SQL的初期開(kāi)始,當(dāng)在SQL中使用JOIN語(yǔ)句時(shí),一些開(kāi)發(fā)者仍舊有不安的感覺(jué)。這是源自對(duì)加入JOIN后會(huì)變慢的固有恐懼。假如基于成本的 優(yōu)化選擇去實(shí)現(xiàn)嵌套循環(huán),在創(chuàng)建一張連接表源前,可能加載所有的表在數(shù)據(jù)庫(kù)內(nèi)存中,這可能是真的。但是這事發(fā)生的概率太低了。通過(guò)合適的預(yù)測(cè),約束和索 引,合并連接和哈希連接的操作都是相當(dāng)?shù)目臁_@完全是是關(guān)于正確元數(shù)據(jù)(在這里我不能夠引用Tom Kyte的太多)。而且,可能仍然有不少的Java開(kāi)發(fā)人員加載兩張表通過(guò)分開(kāi)查詢到一個(gè)映射中,并且在某種程度上把他們加到了內(nèi)存當(dāng)中。解決方法:假如你在各個(gè)步驟中有從各種表的查詢操作,好好想想是否可以表達(dá)你的查詢操作在單條語(yǔ)句中。6、在一個(gè)臨時(shí)的笛卡爾積集合中使用 DISTINCT 或 UNION 消除重復(fù)項(xiàng)通過(guò)復(fù)雜的連接,人們可能會(huì)對(duì)SQL語(yǔ)句中扮演關(guān)鍵角色的所有關(guān)系失去概念。特別的,如果這涉及到多列外鍵關(guān)系的話,很有可能會(huì)忘記在JOIN .. ON子句中增加相關(guān)的判斷。這會(huì)導(dǎo)致重復(fù)的記錄,但或許只是在特殊的情況下。有些開(kāi)發(fā)者因此可能選擇DISTINCT來(lái)消除這些重復(fù)記錄。從三個(gè)方面來(lái)說(shuō) 這是錯(cuò)誤的:
  • 它(也許)解決了表面癥狀但并沒(méi)有解決問(wèn)題。它也有可能無(wú)法解決極端情況下的癥狀。
  • 對(duì)具有很多列的龐大的結(jié)果集合來(lái)說(shuō)它很慢。DISTINCT要執(zhí)行ORDER BY操作來(lái)消除重復(fù)。
  • 對(duì)龐大的笛卡爾積集合來(lái)說(shuō)它很慢,還是需要加載很多的數(shù)據(jù)到內(nèi)存中。
解決方法:根據(jù)經(jīng)驗(yàn),如果你獲得了不需要的重復(fù)記錄,還是檢查你的JOIN判斷吧??赡茉谀硞€(gè)地方有一個(gè)很難覺(jué)察的笛卡爾積集合。7、不使用MERGE語(yǔ)句這并不是一個(gè)過(guò)失,但是可能是缺少知識(shí)或者對(duì)于強(qiáng)悍的MERGE語(yǔ)句信心不足。一些數(shù)據(jù)庫(kù)理解其它形式的更新插入(UPSERT)語(yǔ)句, 如 MYSQL的重復(fù)主鍵更新語(yǔ)句,但是MERGE在數(shù)據(jù)庫(kù)中確是很強(qiáng)大,很重要,以至于大肆擴(kuò)展SQL標(biāo)準(zhǔn),例如SQL SERVER。解決方法:如果你使用像聯(lián)合INSERT和UPDATE或者聯(lián)合SELECT .. FOR UPDATE然后在INSERT或UPDATE等更新插入時(shí),請(qǐng)三思。你完全可以使用一個(gè)更簡(jiǎn)單的MERGE語(yǔ)句來(lái)遠(yuǎn)離冒險(xiǎn)競(jìng)爭(zhēng)條件。2021 最新 Java 面試題出爐!8、使用聚合函數(shù)代替窗口函數(shù)(window functions)在介紹窗口函數(shù)之前,在SQL中聚合數(shù)據(jù)意味著使用GROUP BY語(yǔ)句與聚合函數(shù)相映射。在很多情形下都工作得很好,如聚合數(shù)據(jù)需要濃縮常規(guī)數(shù)據(jù),那么就在join子查詢中使用group查詢。但是在SQL2003中定義了窗口函數(shù),這個(gè)在很多主流數(shù)據(jù)庫(kù)都實(shí)現(xiàn)了它。窗口函數(shù)能夠在結(jié)果集上聚合數(shù)據(jù),但是卻沒(méi)有分組。事實(shí)上,每個(gè)窗口函數(shù)都有自己的、獨(dú)立的PARTITION BY語(yǔ)句,這個(gè)工具對(duì)于顯示報(bào)告太好了。使用窗口函數(shù):
  • 使SQL更易讀(但在子查詢中沒(méi)有GROUP BY語(yǔ)句專業(yè))
  • 提升性能,像關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)能夠更容易優(yōu)化窗口函數(shù)
解決方法:當(dāng)你在子查詢中使用GROUP BY語(yǔ)句時(shí),請(qǐng)?jiān)偃紤]是否可以使用窗口函數(shù)完成。9、使用內(nèi)存間接排序SQL的ORDER BY語(yǔ)句支持很多類型的表達(dá)式,包括CASE語(yǔ)句,對(duì)于間接排序十分有用。你可能重來(lái)不會(huì)在Java內(nèi)存中排序數(shù)據(jù),因?yàn)槟銜?huì)想:
  • SQL排序很慢
  • SQL排序辦不到
解決方法:如果你在內(nèi)存中排序任何SQL數(shù)據(jù),請(qǐng)?jiān)偃紤],是否不能在數(shù)據(jù)庫(kù)中排序。這對(duì)于數(shù)據(jù)庫(kù)分頁(yè)數(shù)據(jù)十分有用。10、一條一條地插入大量記錄JDBC“懂”批處理(batch),你應(yīng)該不會(huì)忘了它。不要使用INSERT語(yǔ)句來(lái)一條一條的出入成千上萬(wàn)的記錄,(因?yàn)椋┟看味紩?huì)創(chuàng)建一個(gè)新 的PreparedStatement對(duì)象。如果你的所有記錄都插入到同一個(gè)表時(shí),那么就創(chuàng)建一個(gè)帶有一條SQL語(yǔ)句以及附帶很多值集合的插入批處理語(yǔ) 句。你可能需要在達(dá)到一定量的插入記錄后才提交來(lái)保證UNDO日志瘦小,這依賴于你的數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)設(shè)置。解決方法:總是使用批處理插入大量數(shù)據(jù)。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉