版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Java讀取PI數(shù)據(jù)庫測點(diǎn)值
最近公司組織培訓(xùn)PI數(shù)據(jù)庫,在聽課之余試驗(yàn)了一下java直接讀取PI數(shù)據(jù)庫。
1.安裝數(shù)據(jù)庫。
安裝osi,啟動(dòng)PIPerfMon_Basic.bat,使用processbook繪制一個(gè)趨勢圖,加入幾個(gè)例
子測點(diǎn),如“CDT158”,如圖:
2.Piapi簡介
利用PIAPI直接操作PI,安裝PI數(shù)據(jù)庫后會(huì)有一個(gè)piapi32.dll,提供了.net讀取的接口。
3.Jnative簡介
川ative是一種能夠使Java語言使調(diào)用DLL的一種技術(shù),對JNI進(jìn)行了封裝。我們將下載
的jnative.jar解壓后,有一個(gè)jNativeCpp.dll,將其拷入C:\windows\system32下,并將
jnative.jar加載到我們項(xiàng)目中來。準(zhǔn)備工作就緒。
4.程序讀取。
要點(diǎn)記錄:
1.閱讀API。打開PISystem->aboutPISDK->ViewHelp,即可看到api文檔。
PI數(shù)據(jù)庫的數(shù)據(jù)分別存儲(chǔ)在Snapshot或者Archive中,一個(gè)是快照一個(gè)是檔案文
件,這樣做是為了方便PI數(shù)據(jù)庫對數(shù)據(jù)進(jìn)行壓縮,那么自然對數(shù)據(jù)庫的讀取也分為對
Snapshot和Archive讀取.snapshot和archive的值都是用PIValue的形式表
示的,PIValue對象包括了數(shù)值和時(shí)間。
其中Pi的api中,用到最多的函數(shù)組是timefunctions、archivefunctions、snapshot
functions?timefunctions包含很多對時(shí)間處理的函數(shù);archivefunctions包含了對檔
案文件的讀寫的函數(shù);snapshotfunctions包含了對快照的讀取函數(shù)。
2.時(shí)間處理。
.net調(diào)用piapi傳入時(shí)間類型時(shí),是將.net的Date類型轉(zhuǎn)為int數(shù)組,并可以直接將
int數(shù)組傳入方法。Java使用時(shí)間類型稍微復(fù)雜一些,需要調(diào)用pitmjntsec方法,該
方法幫助如下:
PIVOIDpitm_intsec(
int32PIPTR*timedate,
int32timearray[6]);
Returns
None
Arguments
timedate(returned)
PItimestamp
timearray(passed)
表示該方法2個(gè)參數(shù),第一個(gè)是一個(gè)int型數(shù)組(指針),第二個(gè)參數(shù)是一個(gè)int型
數(shù)組。第一個(gè)參數(shù)是返回參數(shù),第二個(gè)參數(shù)是傳入?yún)?shù)。
注意,傳入int32timearray⑹參數(shù)時(shí),必須使用Pointer模擬指針,并且,循環(huán)設(shè)置
數(shù)組元素時(shí),注意pointer.setlntAt(intoffset,intvalue),offset的下標(biāo),比如第一個(gè)元素
是0,第二個(gè)元素不是1,要看int占幾個(gè)字節(jié),int在。Net中占4個(gè)字節(jié),所以第二個(gè)
元素是4,第三個(gè)元素是8。這是java調(diào)用.net時(shí),傳入和讀取數(shù)組時(shí)需要注意的事項(xiàng)。
3.Java與。Net類型匹配。
Api里的除字符串外的指針類型,對應(yīng)jnative的pointer。
Api里的int>float等基本類型和String類型,在java中必須指定類型(Type.INT)
Api里的date,是用int口表示的,詳見上條。
4.傳值與返回值。
Jnative對象調(diào)用invoke后會(huì)有返回,對照api,一般返回值是調(diào)用狀態(tài)。如果要查詢一
個(gè)測點(diǎn)值,返回值是通過傳入的pointer對象讀取出來的。
源代碼如下:
importjava?text.ParseException;
importjava,text.SimpleDateFormat;
importjava?util.Calendar;
importjava.util.Date;
importjava?util.regex.Matcher;
importjava.util.regex.Pattern;
importorg.xvolks.jnative.JNative;
importorg?xvolks.jnative.Type;
importorg.xvolks.jnative.exceptions.NativeException;
importorg.xvolks,jnative.pointers.Pointer;
importorg.xvolks,jnative.pointers.memory.HeapMemoryBlock;
importorg.xvolks.jnative.pointers.memory.MemoryBlock;
importorg.xvolks?jnative.pointers.memory.MemoryBlockFactory;
★★
*Java通過jnative調(diào)用pi實(shí)時(shí)數(shù)據(jù)庫dll類庫piapi32.dll獲取tag標(biāo)簽數(shù)據(jù)
*
★/
publicclassPlClientUtil{
privatestaticPlClientUtilpiClientUtil=newPlClientUtil();
publicstaticvoidmain(String[]args){
//PlClientUtil.getPlClientUtil().getTimeFromlnt("");
//PlClientUtil.getPlClientUtil().getTagValue(npicompress_Compressi
onRatio_CALCT,);
//PlClientUtil.getPlClientUtil().getTagValueByTime(nCDT158H,n2012-
05-17;
//PlClientUtil.getPIClientUtil().getTagValuesByTimeToTime(HCDT
11,n
158“,“2012-05-1711:11:ll,,2012-05-1718:00:00z2);
PlClientUtil.getPIClientUtil().getTagMaxValue("CDT158”,“2012-0
nH
5-17ll:ll:llz2012-05-1718:00:00”);
//PlClientUtil.getPIClientUtil().getTimeSecint(1);
//PlClientUtil.getPIClientUtil().getPiTime("“);
//PlClientUtil.getPIClientUtil().getTimelntSec(n2012-03-03
12:00:00°);
)
publicstaticPlClientUtilgetPIClientUtil(){
returnpiClientUtil;
)
privatePlClientUtil(){
try(
//*********************連接p[數(shù)據(jù)庫
*★★★*************★*★******//
//
***★*****★*****★*★★★*★***★*****★*★*★*****★*****★*★★★*★****//
JNativemessageBox=newJNative(npiapi32.dlln,
“piujsetservernode“);
messageBox.setRetVal(Type.INT);
messageBox.setParameter(0,Type.STRING,”");//月艮
務(wù)器ip
messageBox.invoke();
System.out.printIn(npiut_setservernode:H+messageBox.getRetValAsInt
0);
}catch(NativeExceptione){
//TODOAuto-generatedcatchblock
e,printStackTrace();
}catch(IllegalAccessExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
)
*獲取tag最新值
*@paramtagName
*?return
*/
publicfloatgetTagValue(StringtagName){
try(
JNativemessageBox=newJNative(npiapi32.dlln,
,Tpipt_findpoinf*);
messageBox.setRetVal(Type.INT);
messageBox.setParameter(0rType.STRING,tagName);
Pointerp=newPointer(newHeapMemoryBlock(1024));
messageBox.setParameter(1,p);
messageBox.invoke();
intptld=p.getAsInt(0);
if(0==messageBox.getRetValAsInt()){
System.out.printIn(”測點(diǎn)id:n+ptld);
n1
messageBox=newJNative(piapi32.dll'z
npisn_getsnapshotn);
messageBox.setRetVal(Type.工NT);
messageBox.setParameter(0,Type.INTZ""+ptld);
Pointerpp=newPointer(newHeapMemoryBlock(1024));
messageBox.setParameter(1zpp);
messageBox.setParameter(2ZnewPointer(new
HeapMemoryBlock(1024)));
//messageBox.setParameter(3,newPointer(new
HeapMemoryBlock(1024)));
//messageBox.setParameter(4,newPointer(new
HeapMemoryBlock(1024)));
messageBox.invoke();
if(0==messageBox.getRetValAsInt()){
System,out.printin(tagName+”測點(diǎn)
值:n+pp.getAsFloat(0));
returnpp.getAsFloat(0);
)
}else{
System.out.printIn("查詢測點(diǎn)失敗”);
}
}catch(NativeExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IllegalAccessExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnOF;
*獲取測點(diǎn)制定時(shí)間點(diǎn)的值
*@paramtagName
*@return
*/
publicfloatgetTagValueByTime(StringtagName,Stringtime){
try(
n
JNativemessageBox=newJNative(piapi32.dll"z
npipt_findpoint11);
messageBox.setRetVal(Type.INT);
messageBox.setParameter(0,Type.STRING,tagName);
Pointerp=newPointer(newHeapMemoryBlock(8));
messageBox.setParameter(lzp);
messageBox.invoke();
intptld=p.getAsInt(0);
if(0==messageBox.getRetValAsInt()){
System,out.printIn(“測點(diǎn)id:n4-ptlci);
messageBox=newJNative(npiapi32.dll",npiar_valueH);
messageBox.setRetVal(Type.INT);
messageBox.setParameter(0zType.工NT,""+ptld);
Pointerpp=newPointer(newHeapMemoryBlock(1024));
Pointerpp_status=newPointer(new
HeapMemoryBlock(1024));
messageBox.setParameter(lzgetTimelntSec(time));
messageBox.setParameter(2,Type.工NT,3+"”);
messageBox.setParameter(3,pp);
messageBox.setParameter(4zpp_status);
messageBox.invoke();
if(0==messageBox.getRetValAsInt()){
System,out.printIn(tagName+”測點(diǎn)
值:"+pp.getAsFloat(0));
System,out.printin(tagName+f,status
值:n+pp_status.getAsInt(0));
returnpp.getAsFloat(0);
}else{
System,out.printin(tagName+”查詢返回
值:n+messageBox.getRetValAsInt());
)
}else{
System.out.printin("查詢測點(diǎn)失敗”);
)
}catch(NativeExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IllegalAccessExceptione){
//TODOAuto-generatedcatchblock
e,printStackTrace();
)
returnOF;
)
*查詢測點(diǎn)某時(shí)間段內(nèi)最小值
*?paramtagName
*@paramtimel
*?paramtime2
*/
publicvoidgetTagMinValue(StringtagName,StringtimelfString
time2){
intcode=1;
this.getTagValuesByTimeToTime(tagName,timelztime2zcode);
)
**
*查詢測點(diǎn)某時(shí)間段內(nèi)最大值
*@paramtagName
*@paramtimel
*?paramtime2
*/
publicvoidgetTagMaxValue(StringtagName,StringtimelyString
time2){
intcode=2;
this.getTagValuesByTimeToTime(tagName,timelztime2zcode);
)
/**
*查詢測點(diǎn)某時(shí)間段內(nèi)平均值
*@paramtagName
*@paramtimel
*?paramtime2
*/
publicvoidgetTagAvgValue(StringtagName,StringtimelzString
time2){
intcode=5;
this.getTagValuesByTimeToTime(tagName,timel,time2,code);
)
/**
*
火@paramtagName
*@return
*/
publicvoidgetTagValuesByTimeToTime(StringtagName,String
timel,Stringtime2zintcode){
try(
nn
JNativemessageBox=newJNative(piapi32.dllr
"pipt_findpoinf1);
messageBox.setRetVal(Type.INT);
messageBox.setParameter(0,Type.STRING,tagName);
Pointerp=newPointer(newHeapMemoryBlock(1024));
messageBox.setParameter(1,p);
messageBox.invoke();
intptld=p.getAsInt(0);
if(0==messageBox.getRetValAsInt()){
System.out.printIn(“測點(diǎn)id:H+ptId);
messageBox=newJNative(npiapi32.dll'*,
npiar_summaryf,);
messageBox.setRetVal(Type.INT);
//下面開始設(shè)置參數(shù)
messageBox.setParameter(0zType.INTZ""+ptld);
Pointerp_startTime=this.getTimeIntSec(timel);
Pointerp_endTime=this.getTimelntSec(time2);
Pointerp_retVal=newPointer(newHeapMemoryBlock(8));
Pointerp_pctGood=newPointer(new
HeapMemoryBlock(8));
messageBox.setParameter(1,p_startTime);
messageBox.setParameter(2,p_endTime);
messageBox.setParameter(3,p_retVal);
messageBox.setParameter(4zp_pctGood);
nn
messageBox.setParameter(5,Type.INTzcode+);
messageBox.invoke();
if(0==messageBox.getRetValAsInt()){
System.out.printin(tagName+”測點(diǎn)返回
值:n+p_retVal.getAsFloat(0));
}else{
System.out.printIn(tagName+”查詢狀態(tài)
值:n+messageBox.getRetValAsInt());
)
}else{
System.out.printIn("查詢測點(diǎn)失敗");
)
}catch(NativeExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
)
)
/**
*將時(shí)間串轉(zhuǎn)換為int
*格式:11-Aug-1718:00:00
*@paramtime
*@return
*/
publicintgetPiTime(Stringtime){
//獲取時(shí)間點(diǎn)
try(
Stringtt=time;
Pointerpointer=new
Pointer(MemoryBlockFactory.createMemoryBlock(8));
H
JNativemessageBox=newJNative(piapi32.dll"z
npitm_parsetimen);
messageBox.setRetVal(Type.工NT);
messageBox.setParameter(0zType.STRING,tt);
messageBox.setParameter(1rType?工NT,"0");
messageBox.setParameter(2,pointer);
messageBox.invoke();
if(0==messageBox.getRetValAsInt()){
System.out.printIn("執(zhí)行成功,getPiTime結(jié)果是:“+
pointer.getAsInt(0));
returnpointer.getAsInt(0);
}else{
System.out.printIn("執(zhí)行失敗");
return0;
)
}catch(NativeExceptione){
e.printStackTrace();
return0;
}catch(IllegalAccessExceptione){
e,printStackTrace();
return0;
}
)
*將整數(shù)轉(zhuǎn)換為時(shí)間,同上方法互逆
*?paramtime
*@return
*/
publicStringgetTimeFromlnt(inttime){
try{
Pointerpointer=new
Pointer(MemoryBlockFactory.createMemoryBlock(8));
H
JNativemessageBox=newJNative(piapi32.dll"z
npitm_formtimen);
messageBox.setRetVal(Type.INT);
messageBox.setParameter(0,
Type.工NT,this.getPiTime(”“)+"");
messageBox.setParameter(1,pointer);
messageBox.setParameter(2z19);
messageBox.invoke();
System,out.printIn("結(jié)果是:"+pointer.getAsString());
returnpointer.getAsString();
}catch(NativeExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}
return
)
/**
*將P工日期轉(zhuǎn)為數(shù)組型
*?paramtime
*?return
*/
publicint[]getTimeSecint(inttime){
int[]time_arrays=newint[6];
try(
Pointerpointer=new
Pointer(MemoryBlockFactory.createMemoryBlock(4*
time_arrays.length));
JNativemessageBox=newJNative(Hpiapi32.dllH,
Hpitm_secintn);
messageBox.setParameter(0,
Type?工NT,this.getTimelntSec(n2012-05-17
ll:ll:lln).getAsInt(0)+nn);
messageBox.setParameter(1,pointer);
messageBox.invoke();
for(inti=0;i<time_arrays.length;i++){
time_arrays[i]=pointer.getAsInt(i*4);
}
returntime_arrays;
}catch(NativeExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}
returnnull;
)
/**
*將日期轉(zhuǎn)為數(shù)組型,與pitm_secint互相逆
*@paramtime
*?return
*/
publicPointergetTimelntSec(Stringtime){
PIDatedate=PIDate.getPIDate(time);
try(
inttime_array[]=newint[]{date.getMonth(),date.getDay(),
date,getYear(),date.getHour(),date.getMinutes(),
date.getSeconds()};
Pointerpointer=new
Pointer(MemoryBlockFactory.createMemoryBlock(8));
Pointerpointer_array=new
Pointer(MemoryBlockFactory.createMemoryBlock(time_array.length*4))
r
Hn
JNativemessageBox=newJNative(piapi32.dllz
upitm_intsecn);
/**這種方法也可以
pointer_array.setlntAt(0,2012);
pointer_array.setIntAt(4,5);
pointer_array.setlntAt(8,16);
pointer_array.setlntAt(12,21);
pointer_array.setlntAt(16,33);
pointer_array.setlntAt(20,33);
**/
//初始化數(shù)組
for(inti=0;i<time_array.length;i++){
pointer_array.setlntAt(4*i,time_array[i]);
}
messageBox.setParameter(0,pointer);
messageBox.setParameter(1,pointer_array);
messageBox.invoke();
System.out.printin(ngetTimeIntSec=n+pointer.getAsInt(0));
returnpointer;
}catch(NativeExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e,printStackTrace();
)
returnnull;
)
/**
*不能直接返回
*@paramtime
*?return
*/
publicintgetTimelntSecForlnt(Stringtime){
PIDatedate=PIDate.getPIDate(time);
try(
inttime_array[]=newint[]{date.getMonth(),date.getDay(),
date.getYear(),date.getHour(),date.getMinutes(),
date,getSeconds()};
Pointerpointer=new
Pointer(MemoryBlockFactory.createMemoryBlock(8));
Pointerpointer_array=new
Pointer(MemoryBlockFactory.createMemoryBlock(time_array.length*4))
r
JNativemessageBox=newJNative(Hpiapi32.dll*',
Hpitm_intsecn);
//初始化數(shù)組
for(inti=0;i<time_array.length;i++){
pointer_array.setlntAt(4*iztime_array[i]);
)
messageBox.setParameter(0zpointer);
messageBox.setParameter(1,pointer_array);
messageBox.invoke();
System.out.printIn(ngetTimeIntSec="+pointer.getAsInt(0));
returnpointer.getAsInt(0);
}catch(NativeExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}
return0;
時(shí)間工具類:
importjava.util.regex.Matcher;
importjava.utiI.regex.Pattern;
publicclassPIDate{
privateintyear;
privateintmonth;
privateintday;
privateinthour;
privateintminutes;
privateintseconds;
publicintgetYear(){
returnyear;
)
publicvoidsetYear(intyear){
this.year=year;
)
publicintgetMonth(){
returnmonth;
}
publicvoidsetMonth(intmonth){
this.month=month;
)
publicintgetDayO{
returnday;
)
publicvoidsetDay(intday){
this.day=day;
)
publicintgetHour(){
returnhour;
publicvoidsetHour(inthour){
this.hour=hour;
)
publicintgetMinutes(){
returnminutes;
)
publicvoidsetMinutes(intminutes){
this.minutes=minutes;
)
publicintgetSeconds(){
returnseconds;
)
publicvoidsetSeconds(intseconds){
this.seconds=seconds;
)
publicstaticPIDategetPIDate(Stringtime){
Patternp=Ppile("(\\d{4})-(\\d{l.2})-(\\d{l/2})
(\\d{l,2}):(\\d{lz2)):(\\d{l,2})");
Matcherm=p.matcher(time);
PIDatedate=newPIDate();
if(m.find()){
/*System.out.println("H期:"+m.group());
System.out.println("^:n+m.group(l));
System.out.printin("月:"+m.group(2));
System.out.println("日:"+m.group(3));
System.out.println("時(shí):”+m.group⑷);
System.out.printin(“分:“+m.group(5));
System.out.printin(”秒:“+m.group⑹);*/
date.setYear(lnteger.parselnt(m.group(l)));
date.setMonth(lnteger.parselnt(m.group(2)));
date.setDay(lnteger.parselnt(m.group(3)));
date.setHour(lnteger.parselnt(m.group(4)));
date.setMinutes(lnteger.parselnt(m.group(5)));
date.setSeconds(lnteger.parselnt(m.group(6)));
)
returndate;
)
}
附錄資料:
java處理高并發(fā)高負(fù)載類網(wǎng)站的優(yōu)化方法
java處理高并發(fā)高負(fù)載類網(wǎng)站中數(shù)據(jù)庫的設(shè)計(jì)方法(java教程,java處理大量數(shù)
據(jù)Java高負(fù)載數(shù)據(jù))
-:高并發(fā)高負(fù)載類網(wǎng)站關(guān)注點(diǎn)之?dāng)?shù)據(jù)庫
沒錯(cuò),首先是數(shù)據(jù)庫,這是大多數(shù)應(yīng)用所面臨的首個(gè)尤其是的應(yīng)
SPOFoWeb2.0
用,數(shù)據(jù)庫的響應(yīng)是首先要解決的。一般來說MySQL是最常用的,可能最初是
一個(gè)mysql主機(jī),當(dāng)數(shù)據(jù)增加到100萬以上,那么,MySQL的效能急劇下降。
常用的優(yōu)化措施是M-S(主-從)方式進(jìn)行同步復(fù)制,將查詢和操作和分別在不
同的服務(wù)器上進(jìn)行操作。我推薦的是M-M-Slaves方式,2個(gè)主Mysql,多個(gè)
Slaves,需要注意的是,雖然有2個(gè)Master,但是同時(shí)只有1個(gè)是Active,我
們可以在一定時(shí)候切換。之所以用個(gè),是保證不會(huì)又成為系統(tǒng)的
2MMSPOFo
Slaves可以進(jìn)一步負(fù)載均衡,可以結(jié)合LVS,從而將select操作適當(dāng)?shù)钠胶獾讲?/p>
同的slaves上。以上架構(gòu)可以抗衡到一定量的負(fù)載,但是隨著用戶進(jìn)一步增加,
你的用戶表數(shù)據(jù)超過1千萬這時(shí)那個(gè)M變成了SPOF。你不能任意擴(kuò)充Slaves,
否則復(fù)制同步的開銷將直線上升,怎么辦?我的方法是表分區(qū),從業(yè)務(wù)層面上進(jìn)
行分區(qū)。最簡單的,以用戶數(shù)據(jù)為例。根據(jù)一定的切分方式,比如id,切分到
不同的數(shù)據(jù)庫集群去。
全局?jǐn)?shù)據(jù)庫用于meta數(shù)據(jù)的查詢。缺點(diǎn)是每次查詢,會(huì)增加一次,比如你要查
一個(gè)用戶nightsailer,你首先要到全局?jǐn)?shù)據(jù)庫群找到nightsailer對應(yīng)的cluster
id,然后再到指定的cluster找到nightsailer的實(shí)際數(shù)據(jù)。每個(gè)cluster可以用
m-m方式,或者m-m-slaves方式。這是一個(gè)可以擴(kuò)展的結(jié)構(gòu),隨著負(fù)載的增
加,你可以簡單的增加新的mysqlcluster進(jìn)去。
需要注意的是:1、禁用全部autojncrement的字段2、id需要采用通用的算
法集中分配3、要具有比較好的方法來監(jiān)控mysql主機(jī)的負(fù)載和服務(wù)的運(yùn)行狀
態(tài)。如果你有30臺(tái)以上的mysql數(shù)據(jù)庫在跑就明白我的意思了。4、不要使用
持久性鏈接(不要用pconnect),相反,使用sqlrelay這種第三方的數(shù)據(jù)庫鏈接
池,或者干脆自己做,因?yàn)閜hp4中mysql的鏈接池經(jīng)常出問題。二:高并發(fā)
高負(fù)載網(wǎng)站的系統(tǒng)架構(gòu)之HTML靜態(tài)化
其實(shí)大家都知道,效率最高、消耗最小的就是純靜態(tài)化,所以我們盡可能使我們
的網(wǎng)站上的頁面采用靜態(tài)頁面來實(shí)現(xiàn),這個(gè)最簡單的方法其實(shí)也是最有效的方
法。但是對于大量內(nèi)容并且頻繁更新的網(wǎng)站,我們無法全部手動(dòng)去挨個(gè)實(shí)現(xiàn),于
是出現(xiàn)了我們常見的信息發(fā)布系統(tǒng)CMS,像我們常訪問的各個(gè)門戶站點(diǎn)的新聞
頻道,甚至他們的其他頻道,都是通過信息發(fā)布系統(tǒng)來管理和實(shí)現(xiàn)的,信息發(fā)布
系統(tǒng)可以實(shí)現(xiàn)最簡單的信息錄入自動(dòng)生成靜態(tài)頁面,還能具備頻道管理、權(quán)限管
理、自動(dòng)抓取等功能,對于一個(gè)大型網(wǎng)站來說,擁有一套高效、可管理的CMS
是必不可少的。除了門戶和信息發(fā)布類型的網(wǎng)站,對于交互性要求很高的社
區(qū)類型網(wǎng)站來說,盡可能的靜態(tài)化也是提高性能的必要手段,將社區(qū)內(nèi)的帖子、
文章進(jìn)行實(shí)時(shí)的靜態(tài)化,有更新的時(shí)候再重新靜態(tài)化也是大量使用的策略,像
Mop的大雜炮就是使用了這樣的策略,網(wǎng)易社區(qū)等也是如此。同時(shí),html
靜態(tài)化也是某些緩存策略使用的手段,對于系統(tǒng)中頻繁使用數(shù)據(jù)庫查詢但是內(nèi)容
更新很小的應(yīng)用,可以考慮使用html靜態(tài)化來實(shí)現(xiàn),比如論壇中論壇的公用
設(shè)置信息,這些信息目前的主流論壇都可以進(jìn)行后臺(tái)管理并且存儲(chǔ)再數(shù)據(jù)庫中,
這些信息其實(shí)大量被前臺(tái)程序調(diào)用,但是更新頻率很小,可以考慮將這部分內(nèi)
容進(jìn)行后臺(tái)更新的時(shí)候進(jìn)行靜態(tài)化,這樣避免了大量的數(shù)據(jù)庫訪問請求高并發(fā)。
網(wǎng)站HTML靜態(tài)化解決方案當(dāng)一個(gè)Servlet資源請求到達(dá)WEB服務(wù)器之后我們
會(huì)填充指定的JSP頁面來響應(yīng)請求:
HTTP請求一Web服務(wù)器一Servlet-業(yè)務(wù)邏輯處理一訪問數(shù)據(jù)一填充JSP一響
應(yīng)請求
HTML靜態(tài)化之后:
HTTP請求--Web服務(wù)器Servlet--HTML—響應(yīng)請求
靜態(tài)訪求如下
Servlet:
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponse
response)throwsServletException,lOException
{if(request.getParameterCchapterId")!=null){String
chapterFileName=
"bookChapterRead_"+request.getParameterCchapterId")+".html";
Stringch叩terFilePath=getServletContext().getRealPath(7")+
chapterFileName;FilechapterFile=new
File(chapterFilePath);if(chapterFile.exists()){response.sendRedirect
(ch叩terFileName);return;}〃如果有這個(gè)文件就告訴瀏覽器轉(zhuǎn)
向INovelChapterBiznovelChapterBiz=new
NovelChapterBizImpl();Novelchapternovelchapter=
novelChapterBiz.searchNovelChapterById(Integer.parseInt(request.getP
arameterCchapterld")));//章節(jié)信息intlastPageld=
novelChapterBiz.searchLastCHapterId(novelChapter.getNovelId().getId(),
novelChapter.getId());intnextPageld=
novelChapterBiz.searchNextChapterId(novelChapter.getNovelId().getId(),
novelChapter.getId());request.setAttribute("novelChapter",
novelchapter);request.setAttribute("lastPageld",
lastPageld);request.setAttribute("nextPageld",
nextPageld);new
CreateStaticHTMLPage().createStaticHTMLPage(request,response,
getServletContext(),chapterFileName,chapterFilePath,
VbookRead.jsp");}}生成HTML靜態(tài)頁面的類:
packagecom.jb.y2t034.thefifth.web.servlet;import
java.io.ByteArrayOutputStream;import
java.io.FileOutputStream;importjava.io.IOException;import
java.io.OutputStreamWriter;importjava.io.Printwriter;import
javax.servlet.RequestDispatcher;import
javax.servlet.ServletContext;import
javax.servlet.ServletException;import
javax.servlet.ServletOutputStream;import
javax.servlet.http.HttpServletRequest;import
javax.servlet.http.HttpServletResponse;import
javax.servlet.http.HttpServletResponseWrapper;/***創(chuàng)建HTML靜態(tài)頁
面*功能:創(chuàng)建HTML靜態(tài)頁面*時(shí)間:2009年1011日*地點(diǎn):home*
@authormavk**/publicclassCreateStaticHTMLPage{/***牛
成靜態(tài)HTML頁面的方法*@paramrequest請求對象*@param
response響應(yīng)對象*@paramservletContextServlet上下文*
@paramfileName文件名稱*@paramfileFullPath文件完整路徑*
@paramjspPath需要生成靜態(tài)文件的JSP路徑(相對即可)*@throws
lOException*@throwsServletException*/publicvoid
createStaticHTMLPage(HttpServletRequestrequest,
HttpServletResponseresponse,ServletContextservletContext,String
fileName,StringfileFullPath,StringjspPath)throwsServletException,
IOException{response.setContentType("text/html;charset=gb231
2");〃設(shè)置HTML結(jié)果流編碼(即HTML文件編碼)RequestDispatcher
rd=servletContext.getRequestDispatcher(jspPath);//得至UJSP資
源finalByteArrayOutputStreambyteArrayOutputStream=new
ByteArrayOutputStream();//用于從ServletOutputStream中接收資
源finalServletOutputStreamservletOuputStream=new
ServletOutputStream(){//用于從HttpServletResponse中接收資
源publicvoidwrite(byte[]b,intoff,int
len){byteArrayOutputStream.write(b,off,
len);}publicvoidwrite(int
b){byteArrayOutputStream.write(b);}};f
inalPrintWriterprintwriter=newPrintWriter(new
OutputStreamWriter(byteArrayOutputStream));〃
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- YY/T 1950-2024組織工程醫(yī)療器械絲素蛋白
- YY/T 0860-2024心臟射頻消融治療設(shè)備
- 貴州財(cái)經(jīng)職業(yè)學(xué)院《小組工作》2023-2024學(xué)年第一學(xué)期期末試卷
- 貴陽職業(yè)技術(shù)學(xué)院《建筑風(fēng)景表現(xiàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025陜西省安全員-B證考試題庫附答案
- 紅棗小鎮(zhèn)建設(shè)項(xiàng)目可行性研究報(bào)告-紅棗市場需求持續(xù)擴(kuò)大
- 廣州中醫(yī)藥大學(xué)《食品微生物學(xué)(雙語)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年湖南省安全員考試題庫及答案
- 2025年山東省安全員《B證》考試題庫
- 廣州醫(yī)科大學(xué)《小學(xué)語文教學(xué)設(shè)計(jì)與實(shí)訓(xùn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2023-2024學(xué)年浙江省杭州市上城區(qū)教科版四年級上冊期末考試科學(xué)試卷
- 期末 (試題) -2024-2025學(xué)年外研版(三起)(2024)英語三年級上冊
- 2023年彌渡縣廣播電視臺(tái)(融媒體中心)招聘筆試題庫及答案解析
- 體能訓(xùn)練講解健身課件
- 2023年成都溫江興蓉西城市運(yùn)營集團(tuán)有限公司招聘筆試題庫及答案解析
- 地震工程學(xué)-反應(yīng)譜和地震時(shí)程波的相互轉(zhuǎn)化matlab編程
- 建筑工程施工現(xiàn)場視頻監(jiān)控布置實(shí)施方案
- 施工現(xiàn)場節(jié)前安全檢查表
- 松下vf100變頻器使用手冊
- 機(jī)械設(shè)計(jì)制造及其自動(dòng)化實(shí)習(xí)總結(jié)報(bào)告——某
- 角的概念推廣說課課件.
評論
0/150
提交評論