成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

談談優化JDBC數據庫編程

開發 后端
這是我根據微軟SQL Server 2000 JDBC DRIVER HELP,并參考其它資料整理而成。希望能對大家了解JDBC數據庫編程有幫助。

JDBC數據庫編程1.盡量減少對數據庫元數據方法的使用

同樣是產生一個ResultSet對象,DatabaseMetaData 對象的方法比其它JDBC方法相對要慢,因此平繁使用該方法會降低系統的性能。 在程序中應當對產生的結果集信息進行高速緩存,比如將getTypeInfo()返回的結果集存入Vector或Hashtable中,這樣可大大提高程序的效率。

JDBC數據庫編程2.應避免的方法調用模式

在方法調用時應當盡量避免傳入null做為參數,雖然有時能執行成功,但這對DB Server負擔很重。其實在很多情況下所需的參數是已知的。比如:

  1. //這里略去了捕獲違例代碼(下同)。  
  2. DatabaseMetaData md=...;  
  3. ResultSet rs=md.getTables(null,null,"authors",null);//取得MS SQL SERVER pubs數據庫中authors表的信息. 

應當寫成:

  1. ResultSet rs=md.getTables("northwind","dbo","authors",new String[]{"TABLE"}); 

這樣使程序更有效可靠。

JDBC數據庫編程3.使用啞查詢語句來取得表的相關特征信息

一個啞查詢語句(Dummy Query,譯為啞查詢不知是否恰當,愿與大家探討)不會產生有記錄的結果集,比如:select * from tableName where 1=0,因為條件永不成立,DB Server 不會執行這條語句。因此,在不需產生記錄行的情況下,啞查詢能極大地提高程序的執行效率。比如我們要了解一個表的有關列信息時,上面的語句比select * from tableName這個語句要高效得多,后者數據庫服務器要檢索所有的行并返回一個記錄集,而前者不需要。針對這一問題,JDBC可以有以下兩種方法:

  1. case1:使用getColumns()方法
  2. //getColumns()是DatabaseMetaData的一個方法,其有關信息請查閱JDK1.3文檔
  3. ResultSetrs=md.getColumns("pubs","dbo","authors",...);//返回一個有記錄的結果集
  4. while(rs.next())//通過滾動結果集取得列名
  5. System.out.println(rs.getString(4));
  6. case2:使用getMetaData()方法
  7. Statementstmt=conn.createStatement();
  8. //數據庫服務器永遠不會執行這條查詢語句
  9. ResultSetrs=stmt.executeQuery("select*fromauthorswhere1=0");
  10. ResultSetMetaDatarsrsmd=rs.getMetaData();
  11. intcolCount=rsmd.getColumnCount();//取得列數
  12. for(intcol=1;col<=colCount;col++)
  13. System.out.println(rsmd.getColumnName(col));
  14. //!這里列的順序是select后列出現的順序,并不一定與表中列順序對應

通過以上的分析,第二種方法應是我們的選擇。

JDBC數據庫編程4.關于存儲過程的調用

由于所有的JDBC驅動總是將SQL語句作為字符串發送到數據庫服務器,數據庫服務器經過語法分析、參數類型驗證,然后將參數轉換成正確的數據類型再去執行。比如有這么一個存儲過程:

  1. CallableStatementcstmt=conn.prepareCall("{callgetCustomerName(123)}");
  2. //獲得指定id的客戶的名字,輸入參數,id是個正整數
  3. ResultSetrs=cstmt.executeQuery();

在這里我們認為123是一個正整數,但實際"call getCustomerName(123)"作為字符串整個被發送到數據庫服務器端,數據庫服務器經過分析,離析出"123"將其轉換為整數型值再做為參數送給存儲過程執行。很明顯,這樣效率極低,因為我們把已知的東西仍要服務器去判斷,這無疑額外加重了服務器的負擔。做為優化也是我們常見的存儲過程的調用方法應是:

  1. CallableStatementcstmt=conn.prepareCall("callgetCustomerName(?)");
  2. cstmt.setLong(1,123);//將值和類型信息編碼后發送
  3. ResultSetrs=cstmt.executeQuery();
  4. //dosomething

JDBC數據庫編程5.正確使用Statement和PreparedStatement對象及其execute方法

Statement 對象是為僅執行一次的查詢語句優化而設計的,PreparedStatement 對象是為兩次或更多次執行同一查詢語句而設計的。PreparedStatement 對象第一次執行一個準備好的查詢要花一定的代價,然而它帶來的好處是為以后的查詢加快了速度;因為SQL語句已經進行編譯并放入高速緩存,你可以一直重復使用;想要改變查詢條件獲得不同的結果集只需用setXXX方法改變主機變量(?)的值就行了。

由于PreparedStatement 及 CallableStatement都是Statement的子類,所以它們都有execute(String sql),executeQuery(String sql),executeUpdate(String sql),executeBatch()方法。

execute(String sql)方法返回一個boolean值,它執行任意復雜的sql語句,可以產生多個結果集。如果有結果產生返回 true,如果沒有結果集產生或僅是一個更新記數則返回 false。它產生的結果集可以通過getResultSet()和getMoreResults()獲得,更新記數可通過getUpdateCount()獲得。顯然execute(String sql)方法的使用要復雜一些,因此如果只是簡單的查詢或更新操作請使用executeQuery(String sql)和executeUpdate(String sql)方法。executeUpdate(String sql)能執行INSERT,UPDATE,DELETE語句,及DDL和DML命令(此時返回值為0)。

如果需要進行更多的更新操作,只需將這些更新命令打包后一起提交給數據庫,數據庫一次處理所有的請求,這比逐條提交要高效得多。例如:

  1. //保存當前提交模式
  2. booleancommitState=conn.getAutoCommit();
  3. //關閉自動提交模式
  4. conn.setAutoCommit(false);
  5. Statementstmt=conn.createStatement();

【編輯推薦】

  1. 淺談通過使用JDBC的statement進行數據操作
  2. Java高手詳解使用JDBC的步驟
  3. 淺談DB2 JDBC驅動程序及其支持的功能
  4. 詳解JDBC與Hibernate區別
  5. JDBC連接MySQL數據庫關鍵四步
  6. 淺談JDBC的概念理解與學習
責任編輯:彭凡 來源: 新浪博客
相關推薦

2009-07-06 17:23:34

JDBC連接數據庫

2017-06-16 21:36:14

2011-03-03 17:56:52

MySQL數據庫優化

2011-05-26 09:27:59

JDBC連接數據庫

2011-05-26 13:54:42

數據庫JDBC連接

2009-07-20 15:56:08

JDBC連接數據庫步驟

2010-06-04 09:33:28

連接MySQL數據庫

2009-07-14 17:18:23

JDBC怎么連接數據庫

2009-07-07 17:42:28

2011-03-08 08:49:55

MySQL優化單機

2013-09-17 10:32:08

Android性能優化數據庫

2014-07-18 09:33:53

數據庫數據庫優化

2011-03-31 09:19:54

數據庫優化

2010-08-26 14:39:54

Infobright數

2013-01-04 10:00:12

MySQL數據庫數據庫查詢優化

2009-06-24 13:07:44

Android數據庫

2016-10-27 13:40:02

編程語言 數據庫

2010-04-16 09:36:45

JDBC橋接Oracl

2010-08-25 11:11:59

DB2JDBC連接

2018-07-24 09:38:35

JavaMySQLJDBC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 在线欧美 | 久久久综合网 | 亚洲一区二区三区在线视频 | 日本久久久久久 | 黑人精品欧美一区二区蜜桃 | 国产毛片毛片 | 成人欧美一区二区三区1314 | 羞羞视频免费观 | 日韩欧美中文字幕在线观看 | 精品国产精品国产偷麻豆 | 日韩a v在线免费观看 | 蜜桃毛片 | 亚洲一区在线观看视频 | 欧美视频福利 | 日韩成人av在线 | 伊人超碰 | 国产日产欧产精品精品推荐蛮挑 | 国产九九九 | 日韩国产在线 | 久久综合狠狠综合久久综合88 | 免费日韩av | 91精品一区二区三区久久久久 | 成人免费观看视频 | 天天做日日做 | 亚洲精品久久久久中文字幕二区 | 国产线视频精品免费观看视频 | 日本成人在线播放 | 色婷综合网| 久久国产精品视频 | 99精品网| 成在线人视频免费视频 | 羞羞网站免费观看 | 国产免费自拍 | 色必久久 | 亚洲一区二区久久 | 五月婷婷激情网 | 在线视频一区二区三区 | 老头搡老女人毛片视频在线看 | 国内自拍第一页 | 99国内精品久久久久久久 |