|
常用鏈接
留言簿(6)
隨筆分類(3)
隨筆檔案(19)
文章分類(77)
文章檔案(107)
相冊
JAVA
LIFE
TOOLS
WEB SERVER
WEB-JFRAME
最新隨筆
搜索
最新評(píng)論

閱讀排行榜
評(píng)論排行榜
Powered by: 博客園
模板提供:滬江博客
|
|
|
|
|
發(fā)新文章 |
|
|
請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月14日 20:22
|
回復(fù)
|
|
我們圖書館圖書查詢系統(tǒng),采用ORACLE+Tomcat,使用servlet+JavaBean通過Tomcat的連接池直接訪問Oracle數(shù)據(jù)庫做查詢。
數(shù)
據(jù)量大約為40萬條圖書信息,(圖書信息采用類似xml的結(jié)構(gòu)存儲(chǔ),每冊圖書的書名、作者等信息作為一個(gè)CLOB字段存儲(chǔ),由于不能直接建立索引,我們把
其中的書名、作者等抽取出來存放在另外一個(gè)表中,這樣查詢時(shí)需要做兩個(gè)表的連接查詢),少量用戶查詢時(shí)還能及時(shí)響應(yīng),但是當(dāng)同時(shí)查詢的讀者多,響應(yīng)就特別
慢。
請問各位大蝦,我這個(gè)系統(tǒng)可以從哪些方面做性能改進(jìn)??
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月15日 19:22
|
回復(fù)
|
|
做cache,把數(shù)據(jù)庫里面的數(shù)據(jù)放到內(nèi)存里面,這樣可以加快查詢速度
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月19日 09:44
|
回復(fù)
|
|
提高查詢性能需要從幾個(gè)方面提升。
首先你選擇的是原始的
Jsp/Servlet +
JavaBeans結(jié)構(gòu),jsp/Servlet其實(shí)就是線程,當(dāng)并發(fā)用戶發(fā)生訪問時(shí),就是多線程了,因此,在你的程序中,首先避免多線程訪問同一個(gè)資
源,特別是Singleton方式,這個(gè)問題前面帖子已經(jīng)大量討論,這比如:本來是并行前進(jìn)的,到了一個(gè)獨(dú)木橋,必須串行前進(jìn),那么性能大大折扣了。
最
好的方式是,一個(gè)對象為一個(gè)線程服務(wù),并發(fā)10個(gè)線程就有10對象被訪問,這樣效率最高,但是同時(shí)注意,如果你這個(gè)Javabeans對象每次被訪問都要
new創(chuàng)建,有可能浪費(fèi)性能,特別是Javabeans代碼很多,功能很多時(shí),那么使用pool,在系統(tǒng)啟動(dòng)時(shí),就啟動(dòng)生成這些JavaBeans對象在
內(nèi)存中。
我上面說的這些javaBeans是功能性Javabeans,通過Pool提高功能性JavaBeans的性能。還有一種是數(shù)據(jù)javabeans,專門裝載數(shù)據(jù)的,這部分使用Cache來提高。
EJB
中的無態(tài)Session Bean底層已經(jīng)有Pool支持,如果你將功能性JavaBeans的代碼移植到Session
Beans中實(shí)現(xiàn),那么會(huì)提高并發(fā)用戶的處理性能,使用SLSB的Local,關(guān)閉其網(wǎng)絡(luò)性能損耗;關(guān)閉SLSB事務(wù)機(jī)制(如果不需要),這樣將SLSB
變成一個(gè)純的Pool支持的特殊javaBeans了。
由于EJB中實(shí)體bean底層是有Cache支持的,因此可以用實(shí)體bean實(shí)現(xiàn)數(shù)據(jù)javaBeans的緩存,但是一般推薦,最好在Web層自己做一些緩存,這樣離客戶端最近,性能最好。
總
之,性能問題其實(shí)是架構(gòu)選擇不慎帶來的問題,在這個(gè)論壇看到了太多Jsp+JavaBeans的性能問題,為什么我們從系統(tǒng)一開始時(shí),不選擇可伸縮強(qiáng)大的
EJB架構(gòu)呢? 這樣 ,在你的系統(tǒng)擴(kuò)大時(shí),你就不必為系統(tǒng)性能問題頭疼,甚至性能問題導(dǎo)致了你的Jsp+JavaBeans系統(tǒng)失敗。
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月19日 15:03
|
回復(fù)
|
|
EJB并不是萬能的,什么系統(tǒng)都推薦EJB,這是典型的誤人子弟 系統(tǒng)性能出現(xiàn)問題,應(yīng)該先找出瓶頸所在,可用一些性能測試工具來做 本應(yīng)用中,你為什么要把信息存成xml保存在blob中呢?這樣讀起來要解析,肯定性能有問題 如果你把這些信息都獨(dú)立成一個(gè)個(gè)字段,再對數(shù)據(jù)庫進(jìn)行一些性能優(yōu)化,應(yīng)該就沒有問題了。 40萬條記錄很少的
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月20日 09:08
|
回復(fù)
|
|
1:利用cache 2:修改sql,用oracle的特有的sql 3:不要輕易修改架構(gòu),ejb不是萬能的,很討厭那種動(dòng)輒就談ejb,絕對是誤導(dǎo)。
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月20日 09:49
|
回復(fù)
|
|
對于ejb,我們曾經(jīng)有過痛苦的經(jīng)歷,就是我們目前做的項(xiàng)目,幾千萬的大型集成軟件,當(dāng)初架構(gòu)采用session
bean,沒有采用實(shí)體bean,但是目前提供的ejb容器在開發(fā)設(shè)計(jì)之初,總會(huì)測試出這樣那樣的問題(往往都是不可預(yù)知的錯(cuò)誤,由于我們是財(cái)務(wù)項(xiàng)目,異
常情況如果不能很好控制的話,其產(chǎn)品性能可想而知了)....,并且好多問題找供應(yīng)商尋求解決,但是多方尋求結(jié)果未果的情況下,只好采用了比較成熟的
struts(MVC)來進(jìn)行開發(fā)。
對于查詢的性能提高情況,個(gè)人理解有兩個(gè)地方,一:前臺(tái)與數(shù)據(jù)庫之間的控制處理模式(JDBC或其他包裝后處理程序)是至關(guān)重要的,這不僅僅影響查詢的性
能,同時(shí)還決定著系統(tǒng)的可擴(kuò)充性和健壯性,提個(gè)很現(xiàn)實(shí)的問題:對于多數(shù)據(jù)庫的支持,不僅要有通用性,還要有各自的相關(guān)優(yōu)化措施才可以。 二:對于查詢后的數(shù)據(jù)如何進(jìn)行有效的處理,這也是影響查詢性能的重要因素,如何進(jìn)行高效準(zhǔn)確的展示,當(dāng)然包括一些中間駐留信息的保存、刪除等處理,這些也可以規(guī)劃為一種展示模式的設(shè)計(jì)。 以上兩點(diǎn)為個(gè)人陋見,請大家一塊討論!!
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月20日 20:05
|
回復(fù)
|
|
40萬的記錄并不大,這樣就不行了,肯定是設(shè)計(jì) 有問題.不明白你們?yōu)槭裁匆脁ml存儲(chǔ),然后再存成block字段?感覺象為了使用xml而用xml!
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月20日 23:27
|
回復(fù)
|
|
Javabean以及Singleton與性能關(guān)系不大,使用純的javabean時(shí),因?yàn)闆]有遠(yuǎn)程調(diào)用,性能比EJB要好,但是javabean中有synchronized關(guān)鍵字的另當(dāng)別論,這個(gè)時(shí)候的Singleton成為了“獨(dú)步橋”,性能會(huì)變得低下
import java.util.*; import org.apache.log4j.*;
public class ThreadImpl extends Thread { public void run () { BizTask.getInstance().run(); } public static void main(String[] args) { for (int i = 0; i < 100; i++) { ThreadImpl t = new ThreadImpl (); t.start(); } } }
class BizTask { private static final Category logger = Category.getInstance (BizTask.class); private static BizTask instance = null; private BizTask() { super(); }
public static BizTask getInstance() { if (instance == null) instance = new BizTask(); return instance; } public synchronized void run () { try { Thread.sleep(1000); logger.debug(new Date()); } catch (InterruptedException e) { e.printStackTrace(); } } }
代碼中BizTask是一個(gè)Singleton實(shí)例,但是 public synchronized void run ()方法的synchronized 將嚴(yán)重的影響性能,如果沒有這個(gè)synchronized ,性能和不使用Singleton實(shí)例基本一致
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月20日 23:36
|
回復(fù)
|
|
一點(diǎn)淺見,請大家指正: 個(gè)人認(rèn)為,Javabean以及
Singleton與性能關(guān)系不大,使用純的javabean時(shí),因?yàn)闆]有遠(yuǎn)程調(diào)用,性能可能比EJB更好,但是javabean的方法中有
synchronized關(guān)鍵字或者javabean調(diào)用了一個(gè)synchronized方法時(shí)的另當(dāng)別論,這個(gè)時(shí)候的Singleton成為了“獨(dú)步
橋”,性能會(huì)變得低下 也就是說 Singleton + synchronized 將形成瓶頸 兩者如果不在一起,不會(huì)形成瓶頸
import java.util.*; import org.apache.log4j.*;
public class ThreadImpl extends Thread { public void run () { BizTask.getInstance().run(); } public static void main(String[] args) { for (int i = 0; i < 100; i++) { ThreadImpl t = new ThreadImpl (); t.start(); } } }
class BizTask { private static final Category logger = Category.getInstance (BizTask.class); private static BizTask instance = null; private BizTask() { super(); }
public static BizTask getInstance() { if (instance == null) instance = new BizTask(); return instance; } public synchronized void run () { try { Thread.sleep(1000); logger.debug(new Date()); } catch (InterruptedException e) { e.printStackTrace(); } } }
代碼中BizTask是一個(gè)Singleton實(shí)例,但是 public synchronized void run ()方法的synchronized 將嚴(yán)重的影響性能,如果沒有這個(gè)synchronized ,性能和不使用Singleton實(shí)例基本一致
個(gè)人認(rèn)為: 使用EJB的好處是可以得到可以縮放的體系結(jié)構(gòu),業(yè)務(wù)實(shí)現(xiàn)可以部署在多個(gè)服務(wù)器中,形成分布式的體系結(jié)構(gòu)。系統(tǒng)的容量可以動(dòng)態(tài)的增加。 同時(shí),使用javabean的時(shí)候,需要考慮線程安全,并且因?yàn)楹瘮?shù)重入,在大量并發(fā)的時(shí)候,可能會(huì)出現(xiàn)內(nèi)存空間不夠,因?yàn)橐獎(jiǎng)討B(tài)的分配臨時(shí)變量。 在小系統(tǒng)的情況下,javabean+jsp的性能應(yīng)該高于ejb的系統(tǒng)
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月21日 12:33
|
回復(fù)
|
|
數(shù)據(jù)庫 ------------------------------------------------------------- 1、重新整理數(shù)據(jù)庫的結(jié)構(gòu),盡量減少數(shù)據(jù)表之間的關(guān)聯(lián);
2、創(chuàng)建索引,增強(qiáng)查詢的速度;
3、優(yōu)化你的sql語句,有個(gè)人使用SQL語句N強(qiáng),關(guān)聯(lián)了3--4個(gè)表,中間用到了UNION,LIKE,IN,執(zhí)行查詢,4萬條記錄,時(shí)間為25秒;
應(yīng)用服務(wù)器 -------------------------------------------------------------- 1、適當(dāng)?shù)脑黾訑?shù)據(jù)庫連接池的連接,檢查是否存在資源未釋放的情況;
2、可以采用集群,增強(qiáng)并發(fā)訪問量;
JavaBean -------------------------------------------------------------- 1、減去一些臃腫的代碼,但是這樣勢必要造成代碼的可讀性差;
2、釋放你沒有關(guān)閉的資源,例如:IO資源、數(shù)據(jù)庫連接等;
3、采用多線程;
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月21日 12:35
|
回復(fù)
|
|
提議:最好能夠自己檢查一下,找到出現(xiàn)性能瓶頸的真正所在:)
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月21日 15:11
|
回復(fù)
|
|
個(gè)人認(rèn)為你的系統(tǒng)的瓶頸大部分是因?yàn)閿?shù)據(jù)庫設(shè)計(jì)不良造成的。
40多萬條的數(shù)據(jù)用不到索引將是比較慢的,尤其當(dāng)并發(fā)數(shù)很多的時(shí)候。 建議你:
首先對數(shù)據(jù)庫做壓力測試,找出幾個(gè)典型的數(shù)據(jù)庫操作。用測試工具進(jìn)行壓力測試。有條件的話可以用Loadrunner,qaload比較優(yōu)秀的測試工具進(jìn)
行測試。這樣可以清楚的看到你的數(shù)據(jù)庫的最大負(fù)載,以及在并發(fā)數(shù)很高的情況的得系統(tǒng)響應(yīng)速度。找出瓶頸,優(yōu)化你的數(shù)據(jù)庫設(shè)計(jì)。如果改優(yōu)化的地方都優(yōu)化了還
是不信給就需要做數(shù)據(jù)庫集群了。 再次;把一些頻繁訪問的數(shù)據(jù)放到內(nèi)存中。盡量減少與數(shù)據(jù)庫之間的操作,減少數(shù)據(jù)庫壓力。這樣很容易提高系統(tǒng)響應(yīng)速度,增加訪問量
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月21日 15:41
|
回復(fù)
|
|
>>>>>> 把一些頻繁訪問的數(shù)據(jù)放到內(nèi)存中。盡量減少與數(shù)據(jù)庫之間的操作,減少數(shù)據(jù)庫壓力。這樣很容易提高系統(tǒng)響應(yīng)速度,增加訪問量
有前提,應(yīng)該是頻繁訪問的、不進(jìn)行頻繁修改的數(shù)據(jù)放在內(nèi)存,同時(shí)希望摟主能夠提供更多的信息,以幫助更好的解決問題:)感覺我正在盲人摸象
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月22日 17:44
|
回復(fù)
|
|
我個(gè)人認(rèn)為 圖書信息采用類似xml的結(jié)構(gòu)存儲(chǔ) 是影響性能的關(guān)鍵, 根本就沒有用到數(shù)據(jù)庫的處理能力, 而利用虛擬機(jī)去解析龐大的xml.
應(yīng)該把這個(gè)改掉
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月23日 10:33
|
回復(fù)
|
|
>>我個(gè)人認(rèn)為 圖書信息采用類似xml的結(jié)構(gòu)存儲(chǔ) 是影響性能的關(guān)鍵, 根本就沒有用到數(shù)據(jù)庫的處理能力, 而利用虛擬機(jī)去解析龐大的xml.
也不一定,采用xml存儲(chǔ)可能會(huì)比采用數(shù)據(jù)庫存儲(chǔ)的性能要好些,舉個(gè)例子: 如果存儲(chǔ)樹形結(jié)構(gòu)的數(shù)據(jù)到數(shù)據(jù)庫中,可能需要進(jìn)行遍歷,當(dāng)進(jìn)行回朔查找上一級(jí)或者根節(jié)點(diǎn)的時(shí)候,是非常的消耗時(shí)間的,而采用xml存儲(chǔ)結(jié)構(gòu),這樣的查詢往往很快,你可以試一下xquery; 而且國內(nèi)現(xiàn)在存在倍多和timano公司的xml數(shù)據(jù)庫,查詢速度很快的,可以與關(guān)系型數(shù)據(jù)庫相媲美;
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月23日 10:48
|
回復(fù)
|
|
請問“banq”,你上面提到的“最好在Web層自己做一些緩存,這樣離客戶端最近,性能最好。”,請問大概是如何實(shí)現(xiàn)的?
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月23日 11:54
|
回復(fù)
|
|
> >>我個(gè)人認(rèn)為 圖書信息采用類似xml的結(jié)構(gòu)存儲(chǔ) > 是影響性能的關(guān)鍵, 根本就沒有用到數(shù)據(jù)庫的處理能力, > 而利用虛擬機(jī)去解析龐大的xml. > > 也不一定,采用xml存儲(chǔ)可能會(huì)比采用數(shù)據(jù)庫存儲(chǔ)的性能要好? > ,舉個(gè)例子: > 如果存儲(chǔ)樹形結(jié)構(gòu)的數(shù)據(jù)到數(shù)據(jù)庫中,可能需要進(jìn)行遍歷,當(dāng) > 謝廝凡檎疑弦患痘蛘吒詰愕氖焙潁欠淺5南氖奔淶模 > 而采用xml存儲(chǔ)結(jié)構(gòu),這樣的查詢往往很快,你可以試一下xqu > ry; > 而且國內(nèi)現(xiàn)在存在倍多和timano公司的xml數(shù)據(jù)庫,查詢速度? > 快的,可以與關(guān)系型數(shù)據(jù)庫相媲美;
原來新的數(shù)據(jù)庫已經(jīng)集成了對xml的支持了, 真是井底之蛙呀!
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月23日 11:57
|
回復(fù)
|
|
> 請問“banq”,你上面提到的“最好在Web層自己做一些緩存? > 這樣離客戶端最近,性能最好。”,請問大概是如何實(shí)現(xiàn)的?
就是把常用的內(nèi)容存放在內(nèi)容中, 用時(shí)只要訪問內(nèi)存, 不需要訪問數(shù)據(jù)庫或業(yè)務(wù)層, 這樣就快了.
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月23日 12:28
|
回復(fù)
|
|
> > > 請問“banq”,你上面提到的“最好在Web層自己做一些緩存?> > > > 這樣離客戶端最近,性能最好。”,請問大概是如何實(shí)現(xiàn)的? > > > 就是把常用的內(nèi)容存放在內(nèi)容中, 用時(shí)只要訪問內(nèi)存, > 不需要訪問數(shù)據(jù)庫或業(yè)務(wù)層, 這樣就快了. 原理我知道,我是指在Web層用什么技術(shù)實(shí)現(xiàn),特別是采用群集的系統(tǒng)。
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月23日 23:39
|
回復(fù)
|
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月24日 16:33
|
回復(fù)
|
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月25日 10:53
|
回復(fù)
|
|
VLDB(Very Large Data Bases) conference 2003中有一篇論文, Balancing Performance and Data Freshness in Web Database Servers 作者在這片文章中精彩的奉獻(xiàn)了一種web和數(shù)據(jù)庫應(yīng)用對頁面進(jìn)行cache提高性能的方法。 VLDB是數(shù)據(jù)庫領(lǐng)域最著名的學(xué)術(shù)會(huì)議之一。
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月25日 10:55
|
回復(fù)
|
|
忘了鏈接: http://wwwdb.informatik.uni-rostock.de/vldb2003/papers/S13P01.pdf
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月25日 13:38
|
回復(fù)
|
|
> > 就是把常用的內(nèi)容存放在內(nèi)容中, 用時(shí)只要訪問內(nèi)存, > > 不需要訪問數(shù)據(jù)庫或業(yè)務(wù)層, 這樣就快了.
胡扯! 圖書館這樣的數(shù)據(jù)庫查詢的離散性很大,加上緩存,只會(huì)導(dǎo)致速度更慢,占內(nèi)存更大! 這是典型的數(shù)據(jù)庫設(shè)計(jì)問題導(dǎo)致的,還是老老實(shí)實(shí)抓取 SQL 語句,放到數(shù)據(jù)庫中仔細(xì)的 Explain 吧!
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月26日 10:57
|
回復(fù)
|
|
> 最好在Web層自己做一些緩存, > 這樣離客戶端最近,性能最好
這樣的話,是可以解決一些性能問題的;但是這樣必將帶來一些不必要的麻煩,比如數(shù)據(jù)同步;
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月26日 13:20
|
回復(fù)
|
|
如果我沒有理解錯(cuò)的話,可能就是指在JavaBeans里自己做緩存。
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月26日 14:13
|
回復(fù)
|
|
web層的緩存其實(shí)就是類似jive處理緩存的技術(shù)類似
用一些容器類來放數(shù)據(jù)!直接放在內(nèi)存中!
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年07月26日 20:36
|
回復(fù)
|
|
問題的關(guān)鍵是: 你要緩存什么東西呢?以及要占用多大的內(nèi)存
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年08月06日 10:52
|
回復(fù)
|
|
大家少談一點(diǎn)設(shè)計(jì)模式好嗎?設(shè)計(jì)模式不是用來解決所有的問題的。 你的問題最重要的是數(shù)據(jù)庫結(jié)構(gòu)的設(shè)計(jì)上,還有sql的優(yōu)化。再說一個(gè)圖書信息系統(tǒng)需要將信息轉(zhuǎn)換成xml村成blob嗎?不理解。 最后慎用cache,除非你對數(shù)據(jù)一致、事務(wù)等問題很清楚。
|
|
|
|
Re: 請教如何提高查詢系統(tǒng)的性能?
|
發(fā)表: 2004年08月06日 15:44
|
回復(fù)
|
|
|
|
|