十個JDBC的最佳實踐

王振威發表於2012-09-16

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方法,這樣可以避免資料型別轉換。

英文原文:top-10-jdbc-best-practices-for-java

相關文章