熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

影響性能的測試報告(數據庫版)

2013-11-23 19:34:30  來源: Java核心技術 

  引言
  
  前提項目組裡無用到SPRING進行事務的管理項目裡以功能劃分到每個人手裡
  
  形成了BODAOACTIONVIEW都是單人負責在DAO中每個動作都以
  
  封閉式的形式存在
  
  問題造成事務的不連貫性功能是做出來了性能問題遲早暴露
  
  測試主要針對程序頻繁請求數據庫連接對WEB應用所造成影響做一個測試
  
  先做必要的說明一步步引入正題先從性能瓶頸開始
  
  性能瓶頸
  
  所有的應用程序都存在性能瓶頸為了提高應用程序的性能就要盡可能的減少程序的瓶頸以下是在JAVA程序中經常存在的性能瓶頸
  

  了解了這些瓶頸後就可以有針對性的減少這些瓶頸從而提高JAVA應用程序的性能
  
  數據庫連接池工作原理
  
  關於連接池的實現原理測試方案
  
  經過資料的收集與APACHE DBCP裡連接池的查閱對現有的連接池工作原理有兩種方式
  
   數據庫預先設置配置好的連接數待得到用戶請求連接傳出一個連接而後為了保持供應數再提前創建連接即提前預備連接數供請求比如
  
  有個通行道代表最大激活的連接數最小個閒置連接數也就是說連接池裡始終預備了個可隨時提供的連接連接的創建開銷是比較大的連接池的存在就是了能夠最小化的解決創建所等待的時間
  
   O
   O
   *
   *
   *
  
  如上圖分配出去時由於池中連接數剩一個為保持最小閒置會自動創建一個新的連接以防止再次請求等待創建的時間這樣確實減少了等待的時間但是數據庫創建的開銷方面並未得到解決如果把比喻成汽車那麼這種情況下每量車都是一次性使用被請求後下一個連接將是來接替那麼如何能夠重復利用減少數據庫開銷於是引出第二種方式
  
   回收使用完後的連接放回到池中進行循環利用這麼做必須能保證
  
  一 使連接能夠保持有效的回收
  
  二 約束使用者使用釋放的動作而不是直接把連接close
  
  筆者使用的是APACHE DBCP裡BasicDataSource的連接池基本實現
  
  經過代碼與測試結果顯示其工作方式是基於二的
  
  BasicDataSource測試用例
  
  下面展示了一個測試用例
  
  測試結果
  
  第組數據:
  
  並發應用數 模擬連接數
  
  運行平均耗時
  
  共使用個連接
  
  運行平均耗時
  
  共使用個連接
  
  運行平均耗時
  
  共使用個連接
  
  運行平均耗時
  
  共使用個連接
  
  運行平均耗時
  
  共使用個連接
  
  第組數據共執行次;平均耗時為毫秒
  
  平均使用個連接
  
  第組數據:
  
  並發應用數 模擬連接數
  
  運行平均耗時
  
  共使用個連接
  
  運行平均耗時
  
  共使用個連接
  
  運行平均耗時
  
  共使用個連接
  
  運行平均耗時
  
  共使用個連接
  
  運行平均耗時
  
  共使用個連接
  
  第組數據共執行次;平均耗時為毫秒
  
  平均使用個連接
  
  第組數據:
  
  並發應用數 模擬連接數
  
  運行平均耗時
  
  共使用個連接
  
  運行平均耗時
  
  共使用個連接
  
  運行平均耗時
  
  共使用個連接
  
  運行平均耗時
  
  共使用個連接
  
  運行平均耗時
  
  共使用個連接
  
  第組數據共執行次;平均耗時為毫秒
  
  平均使用個連接
  
  每次測試的結果都可能不同但是所得到的結論是一致的數據顯示不合理的請求使用連接嚴重的影響應用所能承受的並發數量響應的時間也因此受到影響
  
  目前普遍存在的問題
  
  沒有把事務控制好一般會出現以下的情況
  
  事務(){ 流程(); 流程();}
  
  可以看出流程裡都是單獨創建連接並在自己的流程裡完成操作
  
  如果在流程裡出現異常那麼流程所做的操作是不可恢復的
  
  如果能控制在事務范圍內
  
  事務(){ Connection con; 流程(con); 流程(con); conclose();}
  
  那麼數據庫少提供一個連接事務的完成性也得到體現在並發數量大的時候效率上就有非常明顯的區別
  
  解決方案
  
   盡量保持少的請求
  
  如DAO中有update()方法則應再擴展一個方法update(Connection conn)
  
  在業務邏輯事務裡調用update(Connection conn)一般情況下調用update()
  
  對於數據不變的情況采用緩存技術或部分緩存技術
  
  可參照一些相關的開源的項目(JIVE)
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27107.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.