JDBC 連接Oracle 技巧

 
通過JDBC連接Oracle數據庫中的十大技巧
1、在客戶端軟件開發中使用Thin驅動程序  
 
2、關閉自動提交功能,提高系統性能   在第一次建立與數據庫的連接時,在缺省情況下,連接是在自動提交模式下的。爲了獲得更好的性能,可以通過調用帶布爾值false參數的Connection類的setAutoCommit()方法關閉自動提交功能,如下所示:conn.setAutoCommit(false);   值得注意的是,一旦關閉了自動提交功能,我們就需要通過調用Connection類的commit()和rollback()方法來人工的方式對事務進行管理。
 
3、在動態SQL或有時間限制的命令中使用Statement對象  在執行SQL命令時,我們有二種選擇:可以使用PreparedStatement對象,也可以使用Statement對象。無論多少次地使用同一個SQL命令,PreparedStatement都只對它解析和編譯一次。當使用Statement對象時,每次執行一個SQL命令時,都會對它進行解析和編譯。這可能會使你認爲,使用PreparedStatement對象比使用Statement對象的速度更快。然而,我進行的測試表明,在客戶端軟件中,情況並非如此。因此,在有時間限制的SQL操作中,除非成批地處理SQL命令,我們應當考慮使用Statement對象。  此外,使用Statement對象也使得編寫動態SQL命令更加簡單,因爲我們可以將字符串連接在一起,建立一個有效的SQL命令。因此,我認爲,Statement對象可以使動態SQL命令的創建和執行變得更加簡單。
 
4、利用PreparedStatement對象提高數據庫的總體效率在使用PreparedStatement對象執行SQL命令時,命令被數據庫進行解析和編譯,然後被放到命令緩衝區。然後,每當執行同一個PreparedStatement對象時,它就會被再解析一次,但不會被再次編譯。在緩衝區中可以發現預編譯的命令,並且可以重新使用。在有大量用戶的企業級應用軟件中,經常會重複執行相同的SQL命令,使用PreparedStatement對象帶來的編譯次數的減少能夠提高數據庫的總體性能。如果不是在客戶端創建、預備、執行PreparedStatement任務需要的時間長於Statement任務,我會建議在除動態SQL命令之外的所有情況下使用PreparedStatement對象。
 
5、在成批處理重複的插入或更新操作中使用PreparedStatement對象 如果成批地處理插入和更新操作,就能夠顯著地減少它們所需要的時間。Oracle提供的Statement和 CallableStatement並不真正地支持批處理,只有PreparedStatement對象才真正地支持批處理。我們可以使用addBatch()和executeBatch()方法選擇標準的JDBC批處理,或者通過利用PreparedStatement對象的setExecuteBatch()方法和標準的executeUpdate()方法選擇速度更快的Oracle專有的方法。要使用Oracle專有的批處理機制,可以以如下所示的方式調用setExecuteBatch(): PreparedStatement pstmt3D null; try { ((OraclePreparedStatement) pstmt).setExecuteBatch(30); ... pstmt.executeUpdate(); } 調用setExecuteBatch()時指定的值是一個上限,當達到該值時,就會自動地引發SQL命令執行,標準的executeUpdate()方法就會被作爲批處理送到數據庫中。我們可以通過調用PreparedStatement類的sendBatch()方法隨時傳輸批處理任務。 String sql = "select fee from CWJH_FEE_TOTAL_T t where AREA_ID=? and TIMESTAMP=?"; Connection connection = dbmgr.getConnection(); PreparedStatement statement = connection.prepareStatement(sql); // Statement statement = connection. createStatement (); 兩種方式 // ResultSet rs = statement.executeQuery(sql); statement.setInt(1, areaid); statement.setString(2,timestamp); ResultSet rs = statement.executeQuery(); double fee = 0; if(rs.next())fee = rs.getDouble(1); statement.close(); rs.close();
發佈了31 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章