Thursday, October 06, 2005

什?情況下應該把網站的頁面變成靜態網頁發布?

WEB界面靜態化進入最後的環節,可以令管理員分門分類分子網地選擇項目進行靜態化,主要是首頁,效率很高,按由XML設定的靜態化項目,一 個網站管理員可以在幾分鍾內完成上千個首頁的靜態化發布。但是當進入到再翻頁部分時,卻令我沈思了整整半天,覺得前面幾天的路,也許走錯了。

要知道錯在什?地方,最好先看看?什?要進行WEB界面靜態化。我絕不在乎已經浮了兩年多的所謂不能把WEB界面變成靜態頁面就是技術不佳的話,事實上, 今天才開始靜態化是由于搜索引擎的要求。換言之,如果不是由于有搜索引擎極大的訪問壓力,僅僅是人的點擊的話,根本不需要考慮動態網頁靜態提供。這就是路 可能走錯的原因,因?,對于人來說,把首頁進行靜態化是可以減輕訪問壓力的;而對于搜索引擎來說,如果梢頁也是以?靜態形式提供的話,那?是否首頁並不重 要了,因?搜索引擎會順著連接把整個網站搜個遍,如果僅僅是把首頁靜態化,對于減輕搜索引擎的壓力沒有什?幫助,如果是把所有異化的網頁全部靜態化,工程 何其大也,包括使用者網站編輯,她們能夠承受嗎?

把首頁靜態化的原因,說起來主要與中國國內的網站設計陋習有關:總是把首頁做得奇大無比,塞滿了沒有人看的垃圾。因此,假設受?總是先到首頁的話,那?首 頁的負載就是後續頁面的幾十倍,把它靜態化,也就省下了資源。但實際上目前的趨勢,或者說國外網站的大勢是使用精簡的小首頁,這樣靜態化就沒有太大的必 要;如果訪問負載來自于搜索引擎的話,就更沒有必要了。

那?什?內容應該以靜態網頁提供呢?大致可以把網頁分成三類:一是導航性網頁,這類頁面變化少,適宜使用靜態頁面提供;國外網站的首頁一般是這種形式;二 是內容分類列表、摘要網頁,這類是相對于書本的目錄,如果是更新頻繁的話,靜態網頁很難做,主要是需要實時更新的內容太多,一般適宜動態網頁;三是內容 頁,如文章內容,這類網頁罕有訪問,也極少變動,適于變成靜態網頁。國內的網站的常見的大首頁,主要是把第一類和第二類的功能混淆起來。我的系統的功能目 前是主要把第一類變成靜態,還是挺有用的,但嘗試把第二類變成靜態,就不恰當了,這就是我錯的地方。

“把動態頁面轉成靜態頁面”,需求看似簡單,但只有實際做下去,才知道什?是合適的,什?不是合適的。

Saturday, September 24, 2005

使用DBCopier進行不同數據庫間的數據移植

DBCopier同樣是在多數據庫環境中,?了適應數據整理和拷貝而開發的可重用構件。不過,實際上,更多的情況是用在不同的開發過程中由于表結構的修改,而需要對曆史數據進行整理歸一的過程。

DBCopier的工作核心是mission.xml,每一個mission是一個拷貝任務;不同的數據庫連接在connectionset元素中定義,實際上,這與ConnextionManger和DAO中的定義和解釋是一樣的。
如:




uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="conn" password="
abcd" />
uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="reso" password="abcd" />
uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="daifu" password="abcdef" />
uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="system" password="abcdefg" />


定義了若幹個數據庫連接定義。根據需要,DBCopier可以把不同的數據庫中的表拷貝到另一個數庫的某個或幾個表上,也可以在同一個數據庫中拷貝。

每一個mission是一個任務:


= ${MIN} and id < ${MAX}]]>


insert into sectart (name,chn,deleted,on_off_line,section,type,remark) values (${name},${chn},${deleted},${on_off_line},${section},${type},${remark})






詳細定義是:
mission代表一?拷?任?;
mission.(target/source) 分?表明拷?的目?和?源,?构是(?据源.表名),意?是直接??表操作,?管主要由Query????,或者是Clazz,但是在?算步?和?量?仍需要?里的表名。反而是target可以直接?据源名?。
mission.index 指示是以什么域作?拷???的指?,如id;
mission.range;采用1-2000??的形式,前者是起始,后是??(?照index);如果是“*”,表示全部拷?(默?)。
mission.step:步?,即每次?作?程拷?多少,??相?于?置??大小;每次?行step的?目,或????(小于step?)
mission.condition是拷??象的附加?件;可以直接?作cdata形式;
mission.query元素: 每?mission目前可以定?多?Query?象,但至少包括分?命名?write的Query?象,如果?有mission.clazz作??入源, ?必?有一?名?read的Query?象;特?注意read?象,如果其中有"WHERE"一定要大?,特?是在condition有?西的?侯;$ {MIN}/${MAX}是程序?定的大值和小值??,与range配合,即使是“*”,???值也是必?的;因?步???的?侯需要???值
注意:query.sql中如果有域是long/clob型的,一定要?在最前面,否?可能出?;

mission.clazz元素:{
?于一些复??构的?据?象?型,很?确定?一?表?表的抄?,同?也?包含有多?的互相?束,??侯需要使用?据?象作??据源;即每一??象?例是相 ?于一行主表的??,它的?性是各?基表或子表值;clazz?象tools.xmlobj.Clazz必???tools.COPIER接口,并用?准 的setter/getter取/置值;
clazz.attribute?象;主要包括三??性,name,value,和type,type用于反射?的class型?得,因此要求完全的名?,以便在程序中Class.forName();
}

mission.field;{
DBCopier??上是使用Query.write中的?量?得一?串,然后通???串?索qread或者是cread形成一?名值?填充好一?完整的 sql,最后?行??batchsql完成移植的目的。每??量串中的域?得值的方式各不相同,特?是在?多情?下?移的?程本身就是?原?不合理的?据 ??方式的重整,(?范化或非?范化),filed就是????需求?行?置。如果?有相?的field?置,?采用默??置,即名?相同且都是字符串 值;field的??是首先采?value值,然后按query取值,最后按常?取值;

field.name:?名??与qwrite中的?量名?之一匹配;否?DBCopier?加以忽略;
field.sname:?名?指老表中的域名?,DBCopier通????cread或qread的rs中??据;默?地与field.name相同;
field.stype:?入的?型,???于使用qread特?重要,尤其?于date?型;
field.ttype:?出的?型,是指插入的?型,主要是因?生成sql?字符串需要使用‘’括起?;
filed.value: value是?定的值;可用此直接?一行?值;如果是“system.time”,意思是取System.currentTimeMillis()的值;
field.query:{
如果?域必???特?的查?得到值,就?定所用的query名?,??query??已?定?在同一?mission中。
field.query??上??了???程,一是以前述的方法?得一?指定的?量;代入query的sql?定,?行??sql再?取它的值;
??field的域含?有重大的修改:
field.sname指代入field.query.sql中的?量名?,一定要与相?的?据?接中的表.域名?相同;
field.stype指???query?果?的?型;其余意思一?。
field.filter; 如果??域在存入新?中?需要??更替其中的一些字符串,?置好filter后用?????用。
}
注意:query的connetion查?到底是那一?的,常常是??的?系;
}

mission.filter,用于????程中的字符串列?行必要的字符替?和??;由field?用;

在定義好後,執行:
java DBCopier mission=xxxx;;
程序就會按照步長一段一段地完成數據移植任務,不滿意就重新來一遍。之所以要分割步長,是為了避免多個連接游標在大數據表時溢出出錯。