高性能Java持久化的14個技巧

首頁    高性能Java持久化的14個技巧

      一個高性能的數據訪問層需要大量關于數據庫內部、JDBC、JPA、Hibernate的知識,本文總結了一些可用來優化企業應用程序的重要的技術。

6cb7e9e75487fd67029fe7fb46b445b5.png-wh_651x-s_3001135455

      1. SQL語句日志

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

      2.連接管理

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

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

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

      3.JDBC批處理

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

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

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

      4.語句緩存

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

      5.Hibernate 標識符

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

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

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

      6.選擇正確的列類型

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

      7 .關系

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

      高性能Java持久化的14個技巧

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

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


2017-10-19 11:10
?瀏覽量:0
平码3中3论坛