十個JDBC的最佳實踐
JDBC是Java為多種關係型資料庫提供的統一的訪問介面,以下是我長期使用JDBC總結的十個最佳實踐。
JDBC最佳實踐1:使用PrearedStatement
任何一個使用過JDBC的Java程式設計師幾乎都知道這個,PreparedStatment可以通過預編譯的方式避免我們在拼接SQL時造成SQL隱碼攻擊。
JDBC最佳實踐2、使用ConnectionPool(連線池)
使用連線池作為最佳實踐幾乎都成了公認的標準。一些框架已經提供了內建的連線池支援,例如Spring中的Database Connection Pool,如果你的應用部署在JavaEE的應用伺服器中,例如JBoss,WAS,這些伺服器也會有內建的連線池支援,例如DBCP。使用連線的原因簡單的說就是因為建立JDBC連線耗時比較長,如果每次查詢都重新開啟一個連線,然後關閉,效能將會非常低,而如果事先建立好一批連線快取起來,使用的時候取出,不使用的時候仍不關閉,將會節省大量的建立關閉連線的時間。
JDBC最佳實踐3、禁用自動提交
這個最佳實踐在我們使用JDBC的批量提交的時候顯得非常有用,將自動提交禁用後,你可以將一組資料庫操作放在一個事務中,而自動提交模式每次執行SQL語句都將執行自己的事務,並且在執行結束提交。
JDBC最佳實踐4、使用Batch Update
JDBC的API提供了通過addBatch()方法向batch中新增SQL查詢,然後通過executeBatch()執行批量的查詢。JDBC batch update可以減少資料庫資料傳輸的往返次數,從而提高效能。
JDBC最佳實踐5:使用列名獲取ResultSet中的資料,從而避免invalidColumIndexError
JDBC中的查詢結果封裝在ResultSet中,我們可以通過列名和列序號兩種方式獲取查詢的資料,當我們傳入的列序號不正確的時候,就會丟擲invalidColumIndexException,例如你傳入了0,就會出錯,因為ResultSet中的列序號是從1開始的。另外,如果你更改了資料表中列的順序,你也不必更改JDBC程式碼,保持了程式的健壯性。有一些Java程式設計師可能會說通過序號訪問列要比列名訪問快一些,確實是這樣,但是為了程式的健壯性、可讀性,我還是更推薦你使用列名來訪問。
JDBC最佳實踐6:使用變數繫結而不是字串拼接
在第一條最佳實踐中,我們已經說過要使用PreparedStatment可以防止注入,而使用?或者其他佔位符也會提升效能,因為這樣資料庫就可以使用不同的引數執行相同的查詢,這個最佳實踐帶來更高的效能的同時也防止了SQL隱碼攻擊。
JDBC最佳實踐7:要記住關閉Statement、PreparedStatement和Connection
通常的做法是在finally塊中關閉它們,這樣做的好處是不論語句執行正確與否,不管是否有異常丟擲,都能保證資源被釋放。在Java 7中,可以通過Automatic Resource Management Block來自動的關閉資源。
JDBC最佳實踐8:選擇合適的JDBC驅動
有四種JDBC驅動,分別是
- 第一種JDBC驅動叫做JDBC-ODBC Bridge driver (bridge driver)
- 第二種JDBC驅動叫做Native-API/partly Java driver (native driver)
- 第三種JDBC驅動叫做AllJava/Net-protocol driver (middleware driver)
- 第四種JDBC驅動叫做All Java/Native-protocol driver (Pure java driver)
JDBC最佳實踐9:儘量使用標準的SQL語句,從而在某種程度上避免資料庫對SQL支援的差異
不同的資料庫廠商的資料庫產品支援的SQL的語法會有一定的出入,為了方便移植,我推薦使用標準的ANSI SQL標準寫SQL語句。
JDBC最佳實踐10:使用正確的getXXX()方法
當從ResultSet中讀取資料的時候,雖然JDBC允許你使用getString()和getObject()方法獲取任何資料型別,推薦使用正確的getter方法,這樣可以避免資料型別轉換。
相關文章
- JDBC 最佳實踐JDBC
- 使用GitHub的十個最佳實踐Github
- 資料庫設計的十個最佳實踐資料庫
- Apache Airflow十條最佳實踐ApacheAI
- Github 十大最佳實踐Github
- Apache Kafka最佳化部署的十大最佳實踐ApacheKafka
- WebGPU 的幾個最佳實踐WebGPU
- 微服務架構十條最佳實踐微服務架構
- 8個雲成本最佳化的最佳實踐
- 有效尋源的4個最佳實踐
- 有效的微服務:10 個最佳實踐微服務
- Kubernetes日誌的6個最佳實踐
- 5個async/await最佳實踐AI
- Apache Kafka 12個最佳實踐ApacheKafka
- 7個API安全最佳實踐API
- 20個異常處理的最佳實踐
- 測試微服務的4個最佳實踐微服務
- 13 個設計 REST API 的最佳實踐RESTAPI
- 10個Spring Boot效能最佳實踐Spring Boot
- RocketMQ的最佳實踐MQ
- mysqldump的最佳實踐MySql
- 17 個提高效能的 Flutter 最佳實踐Flutter
- Laravel 你應該知道的幾個最佳實踐Laravel
- Java程式設計師的八個最佳實踐Java程式設計師
- 處理Java異常的10個最佳實踐Java
- 處理Java異常的9個最佳實踐Java
- Java異常處理的9個最佳實踐Java
- 非規範SQL的sharding-jdbc實踐SQLJDBC
- sharding-jdbc5.0.0分表實踐JDBC
- swoft 假的最佳實踐
- 標籤的最佳實踐
- Eggjs 的 Controller 最佳實踐JSController
- 軟體開發中的10個最佳實踐技巧!
- Git檢視某個歷史版本的最佳實踐Git
- 應用部署初探:6個保障安全的最佳實踐
- 企業需要知道的5個 IAM 最佳實踐
- 確保 Kubernetes 安全合規的 6 個最佳實踐
- 最佳實踐採購團隊的8個要點
- 45個有用的JavaScript技巧,竅門和最佳實踐JavaScript