<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-23  評(píng)論-6  文章-1  trackbacks-0

             影響性能的測(cè)試報(bào)告(數(shù)據(jù)庫(kù)版)

    引言

    如需轉(zhuǎn)載,請(qǐng)與筆者聯(lián)系

     

    前提:項(xiàng)目組里無用到SPRING進(jìn)行事務(wù)的管理。項(xiàng)目里以功能劃分到每個(gè)人手里,

    形成了BODAOACTIONVIEW都是單人負(fù)責(zé)。在DAO中每個(gè)動(dòng)作都以

          封閉式的形式存在。

    問題:造成事務(wù)的不連貫性。功能是做出來了,性能問題遲早暴露。

    測(cè)試:主要針對(duì)程序頻繁請(qǐng)求數(shù)據(jù)庫(kù)連接對(duì)WEB應(yīng)用所造成影響做一個(gè)測(cè)試。

     

     

    先做必要的說明,一步步引入正題,先從性能瓶頸開始:

    性能瓶頸

    所有的應(yīng)用程序都存在性能瓶頸,為了提高應(yīng)用程序的性能,就要盡可能的減少程序的瓶頸。以下是在JAVA程序中經(jīng)常存在的性能瓶頸。

    pingjing.jpg
    了解了這些瓶頸后,就可以有針對(duì)性的減少這些瓶頸,從而提高JAVA應(yīng)用程序的性能

     

    數(shù)據(jù)庫(kù)連接池工作原理

    關(guān)于連接池的實(shí)現(xiàn)原理測(cè)試方案:

    經(jīng)過資料的收集與APACHE DBCP里連接池的查閱,對(duì)現(xiàn)有的連接池工作

    原理有兩種方式:

    1.        數(shù)據(jù)庫(kù)預(yù)先設(shè)置配置好的連接數(shù)。待得到用戶請(qǐng)求連接,傳出一個(gè)連接,而后為了保持供應(yīng)數(shù)再提前創(chuàng)建連接,即提前預(yù)備連接數(shù)供請(qǐng)求。比如:

    5個(gè)通行道代表最大激活的連接數(shù),最小2個(gè)閑置連接數(shù)。也就是說連接池里始終預(yù)備了2個(gè)可隨時(shí)提供的連接,連接的創(chuàng)建開銷是比較大的,連接池的存在就是了能夠最小化的解決創(chuàng)建所等待的時(shí)間。

      1            O

      2            O

      3            *

      4            *

      5            *

      如上圖,當(dāng)1分配出去時(shí)由于池中連接數(shù)剩一個(gè),為保持最小閑置,會(huì)自動(dòng)創(chuàng)建一個(gè)新的連接以防止再次請(qǐng)求等待創(chuàng)建的時(shí)間。這樣確實(shí)減少了等待的時(shí)間,但是數(shù)據(jù)庫(kù)創(chuàng)建的開銷方面并未得到解決。如果把1-5比喻成汽車,那么這種情況下每量車都是一次性使用。1被請(qǐng)求后下一個(gè)連接將是6來接替。那么如何能夠重復(fù)利用1減少數(shù)據(jù)庫(kù)開銷。于是引出第二種方式。

     

    2.        回收使用完后的連接,放回到池中進(jìn)行循環(huán)利用。這么做必須能保證2點(diǎn)

       .  使連接能夠保持有效的回收。

       .  約束使用者使用釋放的動(dòng)作,而不是直接把連接close.

     

    本人使用的是APACHE DBCPBasicDataSource的連接池基本實(shí)現(xiàn),

    經(jīng)過代碼與測(cè)試結(jié)果顯示,其工作方式是基于二的。

     

    BasicDataSource測(cè)試用例

    請(qǐng)看測(cè)試用例

    測(cè)試結(jié)果:


    2組數(shù)據(jù):

    并發(fā)應(yīng)用數(shù):100 模擬連接數(shù):6

    運(yùn)行平均耗時(shí):2956

    共使用51個(gè)連接

    運(yùn)行平均耗時(shí):3391

    2共使用52個(gè)連接

    運(yùn)行平均耗時(shí):2616

    共使用47個(gè)連接

    運(yùn)行平均耗時(shí):3377

    共使用41個(gè)連接

    運(yùn)行平均耗時(shí):3673

    共使用46個(gè)連接

    2組數(shù)據(jù)共執(zhí)行5;平均耗時(shí)為:3229毫秒

    平均使用47個(gè)連接

     

    3組數(shù)據(jù):

    并發(fā)應(yīng)用數(shù):85 模擬連接數(shù):9

    運(yùn)行平均耗時(shí):4830

    共使用53個(gè)連接

    運(yùn)行平均耗時(shí):3247

    共使用49個(gè)連接

    運(yùn)行平均耗時(shí):4116

    共使用40個(gè)連接

    運(yùn)行平均耗時(shí):4070

    共使用43個(gè)連接

    運(yùn)行平均耗時(shí):4053

    共使用54個(gè)連接

    3組數(shù)據(jù)共執(zhí)行5;平均耗時(shí)為:4063毫秒

    平均使用47個(gè)連接

     

    4組數(shù)據(jù):

    并發(fā)應(yīng)用數(shù):140 模擬連接數(shù):3

    運(yùn)行平均耗時(shí):2076

    共使用47個(gè)連接

    運(yùn)行平均耗時(shí):3104

    共使用51個(gè)連接

    運(yùn)行平均耗時(shí):2048

    共使用43個(gè)連接

    運(yùn)行平均耗時(shí):2421

    共使用50個(gè)連接

    運(yùn)行平均耗時(shí):2751

    共使用50個(gè)連接

    4組數(shù)據(jù)共執(zhí)行5;平均耗時(shí)為:2480毫秒

    平均使用48個(gè)連接

     

    每次測(cè)試的結(jié)果都可能不同,但是所得到的結(jié)論是一致的。數(shù)據(jù)顯示不合理的請(qǐng)求使用連接嚴(yán)重的影響應(yīng)用所能承受的并發(fā)數(shù)量,響應(yīng)的時(shí)間也因此受到影響。

     

    目前普遍存在的問題

    沒有把事務(wù)控制好,一般會(huì)出現(xiàn)以下的情況:

    事務(wù)(){

      流程1();

      流程2();

    }

    可以看出流程12里都是單獨(dú)創(chuàng)建連接,并在自己的流程里完成操作。

    如果在流程2里出現(xiàn)異常,那么流程1所做的操作是不可恢復(fù)的。

    如果能控制在事務(wù)范圍內(nèi),如:

    事務(wù)(){

      Connection con;

      流程1(con);

      流程2(con);

      con.close();

    }

    那么數(shù)據(jù)庫(kù)少提供一個(gè)連接,事務(wù)的完成性也得到體現(xiàn)。在并發(fā)數(shù)量大的時(shí)候,

    效率上就有非常明顯的區(qū)別。

    解決方案

    1.  盡量保持少的請(qǐng)求

    DAO中有update()方法,則應(yīng)再擴(kuò)展一個(gè)方法update(Connection conn)

    在業(yè)務(wù)邏輯事務(wù)里調(diào)用update(Connection conn),一般情況下調(diào)用update()

    2.  對(duì)于數(shù)據(jù)不變的情況采用緩存技術(shù),或部分緩存技術(shù)。

          可參照一些相關(guān)的開源的項(xiàng)目(JIVE)。

    posted on 2005-09-25 17:21 ceaboat 閱讀(1667) 評(píng)論(4)  編輯  收藏 所屬分類: JAVA小結(jié)

    評(píng)論:
    # re: 影響性能的測(cè)試報(bào)告(數(shù)據(jù)庫(kù)版) 2005-09-25 19:40 | martin xus

    討論一下:)

    一:
    事務(wù)(){
    流程1();
    流程2();
    }

    這樣的事務(wù)完全可以控制的,例如:采用command的模式

    Transactable tx = null;
    try{
    tx.begin();
    command = cmd.execute();
    tx.commit();
    } catch (Throwable e) {
    if (tx != null) {
    try {
    tx.rollback();
    } catch (Exception he) {
    throw new GeneralFailureException("事務(wù)回滾出錯(cuò)", he);
    }
    }
    }

    這完全沒有問題的.


    二:
    個(gè)人認(rèn)為connection沒有必要擴(kuò)大到外面來,
    Connection con;
    流程1(con);
    流程2(con);
    con.close();
    connection應(yīng)該是透明的,不應(yīng)該出現(xiàn)在你的業(yè)務(wù)代碼中,再說,你的一個(gè)application不是有connection pool嗎?應(yīng)該把connection交給容器去管理.

    再者:
    如果出現(xiàn)以下任一種情況怎么辦或者被別人誤用:
    (1):你的connection 被聲明為static
    (2):代碼沒有執(zhí)行完畢,拋出異常,而又沒有合理處理connection
    那么這樣你的連接就可能被占著不放.做gc同樣也釋放不了.你的server肯定會(huì)菪機(jī)!


    你說呢?
      回復(fù)  更多評(píng)論
      
    # re: 影響性能的測(cè)試報(bào)告(數(shù)據(jù)庫(kù)版) 2005-09-25 20:24 | ceaboat
    我這里只做最普通的例子說明,并不是重在一定使用這種方式,重點(diǎn)是在于事務(wù)進(jìn)行統(tǒng)一,雖然大家都知道這個(gè),但是出呼意料,在項(xiàng)目中我看到更多的是使用
    事務(wù)(){
    流程1();
    流程2();
    }
    對(duì)于我來說難以理解,于是有必要做這個(gè)測(cè)試報(bào)告,在會(huì)議上進(jìn)行討論。
    當(dāng)然在正常使用中,異常的處理是必須的,但不是這個(gè)測(cè)試的重點(diǎn)所在。
    重點(diǎn)在于不合理的使用連接,頻繁的進(jìn)行網(wǎng)絡(luò)交互所給系統(tǒng)帶來的負(fù)擔(dān)。  回復(fù)  更多評(píng)論
      
    # re: 影響性能的測(cè)試報(bào)告(數(shù)據(jù)庫(kù)版) 2005-09-25 20:32 | InPractice
    在同一個(gè)事務(wù)中,流程1和流程2共用一個(gè)連接應(yīng)該效率較高。實(shí)踐中大家可能都沒有注意這個(gè)。因?yàn)橐话闶荄AO和SERVICE兩層。每個(gè)DAO是獨(dú)立的,組合到Service中時(shí)也沒有特意讓兩個(gè)DAO共享同一個(gè)連接,就會(huì)出現(xiàn)上面的情況。  回復(fù)  更多評(píng)論
      
    # re: 影響性能的測(cè)試報(bào)告(數(shù)據(jù)庫(kù)版) 2005-09-26 09:04 | martin xus
    在一個(gè)項(xiàng)目中,非不得以,事務(wù)不應(yīng)該交給組員去做的,對(duì)他們來說,這是不允許的.
    在他們的模塊中只是簡(jiǎn)單的業(yè)務(wù)處理.普通的代碼,調(diào)用相應(yīng)的service..

    開發(fā)前,先給組員開 “項(xiàng)目規(guī)范動(dòng)員大會(huì)” :)  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲av日韩aⅴ无码色老头| 国产亚洲人成网站在线观看| 亚洲成年轻人电影网站www| 一级做受视频免费是看美女| 又大又粗又爽a级毛片免费看| 亚洲精华国产精华精华液网站| 国产1024精品视频专区免费| 又爽又黄无遮挡高清免费视频| 亚洲日韩一区二区三区| 国产男女猛烈无遮挡免费网站| 国产成人亚洲综合色影视| 亚洲ts人妖网站| 无码国产精品久久一区免费| 亚洲色大成网站www| 免费在线观看视频a| 国产高清对白在线观看免费91| 国产亚洲综合一区柠檬导航| 亚洲精品国产精品| 又爽又高潮的BB视频免费看| 久久一区二区免费播放| 在线看片无码永久免费视频| 亚洲欧洲专线一区| www.亚洲一区| 亚洲欧美国产国产一区二区三区 | 成人影片麻豆国产影片免费观看 | 免费福利在线观看| 伊人久久综在合线亚洲91| 久久久久久AV无码免费网站下载| 亚洲精品无码AV中文字幕电影网站| 国产精品小视频免费无限app | 免费观看的毛片手机视频| 婷婷亚洲综合五月天小说| 无码国产精品一区二区免费虚拟VR| 亚洲精品久久久久无码AV片软件| 亚洲日本一区二区三区在线不卡| 无码人妻一区二区三区免费看| 中文字幕乱码亚洲精品一区| 久久久久亚洲av成人无码电影 | 久久精品私人影院免费看| 亚洲午夜无码久久久久| 国色精品卡一卡2卡3卡4卡免费|