Java持久性技巧有哪些-創(chuàng)新互聯(lián)

米林網站建設公司成都創(chuàng)新互聯(lián)公司,米林網站設計制作,有大型網站制作公司豐富經驗。已為米林數(shù)千家提供企業(yè)網站建設服務。企業(yè)網站搭建\外貿網站建設要多少錢,請找那個售后服務好的米林做網站的公司定做!

Java持久性技巧有哪些,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

一個高性能的數(shù)據(jù)訪問層需要大量關于數(shù)據(jù)庫內部、JDBC、JPA、Hibernate的知識,下面總結了一些可用來優(yōu)化企業(yè)應用程序的重要的技術。

1. SQL語句日志

如果您用了生成符合自己使用習慣的語句的框架,則應始終驗證每個語句的有效性和效率。測試時使用斷言機制驗證更好,因為即使在提交代碼之前,也可以捕獲N + 1個查詢問題。

2.連接管理

數(shù)據(jù)庫的連接開銷非常大,因此您應該始終使用連接池機制。

由于連接數(shù)由底層數(shù)據(jù)庫集群的功能給出,所以您需要盡可能快地釋放連接。

在性能調優(yōu)中,你總是要測量、設置出正確的連接池,池的大小又是差不多的。 但像FlexyPool這樣工具可以幫助您找到合適的大小,即使您已經將應用程序部署到生產環(huán)境中。

3.JDBC批處理

JDBC批處理允許我們在單個數(shù)據(jù)庫往返中發(fā)送多個SQL語句。性能增益在驅動程序和數(shù)據(jù)庫端都很重要。PreparedStatements 非常適合批處理,而某些數(shù)據(jù)庫系統(tǒng)(例如 Oracle)僅支持用于預處理語句的批處理。

由于JDBC為批處理定義了獨特的API(例如PreparedStatement.addBatch和PreparedStatement.executeBatch),如果您手動生成語句,那么您應該從一開始就知道是否應該使用批處理。 使用Hibernate,您可以切換到使用單個配置的批處理。

Hibernate 5.2 提供了會話級別的批處理,所以在這方面更加靈活。

4.語句緩存

語句緩存是您可以輕松利用的最鮮為人知的性能優(yōu)化之一。 根據(jù)基礎的JDBC驅動程序,可以在客戶端(驅動程序)或數(shù)據(jù)庫端(語法樹甚至執(zhí)行計劃)上緩存PreparedStatements。

5.Hibernate 標識符

當使用Hibernate時,IDENTITY生成器不是一個好的選擇,因為它禁用了JDBC批處理。

TABLE生成器更糟糕,因為它使用一個單獨的事務來獲取新的標識符,這會對底層事務日志以及連接池造成壓力,因為每次我們需要一個新的標識符時都需要單獨的連接。

SEQUENCE是正確的選擇,甚至從2012版本就開始支持SQL Server。對于SEQUENCE標識符,Hibernate一直提供優(yōu)化器,如 pooled 或 pooled-lo,這可以減少獲取新的實體標識符值所需的數(shù)據(jù)庫往返次數(shù)。

6.選擇正確的列類型

您應該始終在數(shù)據(jù)庫端使用正確的列類型。 列類型越緊湊,數(shù)據(jù)庫工作集中可容納的條目越多,索引將更好地適應于內存。 為此,您應該利用特定于數(shù)據(jù)庫的類型(例如PostgreSQL中的IPv4地址的inet),尤其是在實現(xiàn)新自定義類型時,Hibernate非常靈活。

7 .關系

Hibernate 帶有許多關系映射類型,但并不是所有的關系映射類型在效率上都是相等的。

Java持久性技巧有哪些

應該避免單向集合和 @ManyToMany 列表。如果您確實需要使用實體集合,則選雙向 @OneToMany關聯(lián)。對于 @ManyToMany 關系,使用 Set(s),因為在這種情況下它們更高效,或者簡單地映射鏈接的多對多表,并將 @ManyToMany 關系轉換為兩個雙向的 @OneToMany 關聯(lián)。

然而,與查詢不同,集合不夠靈活,因為它們不易分頁,這意味著當子關聯(lián)的數(shù)量相當高時,我們不能使用它們。出于這個原因,你應該考慮一個集合是否真的有必要。 在許多情況下,實體查詢可能是更好的選擇。

8.繼承

就繼承而言,面向對象語言和關系數(shù)據(jù)庫之間的不匹配變得更加明顯。 JPA提供了SINGLE_TABLE,JOINED和TABLE_PER_CLASS來處理繼承映射,每個策略都有其優(yōu)缺點。

SINGLE_TABLE在SQL語句方面表現(xiàn)最好,但由于我們不能使用NOT NULL約束,所以我們在數(shù)據(jù)完整性方面失敗了。

當同時提供更復雜的語句時,JOINED采用數(shù)據(jù)完整性限制。 只要你不使用基本類型的多態(tài)查詢或@OneToMany關聯(lián),這個策略就沒有問題。 它的真正的作用在于對數(shù)據(jù)訪問層上由策略模式支持的多態(tài)@ManyToOne關聯(lián)。

應該避免使用TABLE_PER_CLASS,因為它不會生成有效的SQL語句。

9.持久性上下文的大小

在使用 JPA 和 Hibernate 時,應該始終關注持久性上下文的大小。 出于這個原因,您不應該過多地使用托管實體。 通過限制托管實體的數(shù)量,我們可以獲得更好的內存管理,并且默認的檢查機制也將更加高效。

10.只抓取必要的東西

獲取太多的數(shù)據(jù)可能是導致數(shù)據(jù)訪問層性能出問題的首要原因。 一個問題是,即使是只讀的 Projections,實體查詢也是專用的。

DTO projections更適合于獲取自定義視圖,而實體只能在業(yè)務流需要修改時才能獲取。

EAGER抓取是最糟糕的,您應該避免反模式(Anti-Pattern),例如 Open-Session in View。

11.高速緩存

Java持久性技巧有哪些

關系數(shù)據(jù)庫系統(tǒng)使用許多內存緩沖區(qū)結構來避免磁盤訪問。 數(shù)據(jù)庫緩存經常被忽視。 我們可以通過適當調整數(shù)據(jù)庫引擎來顯著降低響應時間,以便工作集駐留在內存中,而不是一直從磁盤中獲取。

應用程序級緩存對于許多企業(yè)應用程序來說是不可選的。 應用程序級緩存可以減少響應時間,同時為數(shù)據(jù)庫關閉以進行維護或由于某些嚴重系統(tǒng)故障提供只讀輔助存儲庫。

二級緩存對于減少讀寫事務響應時間非常有用,特別是在主從復制體系結構中。 根據(jù)應用程序的要求,Hibernate允許你在READ_ONLY,NONSTRICT_READ_WRITE,READ_WRITE和TRANSACTIONAL之間進行選擇。

12.并發(fā)控制

在性能和數(shù)據(jù)完整性方面,事務隔離級別的選擇是非常重要的。 對于多請求Web流程,為避免丟失更新,您應該對分離的實體或 EXTENDED 持久性上下文使用 optimistic 鎖定。

為避免optimistic locking誤報,您可以使用無版本 optimistic 并發(fā)控制或基于讀寫的屬性集來拆分實體。

13.釋放數(shù)據(jù)庫查詢功能

僅僅因為您使用JPA或Hibernate,并不意味著您不應該使用原生查詢。 您應該利用窗口函數(shù),CTE(公用表表達式),CONNECT BY,PIVOT 查詢。

這些構造允許您避免獲取太多的數(shù)據(jù),以便稍后在應用程序層進行轉換。 如果可以讓數(shù)據(jù)庫進行處理,那么只能獲取最終結果,因此可以節(jié)省大量的磁盤I / O和網絡開銷。 為避免主節(jié)點重載,可以使用數(shù)據(jù)庫復制和擁有多個從屬節(jié)點,這樣數(shù)據(jù)密集型的任務就會在從屬節(jié)點而不是主節(jié)點上執(zhí)行。

14.橫向擴展和縱向擴展

關系數(shù)據(jù)庫的伸縮性非常好。如果Facebook、Twitter、Pinterest或StackOverflow可以擴展他們的數(shù)據(jù)庫系統(tǒng),那么很有可能您可以將企業(yè)應用程序擴展到其特定的業(yè)務需求。

數(shù)據(jù)庫復制和分片是提高吞吐量的很好的方法,您應該完全可以利用這些經過測試的架構模式來擴展您的企業(yè)應用程序。

Java持久性技巧有哪些

高性能數(shù)據(jù)訪問層必須與底層數(shù)據(jù)庫系統(tǒng)互相響應。 了解關系數(shù)據(jù)庫和正在使用的數(shù)據(jù)訪問框架的內部工作原理可以使企業(yè)高性能應用程序和幾乎沒有crawls的應用程序之間產生差異。

看完上述內容,你們掌握Java持久性技巧有哪些的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創(chuàng)新互聯(lián)-成都網站建設公司行業(yè)資訊頻道,感謝各位的閱讀!

網站標題:Java持久性技巧有哪些-創(chuàng)新互聯(lián)
地址分享:http://bm7419.com/article44/dscehe.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、移動網站建設、網站改版自適應網站、小程序開發(fā)、網頁設計公司

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網站建設