JAVA基礎:JDBC最佳化資料庫連線(轉)
JAVA基礎:JDBC最佳化資料庫連線(轉)[@more@] 企業資料庫連線性的恰當構建是非常重要的,並且在為有限連線裝置配置(Connection Limited Device Configuration(CLDC))構建應用程式和編寫特定於 MIDP(移動介面)的介面之間,哪一種是最佳選擇取決於 J2ME 和 Java 技術。
方式
介紹在把企業資料橋接到無線移動裝置時建立 JDBC 連線的一條簡單原則,這可以幫助您使解決方案具有更好的可擴充套件性和更高效的效能。
連線池
任何應用程式都必須先訪問活動的資料庫連線,然後才能訪問資料庫。資料庫連線是一個很佔資源且 I/O 開銷很大的操作,並且如果每次想使用資料庫連線時都必須建立它,那麼它將會成為您的效能瓶頸。
例如,如果您使用 Java servlet(Java servlet 透過 init() 方法建立並在其生命週期結束時被銷燬(透過 destroy() 方法))的方式,您是雖然避免了每次 servlet 被例項化時重新建立連線。這樣一種方式會明顯地降低應用程式的效能。完成相同功能的更好的途徑是使用“連線池(Connection Pool)”,您可以在連線池中初始化多個連線(並且引數可以從 XML 配置檔案中讀取)。
連線本身由一組集合物件和一個在整個請求過程中使連線保持開啟的使用者請求組成。建立連線池的關鍵是在資料庫訪問程式碼中使用如下一些塊:try{}.. catch{}... finally{}..。然後您使用 close() 方法來確認連線確實被返回到了連線池而不是被徹底關閉了。在“finally{}”塊中指定 close() 方法使得執行過程中發生的異常會被捕獲到,並且該語句仍被執行 — 連線返回到連線池,這就防止了應用程式中“連線洩漏(connection leak)”的發生。
以下是構建一個 JDBC 連線的示例:
Connection con = null;
try { ds = (DataSource)myContext.lookup("");
pooledCon = ds.getConnection("scott", "tiger");
// Processing Code goes here
} catch (Exception ignored) {
// catch JNDI or JDBC exceptions here
} finally {
if(pooledCon != null)
pooledCon.close();
}
使用 PreparedStatement
人們認為 PreparedStatement 物件的效率比多個 Statement 物件更高,尤其是如果您必須多次執行同一條語句而差別僅在於引數不同時更是如此。PreparedStatement 允許您將 SQL 語句“編譯”一次(儘管這種編譯第一次要消耗較多的時間),然後將它儲存在快取記憶體中,從而實現有效的重用。同時它也提供了可讀性更好的程式碼。
另一個額外的優勢是由驅動程式完成的對使用者傳遞給語句的字串的自動轉義。舉例來說,這意味著當您試圖將字串“D'Marco”插入到一個基於字元的資料域(它可能是 VARCHAR, VARCHAR2, CHAR 等)中時,SQL 語句不會在遇到第一個撇號時就產生災難性的失敗。
使用 PreparedStatement 物件時的另一個良好習慣是呼叫物件自身的 close() 方法來“關閉物件”,這個方法將被用來執行 SQL 語句。這會關閉任何與正在執行的 SQL 語句相關聯的遊標,這樣就能防止開啟的遊標把資料庫弄得十分凌亂。
以下是一個建立 PreparedSatement 的示例:
PreparedStatement sqlstmt = dbCon.prepareStatement("select *
from table1 where field_1=?");
sqlstmt.setInt(1, 12);
ResultSet rs = sqlstmt.executeQuery();
// close the resultset statement to avoid hanging cursors in database
sqlstmt.close();
// processing of new statement
sqlstmt = dbCon.prepareStatement("select * from table2 where field_2 = ?");
// repeat creating the result set
恰當地利用事務
在更新動態資料庫表和資料時常常會遺忘的一個方面,就是在向超過一個表示一個邏輯事務的表更新或插入資料時,這個事務應該反映到所有的表中,或者在碰到事務失敗時,透過“回滾”該事務而在每一個表中都沒有反映。
一些核心的 JDBC 包支援了四種事務隔離模式(transaction isolation mode),這些模式允許程式指定它們想事務表現出怎樣的行為。大多數程式都至少支援兩種模式:“讀取提交(read committed)”(預設值)和“可序列化的(serializable)”。當不可重複讀取應該允許在多個查詢之間由一個事務作出的修改對於另一個事務可見時,請使用“讀取提交”;要使由另一個事務作出的修改在一個查詢執行時成為可見的,請使用幻象讀取(phantom read)。當您需要一個跨多個操作前後完全一致的資料庫檢視時,就應該使用更為嚴格的“可序列化的”設定。把連線的自動提交設定為“假”(autocommit = "false"),記住這一點是很有用的。
以下是構建一個連線並設定其各個屬性引數的示例:
Connection con = null;
try {
dtsr = (DataSource ");
pConn = dtsr.getConnection("", "");
pConn.setAutoCommit(false); // transaction are not committed uponm execution
pConn.setTransactionIsolation(
Connection.TRANSACTION_SERIALIZABLE);
// pConn is pooled connection
pConn.commit();
} catch (Exception ignored) {
try { pConnn.rollback(); } catch (SQLException esgl) {}
} finally {
if(pConn != null) {
pConn.setAutoCommit(true); //reset autocommit
pConn.close();
}
}
您也可以利用一個可選的 JDBC 包 — JTA(Java Transaction API),它允許容易地和完全獨立的事務伺服器進行整合。
方式
介紹在把企業資料橋接到無線移動裝置時建立 JDBC 連線的一條簡單原則,這可以幫助您使解決方案具有更好的可擴充套件性和更高效的效能。
連線池
任何應用程式都必須先訪問活動的資料庫連線,然後才能訪問資料庫。資料庫連線是一個很佔資源且 I/O 開銷很大的操作,並且如果每次想使用資料庫連線時都必須建立它,那麼它將會成為您的效能瓶頸。
例如,如果您使用 Java servlet(Java servlet 透過 init() 方法建立並在其生命週期結束時被銷燬(透過 destroy() 方法))的方式,您是雖然避免了每次 servlet 被例項化時重新建立連線。這樣一種方式會明顯地降低應用程式的效能。完成相同功能的更好的途徑是使用“連線池(Connection Pool)”,您可以在連線池中初始化多個連線(並且引數可以從 XML 配置檔案中讀取)。
連線本身由一組集合物件和一個在整個請求過程中使連線保持開啟的使用者請求組成。建立連線池的關鍵是在資料庫訪問程式碼中使用如下一些塊:try{}.. catch{}... finally{}..。然後您使用 close() 方法來確認連線確實被返回到了連線池而不是被徹底關閉了。在“finally{}”塊中指定 close() 方法使得執行過程中發生的異常會被捕獲到,並且該語句仍被執行 — 連線返回到連線池,這就防止了應用程式中“連線洩漏(connection leak)”的發生。
以下是構建一個 JDBC 連線的示例:
Connection con = null;
try { ds = (DataSource)myContext.lookup("");
pooledCon = ds.getConnection("scott", "tiger");
// Processing Code goes here
} catch (Exception ignored) {
// catch JNDI or JDBC exceptions here
} finally {
if(pooledCon != null)
pooledCon.close();
}
使用 PreparedStatement
人們認為 PreparedStatement 物件的效率比多個 Statement 物件更高,尤其是如果您必須多次執行同一條語句而差別僅在於引數不同時更是如此。PreparedStatement 允許您將 SQL 語句“編譯”一次(儘管這種編譯第一次要消耗較多的時間),然後將它儲存在快取記憶體中,從而實現有效的重用。同時它也提供了可讀性更好的程式碼。
另一個額外的優勢是由驅動程式完成的對使用者傳遞給語句的字串的自動轉義。舉例來說,這意味著當您試圖將字串“D'Marco”插入到一個基於字元的資料域(它可能是 VARCHAR, VARCHAR2, CHAR 等)中時,SQL 語句不會在遇到第一個撇號時就產生災難性的失敗。
使用 PreparedStatement 物件時的另一個良好習慣是呼叫物件自身的 close() 方法來“關閉物件”,這個方法將被用來執行 SQL 語句。這會關閉任何與正在執行的 SQL 語句相關聯的遊標,這樣就能防止開啟的遊標把資料庫弄得十分凌亂。
以下是一個建立 PreparedSatement 的示例:
PreparedStatement sqlstmt = dbCon.prepareStatement("select *
from table1 where field_1=?");
sqlstmt.setInt(1, 12);
ResultSet rs = sqlstmt.executeQuery();
// close the resultset statement to avoid hanging cursors in database
sqlstmt.close();
// processing of new statement
sqlstmt = dbCon.prepareStatement("select * from table2 where field_2 = ?");
// repeat creating the result set
恰當地利用事務
在更新動態資料庫表和資料時常常會遺忘的一個方面,就是在向超過一個表示一個邏輯事務的表更新或插入資料時,這個事務應該反映到所有的表中,或者在碰到事務失敗時,透過“回滾”該事務而在每一個表中都沒有反映。
一些核心的 JDBC 包支援了四種事務隔離模式(transaction isolation mode),這些模式允許程式指定它們想事務表現出怎樣的行為。大多數程式都至少支援兩種模式:“讀取提交(read committed)”(預設值)和“可序列化的(serializable)”。當不可重複讀取應該允許在多個查詢之間由一個事務作出的修改對於另一個事務可見時,請使用“讀取提交”;要使由另一個事務作出的修改在一個查詢執行時成為可見的,請使用幻象讀取(phantom read)。當您需要一個跨多個操作前後完全一致的資料庫檢視時,就應該使用更為嚴格的“可序列化的”設定。把連線的自動提交設定為“假”(autocommit = "false"),記住這一點是很有用的。
以下是構建一個連線並設定其各個屬性引數的示例:
Connection con = null;
try {
dtsr = (DataSource ");
pConn = dtsr.getConnection("", "");
pConn.setAutoCommit(false); // transaction are not committed uponm execution
pConn.setTransactionIsolation(
Connection.TRANSACTION_SERIALIZABLE);
// pConn is pooled connection
pConn.commit();
} catch (Exception ignored) {
try { pConnn.rollback(); } catch (SQLException esgl) {}
} finally {
if(pConn != null) {
pConn.setAutoCommit(true); //reset autocommit
pConn.close();
}
}
您也可以利用一個可選的 JDBC 包 — JTA(Java Transaction API),它允許容易地和完全獨立的事務伺服器進行整合。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-959029/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java jdbc連線資料庫JavaJDBC資料庫
- java Jdbc連線oracle資料庫連線測試JavaJDBCOracle資料庫
- jdbc-odbc連線資料庫 (轉)JDBC資料庫
- JDBC連線資料庫JDBC資料庫
- 常用資料庫JDBC連線寫法 (轉)資料庫JDBC
- JDBC、JDBC框架、資料庫事務、資料庫連線池JDBC框架資料庫
- [ 轉載]常用資料庫JDBC連線寫法資料庫JDBC
- [轉載] 1.1Java使用JDBC原生方式連線MySql資料庫JavaJDBCMySql資料庫
- 【JavaWeb】JDBC連線MySQL資料庫JavaWebJDBCMySql資料庫
- JDBC之連線sqlserver資料庫JDBCSQLServer資料庫
- JDBC連線資料庫步驟JDBC資料庫
- JDBC連線資料庫經驗JDBC資料庫
- JDBC 連線資料庫的類JDBC資料庫
- JDBC連線各資料庫大全JDBC資料庫
- jdbc獲取資料庫連線JDBC資料庫
- java連線資料庫時jdbc設定編碼Java資料庫JDBC
- java開發中JDBC連線資料庫程式碼JavaJDBC資料庫
- Java 的JDBC 資料庫連線池實現方法JavaJDBC資料庫
- java 資料庫程式設計(一)JDBC連線Sql Server資料庫Java資料庫程式設計JDBCSQLServer
- php連線mysql資料庫基礎PHPMySql資料庫
- 【轉載】JDBC連線各種資料庫的字串JDBC資料庫字串
- Java的JDBC通過SSH Tunnel連線MySQL資料庫JavaJDBCMySql資料庫
- Java各資料庫jdbc連線,和需要的jar包Java資料庫JDBCJAR
- JAVA中十六種主流資料庫的JDBC連線字串Java資料庫JDBC字串
- JDBC資料庫連線池實現JDBC資料庫
- 常用資料庫JDBC連線寫法資料庫JDBC
- JDBC---jsp資料庫連線JDBCJS資料庫
- JDBC連線三種資料庫例子JDBC資料庫
- java通過jdbc連結資料庫JavaJDBC資料庫
- 使用ABAP(ADBC)和Java(JDBC)連線SAP HANA資料庫JavaJDBC資料庫
- JDBC連線批量處理資料入庫JDBC
- 淺談JDBC和資料庫連線池JDBC資料庫
- JDBC連線各種資料庫的字串JDBC資料庫字串
- jdbc獲取各種資料庫連線JDBC資料庫
- 【JDBC】java連線池模擬測試連線Oracle資料庫指令碼參考JDBCJavaOracle資料庫指令碼
- java連線資料庫Java資料庫
- java開發中JDBC連線資料庫程式碼和步驟JavaJDBC資料庫
- java應用通過jdbc連線資料庫jdbc的串的3種寫法:JavaJDBC資料庫