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

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

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

    DWR(Direct Web Remoting)是一個開源的類庫,可以幫助開發人員開發包含AJAX技術的網站.它可以允許在瀏覽器里的代碼使用運行在WEB服務器上的JAVA函數,就像它就在瀏覽器里一樣.

    它包含兩個主要的部分:允許JavaScript從WEB服務器上一個遵循了AJAX原則的Servlet(小應用程序)中獲取數據.另外一方面一個JavaScript庫可以幫助網站開發人員輕松地利用獲取的數據來動態改變網頁的內容.

    DWR采取了一個類似AJAX的新方法來動態生成基于JAVA類的JavaScript代碼.這樣WEB開發人員就可以在JavaScript里使用Java代碼就像它們是瀏覽器的本地代碼(客戶端代碼)一樣;但是Java代碼運行在WEB服務器端而且可以自由訪問WEB 服務器的資源.出于安全的理由,WEB開發者必須適當地配置哪些Java類可以安全的被外部使用.

    這個從JAVA到JavaScript的遠程功能方法給DWR的用戶帶來非常像傳統的RPC機制,就像RMI或者SOAP一樣,而且擁有運行在WEB上但是不需要瀏覽器插件的好處.

    DWR不認為瀏覽器/WEB服務器協議是重要的,而更樂于保證編程界面的簡單自然.對此最大的挑戰就是把AJAX的異步特性和正常JAVA方法調用的同步特性相結合.在異步模式下,結果數據在開始調用之后的一段時間之后才可以被異步訪問獲取到.DWR允許WEB開發人員傳遞一個回調函數,來異步處理Java函數調用過程.

    其配置如下:
    1.1、dwr.xml的配置
    <dwr>
    <allow>
    <create creator="new" javascript="testClass" >

    <include method="testMethod1"/>
    </create>
    </allow>
    </dwr>
    <allow>標簽中包括可以暴露給javascript訪問的東西。
    <create>標簽中指定javascript中可以訪問的java類,并定義DWR應當如何獲得要進行遠程的類的實例。creator="new"屬性指定java類實例的生成方式,new意味著DWR應當調用類的默認構造函數來獲得實例,其他的還有spring方式,通過與IOC容器Spring進行集成來獲得實例等等。javascript=" testClass "屬性指定javascript代碼訪問對象時使用的名稱。
    標簽指定要公開給javascript的java類名。
    <include>標簽指定要公開給javascript的方法。不指定的話就公開所有方法。
    <exclude>標簽指定要防止被訪問的方法。
    1.2、javascript中調用
    首先,引入javascript腳本
    <script src='dwr/interface/ testClass.js'></script>
    <script src='dwr/engine.js'></script>
    <script src='dwr/util.js'></script>
    其中TestClass.js是dwr根據配置文件自動生成的,engine.js和util.js是dwr自帶的腳本文件。
    其次,編寫調用java方法的javascript函數
    Function callTestMethod1(){
    testClass.testMethod1();
    }
    2、調用有簡單返回值的java方法
    2.1、dwr.xml的配置
    配置同1.1
    <dwr>
    <allow>
    <create creator="new" javascript="testClass" >

    <include method="testMethod2"/>
    </create>
    </allow>
    </dwr>
    2.2、javascript中調用
    首先,引入javascript腳本
    其次,編寫調用java方法的javascript函數和接收返回值的回調函數
    Function callTestMethod2(){
    testClass.testMethod2(callBackFortestMethod2);
    }
    Function callBackFortestMethod2(data){
    //其中date接收方法的返回值
    //可以在這里對返回值進行處理和顯示等等
    alert("the return value is " + data);
    }
    其中callBackFortestMethod2是接收返回值的回調函數
    3、調用有簡單參數的java方法
    3.1、dwr.xml的配置
    配置同1.1
    <dwr>
    <allow>
    <create creator="new" javascript="testClass" >

    <include method="testMethod3"/>
    </create>
    </allow>
    </dwr>
    3.2、javascript中調用
    首先,引入javascript腳本
    其次,編寫調用java方法的javascript函數
    Function callTestMethod3(){
    //定義要傳到java方法中的參數
    var data;
    //構造參數
    data = “test String”;
    testClass.testMethod3(data);
    }
    4、調用返回JavaBean的java方法
    4.1、dwr.xml的配置
    <dwr>
    <allow>
    <create creator="new" javascript="testClass" >

    <include method="testMethod4"/>
    </create>
    <convert converter="bean" match=""com.dwr.TestBean">

    </convert>
    </allow>
    </dwr>
    <creator>標簽負責公開用于Web遠程的類和類的方法,<convertor>標簽則負責這些方法的參數和返回類型。convert元素的作用是告訴DWR在服務器端Java 對象表示和序列化的JavaScript之間如何轉換數據類型。DWR自動地在Java和JavaScript表示之間調整簡單數據類型。這些類型包括Java原生類型和它們各自的封裝類表示,還有String、Date、數組和集合類型。DWR也能把JavaBean轉換成JavaScript 表示,但是出于安全性的原因,要求顯式的配置,<convertor>標簽就是完成此功能的。converter="bean"屬性指定轉換的方式采用JavaBean命名規范,match=""com.dwr.TestBean"屬性指定要轉換的javabean名稱,標簽指定要轉換的JavaBean屬性。
    4.2、javascript中調用
    首先,引入javascript腳本
    其次,編寫調用java方法的javascript函數和接收返回值的回調函數
    Function callTestMethod4(){
    testClass.testMethod4(callBackFortestMethod4);
    }
    Function callBackFortestMethod4(data){
    //其中date接收方法的返回值
    //對于JavaBean返回值,有兩種方式處理
    //不知道屬性名稱時,使用如下方法
    for(var property in data){
    alert("property:"+property);
    alert(property+":"+data[property]);
    }
    //知道屬性名稱時,使用如下方法
    alert(data.username);
    alert(data.password);
    }
    其中callBackFortestMethod4是接收返回值的回調函數
    5、調用有JavaBean參數的java方法
    5.1、dwr.xml的配置
    配置同4.1
    <dwr>
    <allow>
    <create creator="new" javascript="testClass" >

    <include method="testMethod5"/>
    </create>
    <convert converter="bean" match="com.dwr.TestBean">

    </convert>
    </allow>
    </dwr>
    5.2、javascript中調用
    首先,引入javascript腳本
    其次,編寫調用java方法的javascript函數
    Function callTestMethod5(){
    //定義要傳到java方法中的參數
    var data;
    //構造參數,date實際上是一個object
    data = { username:"user", password:"password" }
    testClass.testMethod5(data);
    }
    6、調用返回List、Set或者Map的java方法
    6.1、dwr.xml的配置
    配置同4.1
    <dwr>
    <allow>
    <create creator="new" javascript="testClass" >

    <include method="testMethod6"/>
    </create>
    <convert converter="bean" match="com.dwr.TestBean">

    </convert>
    </allow>
    </dwr>
    注意:如果List、Set或者Map中的元素均為簡單類型(包括其封裝類)或String、Date、數組和集合類型,則不需要<convert>標簽。
    6.2、javascript中調用(以返回List為例,List的元素為TestBean)
    首先,引入javascript腳本
    其次,編寫調用java方法的javascript函數和接收返回值的回調函數
    Function callTestMethod6(){
    testClass.testMethod6(callBackFortestMethod6);
    }
    Function callBackFortestMethod6(data){
    //其中date接收方法的返回值
    //對于JavaBean返回值,有兩種方式處理
    //不知道屬性名稱時,使用如下方法
    for(var i=0;i<data.length;i++){
    for(var property in data){
    alert("property:"+property);
    alert(property+":"+data[property]);
    }
    }
    //知道屬性名稱時,使用如下方法
    for(var i=0;i<data.length;i++){
    alert(data.username);
    alert(data.password);
    }
    }
    7、調用有List、Set或者Map參數的java方法
    7.1、dwr.xml的配置
    <dwr>
    <allow>
    <create creator="new" javascript="testClass" >

    <include method="testMethod7"/>
    </create>
    <convert converter="bean" match="com.dwr.TestBean">

    </convert>
    </allow>
    <signatures>
    <![CDATA[
    import java.util.List;
    import com.dwr.TestClass;
    import com.dwr.TestBean;
    TestClass.testMethod7(List<TestBean>);
    ]]>
    </signatures>
    </dwr>
    <signatures>標簽是用來聲明java方法中List、Set或者Map參數所包含的確切類,以便java代碼作出判斷。
    7.2、javascript中調用(以返回List為例,List的元素為TestBean)
    首先,引入javascript腳本
    其次,編寫調用java方法的javascript函數
    Function callTestMethod7(){
    //定義要傳到java方法中的參數
    var data;
    //構造參數,date實際上是一個object數組,即數組的每個元素均為object
    data = [
    {
    username:"user1",
    password:"password2"
    },
    {
    username:"user2",
    password:" password2"
    }
    ];
    testClass.testMethod7(data);
    }
    注意:
    1、對于第6種情況,如果java方法的返回值為Map,則在接收該返回值的javascript回調函數中如下處理:
    function callBackFortestMethod(data){
    //其中date接收方法的返回值
    for(var property in data){
    var bean = data[property];
    alert(bean.username);
    alert(bean.password);
    }
    }
    2、對于第7種情況,如果java的方法的參數為Map(假設其key為String,value為TestBean),則在調用該方法的javascript函數中用如下方法構造要傳遞的參數:
    function callTestMethod (){
    //定義要傳到java方法中的參數
    var data;
    //構造參數,date實際上是一個object,其屬性名為Map的key,屬性值為Map的value
    data = {
    "key1":{
    username:"user1",
    password:"password2"
    },
    "key2":{
    username:"user2",
    password:" password2"
    }
    };
    testClass.testMethod(data);
    }
    并且在dwr.xml中增加如下的配置段
    <signatures>
    <![CDATA[
    import java.util.List;
    import com.dwr.TestClass;
    import com.dwr.TestBean;
    TestClass.testMethod7(Map<String,TestBean>);
    ]]>
    </signatures>
    3、由以上可以發現,對于java方法的返回值為List(Set)的情況,DWR將其轉化為Object數組,傳遞個javascript;對于java方法的返回值為Map的情況,DWR將其轉化為一個Object,其中Object的屬性為原Map的key值,屬性值為原Map相應的value值。
    4、如果java方法的參數為List(Set)和Map的情況,javascript中也要根據3種所說,構造相應的javascript數據來傳遞到java中

    1. 安裝 DWR JAR 包
    下載 dwr.jar 文件,然后將它放在 web 程序的 WEB-INF/lib 目錄下面,很可能在這個目錄下已經有一些 jar 文件了。
    2. 編輯 config 文件
    將下面的代碼添加到 WEB-INF/web.xml 文件中,<servlet>需要放在另外的<servlet>之后,<servlet-mapping>也是如此。
    <servlet>
    <servlet-name>dwr-invoker</servlet-name>
    <display-name>DWR Servlet</display-name>
    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
    <init-param>
         debug</param-name>
         true</param-value>
    </init-param>
    </servlet>
    <servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
    </servlet-mapping>
    接下來創建 dwr.xml 文件并將此放在 web.xml 所在的 WEB-INF 目錄下。文件中類似下面的內容:
    <!DOCTYPE dwr PUBLIC
        ”-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN”
        ”http://www.getahead.ltd.uk/dwr/dwr10.dtd”>
    <dwr>
    <allow>
        <create creator=”new” javascript=”JDate”>
         
        </create>
        <create creator=”new” javascript=”Demo”>
         
        </create>
    </allow>
    </dwr>
    DWR 配置文件定義了由 DWR 創建和被 Javascript 遠程使用的類。在上面的例子中我們在遠程創建了2個類,并且給出了在 Javascript 中的類名。
    上面使用的 new creator 使用了所有的 JavaBeans 必須含有的公有(public)無參(no-args)的構造函數。值得一提的是, DWR 還有一些限制:
    避免使用 JavaScript 保留字;以保留字命名的方法將自動被排除。大多數 JavaScript 的保留字同時也是 Java 的保留字,因此無論如何你也不能使用一個名為 “try()” 的方法。但是最常用的一個詞 “delete()”,在 JavaScript 中有特殊的含義而在 Java 中沒有。
    重載方法(Overloaded methods)將會在調用的時候陷入未知的狀況,因此應該避免重載方法。
    3. 訪問下面的地址
    http://localhost:8080/[YOUR-WEBAPP]/dwr/
    你應該會看到一個頁面,上面顯示了剛才你在第二步所創建的類。進入一個鏈接之后你會看到所有等待調用方法的列表。這些動態產生的例子你也能通過 DWR 來實現。
    親自嘗試和體會下吧。
    怎樣應用到你的 Web 程序中?
    在側邊欄有很多例子演示了怎樣改變網頁中的文本、更新列表、操作表單和動態修改表格。每一個例子都有詳細的說明。
    另外一個開始方法就是從頁面中查看源代碼,這些頁面你剛剛瀏覽過:
    進入 http://localhost:8080/[YOUR-WEBAPP]/dwr/ 然后點擊你創建的類;
    查看源代碼然后定位到你所感興趣的方法的代碼行;
    將這些文本粘貼到你 Web 程序的一個 HTML 或 JSP頁面中;
    包含下面的 javascrip 文件:
    <script src=’/[YOUR-WEBAPP]/dwr/interface/[YOUR-SCRIPT].js’></script>
    <script src=’/[YOUR-WEBAPP]/dwr/engine.js’></script>
    你可以根據實際情況修改 /[YOUR-WEBAPP]/ 部分。
    關于怎樣書寫 DWR 控制的 Javascript 代碼請查看 腳本簡介。

    官方網站:http://getahead.org/dwr

    posted @ 2008-09-17 12:45 小馬歌 閱讀(205) | 評論 (0)編輯 收藏
     

     [摘抄自:http://blog.soufun.com/12766773/2394732/articledetail.htm]
        奧運已經正離我們遠去倫敦的路上,潮水終于退去,使我們有機會看到真正裸泳的人。

    好不容易熬到“金九銀十”,在美國政府出手收購“兩房”之際,一篇洋洋灑灑的《萬科松山湖會議發言紀要》在國內網上瘋傳,市場儼然有著“山雨欲來風滿樓”的烏云遮蓋,令期待年底回暖與圖謀“抄底”的人再次覺得前景渺茫。

     一地雞毛

    越來越多的人已經感覺到冬天的降臨。有人指出:房價的下跌根本原因不是政府調控,也不是剛需減少,而是房子失去了投資價值。當盛宴變成“剩宴”的時候,只能是盤傾碗覆,一片狼藉。

    而深圳樓市的居住價值越來越多的人捫心自問:這是我們生活中必須要為之付出一輩子辛勞的安樂窩嗎?

    從誰都知道房子要漲價,炒房客蜂擁而入,開發商惜售捂盤,雇人排隊,分期開發,瘋狂拿地,可憐的剛需人群,在這股洪流的脅裹之下,不得不忐忑不安又興奮而激動的成為房奴,為自己家的房子升值而高興,但卻又感覺好像和自己沒什么關系。

    觀望、拋售情緒濃厚,不是沒錢買,怕買樓被套、怕受傷,這乃當今深圳樓市一大景象。

    準備過冬

    學者認為:在三十年的中國變革歷程中,宏觀調控(在1992年之前稱為治理整頓)是一個定期出現的名詞。自1978年開始改革以來,1981年就發生了經濟動蕩和政策緊縮,其后,每隔四到五年就會呈現類似的“過冬景象”,這些年份分別是:1984年、1989年、1993年、1998年、2004——其間,惟一的一次輸入式行業危機是2000年的互聯網泡沫破滅,不過,它對整體宏觀經濟的影響不大——按此規律,2008年的“冬天”似乎是如期而止。對這一周期規律的警覺與漠視,是企業成敗的關鍵所在。
         所有的宏觀調控都是因為經濟的超速成長所導致的。在一個狂熱成長的年份之后,接踵而至的就是一個驟然降溫的嚴酷冬天,緊縮政策的出臺往往是緊剎車式的,其間幾乎沒有任何過渡。這使得那些激進發展的企業因為缺乏風險防范而導致窒息式的崩塌。在這次宏觀調控中,陷入困境的主要是兩類企業:一類是在前兩年投入大量資金用于技術改造和規模擴張,一類是貿然進入了房地產等“暴利行業”,冬天驟至,頓時爆發資金危機。

     市場不必跟著萬科走

    昨天與一家老牌資質開發商老總餐聚,席間他對當前樓市感嘆許多。“在這輪調整中,深圳下跌最早,跌得最深,必然也在未來起來最早。”但現在二線城市的調整浪也剛剛展開,站起來的時間可能要大大推遲。

    “部分媒體惟恐天下不亂,開發商與媒體不是水火不相容的關系,開發商倒了,對媒體行業也沒有好處。報道出發點能否客觀些,樓市興衰媒體也有一定責任。前段時間傳出部分開發商密謀開會團結一致放出風聲:如果媒體不調整”唱空“基調”的話,開發商也將被迫聯合起來自衛。” 《萬科松山湖會議發言紀要》的降價預言使萬科十分尷尬,又使部分媒體“空軍”力量注入新鮮血液。

    現在看來,所謂《萬科松山湖會議發言紀要》真假難辯,萬科樓盤除了只會降價之外難道就毫無其他妙方了嗎?

    “今年以來,萬科對這波樓市調整的品牌影響力甚大,但萬科在全國的市場占有率才不過5%,在許多城市拿到的都是邊緣化的地塊,主流城區的定價權并不在萬科手里,在深圳、上海、廣州、北京、天津均是如此,為什么萬科一降價全國就跟“瘋”?這與中國房地產行業發展的不平衡不無關系。”

    在東莞,萬科進入這座城市才不過四年,但是東莞地產的主流定價權已經被萬科牢牢掌握。接二連三的降價潮已經將這座城市的投資客與自住客推向了風口浪尖,本土開發商很受傷。但諸如光大、新世紀、富盈等掌握本土優質地塊的開發商對萬科這個“外來和尚”是又恨又無奈。

    “萬科在東莞并沒有降價清理門戶的資格。相對于本土巨頭而言,萬科的拿地成本比幾乎是零地價成本的本土企業毫無優勢,就算降價也是本土企業先降。所以萬科降價出貨難免過于主觀臆斷,并有可能誤傷到自己。”一位東莞本土地產商告訴筆者。拿松山湖為例,光大錦繡山河項目幾千畝開發面積都沒有急于出貨,面對對手萬科的頻頻發難,光大戲言“所開發項目根本不在一個水平上,不與之玩了”,并稱旗下樓盤退出3月以來在東莞興起的價格戰游戲。

    當股市、樓市失去投資價值的時候,當市場剩下剛性需求的時候,可憐的剛需有能支撐多久呢?當去年在淘金樓市中冒起來的成千上萬的百萬富翁、千萬富翁有的已經成為“負翁”時,這場“千金散去”的數字游戲勝過哈佛教科書將令那些沒有經歷過90年代泡沫地產的人們記憶猶新。現在看來,推倒重來也許是最好的“救市”方法。

    “活著真好。”這位開發商老總慶幸自己樓盤去年沒有全國圈地,他認為深圳的開發商應珍惜活著的機會,開發出好產品獻給這座充滿活力的城市。

     “冬天過去,必有春天,經過冬天的人會更成熟起來,潮來潮去,天下沒有不散的宴席,塞翁失馬,焉知禍福?宴席散去,后會有期,祈禱深圳樓市一路走好。

    posted @ 2008-09-17 09:54 小馬歌 閱讀(151) | 評論 (0)編輯 收藏
     

    最初的xml解析器是sun的Crimson和IBM的Xerces,這兩個開源項目都捐給了apache組織,后來Xerces發展很快,Crimon基本沒有人使用。
    1.4 版本起,用于 XML 處理的 Java API 就已經加入了Java 2 平臺中。 利用該 API,可通過一系列標準的 Java 平臺 API 來處理 XML 文檔。
     因此,也就無需另外添加 XML 處理包了。sun的JDK1.4使用Crimson,IBM的JDK使用Xerces。
    如果打算把sun 的jdk程序移植到IBM的JDK下,注意解析器不同,XML處理會出問題。這就說明了java不是“一次編譯,到處運行”,而是“一次編譯,到處調試”。
    如果你把IBM的JDK移植到SUN的JDK下,即使把Xerces包引入CLASSPATH,JDK還是使用Crimson,不信你運行java -verbose試一試。
    解決的辦法就是在在JRE\lib\目錄下,建立一個jaxp.properties的文件,
    內容如下:
        javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
        javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl
    就可以使用Xerces。
    或者使用命令行
    # Add the XML parser jars and set the JAXP factory names
    # Crimson parser JAXP setup(default)
    CLASSPATH=$CLASSPATH:../lib/crimson.jar
    JAXP=-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.crimson.jaxp.DocumentBuilderFactoryImpl
    JAXP="$JAXP -Djavax.xml.parsers.SAXParserFactory=org.apache.crimson.jaxp.SAXParserFactoryImpl"

    # Add the XML parser jars and set the JAXP factory names
    # Xerces parser JAXP setup
    CLASSPATH=$CLASSPATH:../lib/xerces.jar
    JAXP=-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
    JAXP="$JAXP -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl"
    最終sun還是指定JAXP規范,JSR 206 Java API for XML Processing(JAXP) 1.3,他已經由JDK1.5實現。
    JAXP實現了XPath,但是xalan的org.apache.xpath.XPathAPI 類已經移植到了 JRE 1.5 中,重構為com.sun.org.apache.xpath.internal.XPathAPI。 
    如果在以前的JDK中,使用含 XPathAPI 類的 jar,例如 xalan-2.4.1.jar。 將該 jar 加入到 CLASSPATH(類路徑)。

    W3C的DOM標準API非常難用,于是有人開發 Java專用的XML API,這就是jdom=java+DOM。其中一部分人,去開發dom4j,這個不是非常標準,但是速度很快。
    使用JDOM隱含服務器風險,因為JBoss和Webphere都是基于JDOM開發的,在這兩個服務器下使用JDOM,必須進行相應的設置,而且你的JDOM版本必須與服務器使用的相近,
    因為JVM只加載一份相同的類,服務器優先加載自己使用的JDOM,你開發用的JDOM不會被加載,你的應用就會出錯。
    使用Dom4J隱含工程問題,主要是hibernate,如果你開發的項目和hibernate合并,Dom4J版本不兼容的話,尋找dom4j相同版本hibernate,或者你改程序適應hibernate的Dom4j。
    java沒有windows的DLL地獄,但是java的jar地獄有過而無不及啊。

    posted @ 2008-09-12 11:06 小馬歌 閱讀(476) | 評論 (0)編輯 收藏
     

    sun和ibm都有一套xml的實現,sun的實現是打到jdk里面了。
    但當加載的時候,如果ibm的實現jar包xercesImpl.jar的接口 xml-apis.jar [j2ee1.4 library 有]文件導入到classpath 里了的話:
    1 如果xml-apis.jar先于 jre加載,那么 將采用 xercesImpl.jar的實現;
    2 如果jre先加載,那么將用 sun的xml實現,而取這個實現的類又分別按順序從4個位置取.

    • 使用 javax.xml.parsers.DocumentBuilderFactory 系統屬性。
    • 使用 JRE 文件夾中的屬性文件 "lib/jaxp.properties"。此配置文件格式為標準的 java.util.Properties 且包含實現類的完全限定名,其中實現類的鍵是上述定義的系統屬性。 JAXP 實現只讀取一次 jaxp.properties 文件,然后緩存其值供以后使用。如果首次嘗試讀取文件時,文件不存在,則不會再次嘗試檢查該文件是否存在。首次讀取 jaxp.properties 后,其中的屬性值不能再更改。
    • 如果可以,使用 Services API(在 JAR 規范中進行了詳細描述)來確定類名稱。Services API 將查找在運行時可用的 jar 中 META-INF/services/javax.xml.parsers.DocumentBuilderFactory 文件中的類名。
    • 平臺默認的 DocumentBuilderFactory 實例。

    這些過程,自己可以通過加vm參數 "-verbose"的方式進行跟蹤

    posted @ 2008-09-12 10:40 小馬歌 閱讀(2184) | 評論 (0)編輯 收藏
     

    最近部署一個JAVA程序到Linux中的crontab,遇到了亂碼。因為以前一直都用英文信息,所以一直沒遇到這個問題。原來還是環境變量的問題,因為在crontab系統里不會攜帶用戶的環境參數。因此,需要額外添加。不過有點奇怪的是其中一些變量,不需要顯式export出來就可以了,比如PATH,JAVA_HOME之類的,而LANG參數則需要顯式export才可以,否則,就是好多問號,亂碼....


    crontab所引用的sync.cron
    #!/bin/bash
    CPATH=
    WEBLIB="/usr/local/apache-tomcat-5.5.20/webapps/banner/WEB-INF/lib"
    WEBCLASSPATH="/usr/local/apache-tomcat-5.5.20/webapps/banner/WEB-INF/classes"
    for i in "$WEBLIB"/*.jar;do
       CPATH="$CPATH":"$i"
    done
    CPATH="$WEBCLASSPATH":"$CPATH"

    export LANG="zh_CN.GB18030"
    /usr/local/jdk1.5.0/bin/java -cp $CPATH com.sandai.project.service.MailService


    執行java程序的java命令,也要全路徑,否則也找不到該命令。
    posted @ 2008-09-12 09:51 小馬歌 閱讀(517) | 評論 (0)編輯 收藏
     
    試用rtx2007:
    1,rtx目前只支持windows平臺;
    2,二次開發支持很多語言,通過rtx server SDK實現,跨平臺發提醒通過http cgi服務實現;
    3,rtx client 支持web方式實現在線感知以及發起交談,發送文件等操作。

    /Files/xiaomage234/rtx-WEB-tool.rar

    /Files/xiaomage234/rtx_sdk_help.rar
    posted @ 2008-09-10 15:56 小馬歌 閱讀(666) | 評論 (0)編輯 收藏
     

    系統收到郵件都會保存在“/var/spool/mail/[linux用戶名]”文件中。
    在linux中輸入mail,就進行了收件箱,并顯示二十封郵件列表。

    此時命令提示符為"&"
    unread 標記為未讀郵件
    h|headers 顯示當前的郵件列表
    l|list 顯示當前支持的命令列表
    ?|help 顯示多個查看郵件列表的命令參數用法
    d 刪除當前郵件,指針并下移。 d 1-100 刪除第1到100封郵件
    f|from 只顯示當前郵件的簡易信息。 f num 顯示某一個郵件的簡易信息
    f|from num 指針移動到某一封郵件
    z 顯示剛進行收件箱時的后面二十封郵件列表
    more|p|page 閱讀當前指針所在的郵件內容 閱讀時,按空格鍵就是翻頁,按回車鍵就是下移一行
    t|type|more|p|page num 閱讀某一封郵件
    n|next|{什么都不填} 閱讀當前指針所在的下一封郵件內容
         閱讀時,按空格鍵就是翻頁,按回車鍵就是下移一行
    v|visual 當前郵件進入純文本編輯模式
    n|next|{什么都不填} num 閱讀某一封郵件
    top 顯示當前指針所在的郵件的郵件頭
    file|folder 顯示系統郵件所在的文件,以及郵件總數等信息
    x 退出mail命令平臺,并不保存之前的操作,比如刪除郵件
    q 退出mail命令平臺,保存之前的操作,比如刪除已用d刪除的郵件,已閱讀郵件會轉存到當前用戶家目錄下的mbox文件中。如果在mbox中刪除文件才會徹底刪除。
    在linux文本命令平臺輸入 mail -f mbox,就可以看到當前目錄下的mbox中的郵件了。
    cd 改變當前所在文件夾的位置
    寫信時,連按兩次Ctrl+C鍵則中斷工作,不送此信件。
    讀信時,按一次Ctrl+C,退出閱讀狀態。
    --------------------------------------
    Linux郵件命令用法

    1. 將文件當做電子郵件的內容送出
    語法:mail -s “主題”用戶名@地址< 文件
    例如:
    mail -s “program” user < file.c 將file.c

    當做mail的內容,送至user,主題為program。

    2. 傳送電子郵件給本系統用戶
    語法:mail 用戶名

    3. 傳送電子郵件至外地用戶
    語法: mail 用戶名@接受地址
    .../usr/lib/sendmail -bp
    ......“Mail queue is empty” ......mail ....

    例如:

    test@hotmail.com
    Subject : mail test
    :
    鍵入信文內容
    : :
    按下Ctrl+D 鍵或. 鍵結束正文。
    連按兩次Ctrl+C鍵則中斷工作,不送此信件。
    Cc( Carbon copy) : 復制一份正文,給其他的收信人。

    4. 檢查所傳送的電子郵件是否送出,或滯留在郵件服務器中
    語法:/usr/lib/sendmail -bp
    若屏幕顯示為“Mail queue is empty” 的信息,表示mail 已送出。
    若為其他錯誤信息,表示電子郵件因故尚未送出。

    posted @ 2008-09-03 13:09 小馬歌 閱讀(699) | 評論 (0)編輯 收藏
     
    【Lighttpd 安裝配置】

    首先需要安裝:
    libpcre
    libz

    官方網址:http://www.lighttpd.net
    # cd /usr/local/src
    # wget http://www.lighttpd.net/download/lighttpd-1.4.18.tar.gz
    # tar -zxvf lighttpd-1.4.18.tar.gz
    # cd lighttpd-1.4.18

    # ./configure --prefix=/usr/local/lighttpd
    # make
    # make install

    # cd /usr/local/lighttpd
    # mkdir conf
    # cp /usr/local/src/lighttpd-1.4.18/doc/lighttpd.conf /usr/local/lighttpd/conf/
    # vi /usr/local/lighttpd/conf/lighttpd.conf
    ===============================================
    server.modules = (
    "mod_rewrite",
    "mod_redirect",
    "mod_alias",
    "mod_access",
    # "mod_cml",
    # "mod_trigger_b4_dl",
    # "mod_auth",
    # "mod_status",
    # "mod_setenv",
    # "mod_fastcgi",
    # "mod_proxy",
    "mod_simple_vhost",
    # "mod_evhost",
    # "mod_userdir",
    # "mod_cgi",
    "mod_compress",
    "mod_ssi",
    # "mod_usertrack",
    "mod_expire",
    # "mod_secdownload",
    # "mod_rrdtool",
    "mod_accesslog" )

    mimetype.assign = (
    ...
    ".rm" => "audio/x-pn-realaudio",
    ...
    ".smi" => "application/smil",
    ".smil" => "application/smil",
    ...
    )

    ssi.extension = ( ".shtml" )


    accesslog.filename = "/dev/null"
    accesslog.format = "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

    $HTTP["host"] == "home.cn.real.com" {
    accesslog.filename = "/real/WebSite/logs/backup/access_log.home"
    }


    $HTTP["url"] =~ "\.js|\.css|\.jpg|\.gif|\.swf|\/artistinfo\/|\/status\/|\.png|\.ico|\/player\/|\/radio\/sid\/" {
    accesslog.filename = "/dev/null"
    }

    dir-listing.activate = "disable"

    server.document-root = "/real/WebSite/htdocs/home.cn.real.com/"
    server.errorlog = "/usr/local/lighttpd/log/error.log"
    index-file.names = ( "index.html", "index.htm")
    server.pid-file = "/usr/local/lighttpd/log/lighttpd.pid"

    simple-vhost.server-root = "/real/WebSite/htdocs/"
    simple-vhost.default-host = "home.cn.real.com"
    simple-vhost.document-root = "/"

    compress.cache-dir = "/real/WebSite/cache/compress/"
    compress.filetype = ("text/plain", "text/html")



    #Performance
    server.max-keep-alive-requests = 2000
    server.max-keep-alive-idle = 10
    server.max-read-idle = 60
    server.max-write-idle = 360
    server.event-handler = "poll"
    server.max-fds = 2048



    ===============================================

    # cp /usr/local/src/lighttpd-1.4.18/doc/rc.lighttpd.redhat /usr/local/lighttpd/bin/lighttpd.sh
    # vi /usr/local/lighttpd/bin/lighttpd.sh
    ===============================================

    LIGHTTPD_CONF_PATH="/usr/local/lighttpd/conf/lighttpd.conf"

    lighttpd="/usr/local/lighttpd/sbin/lighttpd"

    ===============================================



    啟動lighttpd 服務器
    # /usr/local/lighttpd/bin/lighttpd.sh start
    (或者使用 # /usr/local/lighttpd/sbin/lighttpd -f /usr/local/lighttpd/conf/lighttpd.conf )




    Installing services ?
    Lighttpd is meant to run a in background as daemon. You can either use the well known init-scripts or supervise to control it.

    init scripts ?
    The init-script that is shipped with the source-tarball is meant to be run on a LSB conforming platform like SuSE, Fedora or Debian.

    $ sed -e 's/FOO/lighttpd/g' doc/rc.lighttpd > /etc/init.d/lighttpd
    $ chmod a+rx /etc/init.d/lighttpd
    $ cp -p doc/sysconfig.lighttpd /etc/sysconfig/lighttpd
    $ install -Dp ./doc/lighttpd.conf /etc/lighttpd/lighttpd.conf
    $ chkconfig lighttpd on
    If you're running CentOS (or RHEL) you might need to change the first line to this

    $ sed -e 's/FOO/lighttpd/g' doc/rc.lighttpd.redhat > /etc/init.d/lighttpd
    In Debian\Ubuntu you use update-rc.d rather than chkconfig:

    $ sudo update-rc.d lighttpd defaults




    【安裝php (fast-cgi)】
    安裝 mysql
    安裝 libxml2-2.6.30.tar.gz

    ./configure \
    --prefix=/usr/local/php5-fcgi \
    --with-config-file-path=/etc \
    --with-mysql=/usr/local/mysql \
    --with-gd \
    --with-jpeg-dir \
    --with-zlib-dir \
    --with-png-dir \
    --with-freetype-dir \
    --with-curl \
    --with-libxml-dir=/usr/local \
    --enable-fastcgi \
    --enable-force-cgi-redirect \
    --enable-soap \
    --enable-sockets \
    --enable-ftp \
    --disable-debug

    # vi /etc/php.ini
    ===============================================
    cgi.fix_pathinfo=1
    ===============================================

    spawn-php.sh 是把 PHP with FastCGI 的環境變量初始化 (還不清楚如何使用,先不啟動spawn-php.sh)
    # cp /usr/local/src/lighttpd-1.4.18/doc/spawn-php.sh /usr/local/lighttpd/bin/

    # vi /usr/local/lighttpd/bin/spawn-php.sh

    ===============================================

    SPAWNFCGI="/usr/local/lighttpd/bin/spawn-fcgi"

    FCGIPROGRAM="/usr/local/php5-fcgi/bin/php"

    USERID=root

    GROUPID=root

    ===============================================

    # /usr/local/lighttpd/bin/spawn-php.sh


    ===============================================
    防盜鏈接配置
    ===============================================

    server.modules = (
    ...
    "mod_secdownload",
    "mod_flv_streaming",
    ...
    )

    flv-streaming.extensions = (".flv")
    secdownload.secret = "2008"
    secdownload.document-root = "/real/WebSite/videos/flv/"
    secdownload.uri-prefix = "/dl/"
    secdownload.timeout = 120


    <?php
    $secret = "2008";
    $uri_prefix = "/dl/";

    # filename
    $f = "/test.flv";

    # current timestamp
    $t = time();
    $t_hex = sprintf("%08x", $t);

    $m = md5($secret.$f.$t_hex);

    printf('<a href="%s%s/%s%s">%s</a>',
    $uri_prefix, $m, $t_hex, $f, $f);
    ?>
    posted @ 2008-08-29 16:16 小馬歌 閱讀(513) | 評論 (2)編輯 收藏
     

    使用 Nginx 提升網站訪問速度2008-08-26 11:27     主要介紹如何在 Linux 系統上安裝高性能的 HTTP 服務器 —— Nginx、并在不改變原有網站結構的條件下用 Nginx 來提升網站的訪問速度。

    Nginx 簡介

    Nginx("engine x") 是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。 Nginx是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的,它已經在該站點運行超過兩年半了。 Igor 將源代碼以類BSD 許可證的形式發布。盡管還是測試版,但是,Nginx 已經因為它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名了。

    根據最新一期(08 年 6 月份)的 NetCraft 調查報告顯示,已經有超過兩百萬的主機使用了 Nginx,這個數字超過了另外一個輕量級的 HTTP 服務器 lighttpd, 排名第四,并且發展迅速。下面是這份報告的前幾名的報表:

    以下為引用的內容:
    產品          網站數                    
    Apache 84,309,103
    IIS 60,987,087
    Google GFE 10,465,178
    Unknown 4,903,174
    nginx 2,125,160
    Oversee 1,953,848
    lighttpd 1,532,952 


               
    關于這期調查報告的更詳細信息請看下面鏈接:

    http://survey.netcraft.com/Reports/200806/           
                              

    使用 Nginx 前必須了解的事項
               
    目前官方 Nginx 并不支持 Windows,您只能在包括 Linux、UNIX、BSD 系統下安裝和使用;
    Nginx 本身只是一個 HTTP 和反向代理服務器,它無法像 Apache 一樣通過安裝各種模塊來支持不同的頁面腳本,例如 PHP、CGI 等;
    Nginx 支持簡單的負載均衡和容錯;
    支持作為基本 HTTP 服務器的功能,例如日志、壓縮、Byte ranges、Chunked responses、SSL、虛擬主機等等,應有盡有。
                在 Linux 下安裝 Nginx
                為了確保能在 Nginx 中使用正則表達式進行更靈活的配置,安裝之前需要確定系統是否安裝有 PCRE(Perl Compatible Regular Expressions)包。您可以到 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下載最新的 PCRE 源碼包,使用下面命令下載編譯和安裝 PCRE 包

    # wget ftp://ftp.csx.cam.ac.uk/pub/soft ... cre/pcre-7.7.tar.gz
    # tar zxvf pcre-7.7.tar.gz
    # cd pcre-7.7
    # ./configure
    # make
    # make install
                           

                接下來安裝 Nginx,Nginx 一般有兩個版本,分別是穩定版和開發版,您可以根據您的目的來選擇這兩個版本的其中一個,下面是把 Nginx 安裝到 /opt/nginx 目錄下的詳細步驟:
              

    # wget http://sysoev.ru/nginx/nginx-0.6.31.tar.gz
    # tar zxvf nginx-0.6.31.tar.gz


    # cd nginx-0.6.31
    # ./configure --with-http_stub_status_module –prefix=/opt/nginx
    # make
    # make install
                           

                其中參數 --with-http_stub_status_module 是為了啟用 nginx 的 NginxStatus 功能,用來監控 Nginx 的當前狀態。
                安裝成功后 /opt/nginx 目錄下有四個子目錄分別是:conf、html、logs、sbin 。其中 Nginx 的配置文件存放于conf/nginx.conf,Nginx 只有一個程序文件位于 sbin 目錄下的 nginx 文件。確保系統的 80端口沒被其他程序占用,運行 sbin/nginx 命令來啟動 Nginx,打開瀏覽器訪問此機器的 IP,如果瀏覽器出現 Welcome tonginx! 則表示 Nginx 已經安裝并運行成功。
                常用的 Nginx 參數和控制
                程序運行參數
                Nginx 安裝后只有一個程序文件,本身并不提供各種管理程序,它是使用參數和系統信號機制對 Nginx 進程本身進行控制的。 Nginx 的參數包括有如下幾個:
                                -c <path_to_config>:使用指定的配置文件而不是 conf 目錄下的 nginx.conf 。
                                -t:測試配置文件是否正確,在運行時需要重新加載配置的時候,此命令非常重要,用來檢測所修改的配置文件是否有語法錯誤。
                                -v:顯示 nginx 版本號。

    -V:顯示 nginx 的版本號以及編譯環境信息以及編譯時的參數。

    例如我們要測試某個配置文件是否書寫正確,我們可以使用以下命令

    sbin/nginx – t – c conf/nginx2.conf

    通過信號對 Nginx 進行控制

    Nginx 支持下表中的信號:

    信號名                                             作用描述                   

    TERM, INT 快速關閉程序,中止當前正在處理的請求

    QUIT 處理完當前請求后,關閉程序

    HUP 重新加載配置,并開啟新的工作進程,關閉就的進程,此操作不會中斷請求

    USR1 重新打開日志文件,用于切換日志,例如每天生成一個新的日志文件

    USR2 平滑升級可執行程序

    WINCH 從容關閉工作進程

    有兩種方式來通過這些信號去控制 Nginx,第一是通過 logs 目錄下的 nginx.pid 查看當前運行的 Nginx 的進程 ID,通過 kill – XXX <pid> 來控制 Nginx,其中 XXX 就是上表中列出的信號名。如果您的系統中只有一個 Nginx 進程,那您也可以通過 killall 命令來完成,例如運行 killall – s HUP nginx 來讓 Nginx 重新加載配置。

    配置 Nginx

    先來看一個實際的配置文件:

    以下為引用的內容:
                user nobody;# 工作進程的屬主
    worker_processes 4;# 工作進程數,一般與 CPU 核數等同
    #error_log logs/error.log;
    #error_log logs/error.log notice;
    #error_log logs/error.log info;

    #pid        logs/nginx.pid;

    events {
        use epoll;#Linux 下性能最好的 event 模式
        worker_connections 2048;# 每個工作進程允許最大的同時連接數
    }

    http {
        include       mime.types;
        default_type application/octet-stream;

        #log_format main '$remote_addr - $remote_user [$time_local] $request '
        #                  '"$status" $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';

        #access_log off;
        access_log logs/access.log;# 日志文件名

        sendfile        on;
        #tcp_nopush     on;
        tcp_nodelay     on;

        keepalive_timeout 65;

        include          gzip.conf;
       
        # 集群中的所有后臺服務器的配置信息
        upstream tomcats {
             server 192.168.0.11:8080 weight=10;
             server 192.168.0.11:8081 weight=10;
             server 192.168.0.12:8080 weight=10;
             server 192.168.0.12:8081 weight=10;
             server 192.168.0.13:8080 weight=10;
             server 192.168.0.13:8081 weight=10;
        }

        server {
            listen       80;#HTTP 的端口
            server_name localhost;

            charset utf-8;

            #access_log logs/host.access.log main;

             location ~ ^/NginxStatus/ {
                stub_status on; #Nginx 狀態監控配置
                access_log off;
             }

             location ~ ^/(WEB-INF)/ {
                deny all;
             }
          

             location ~ \.(htm|html|asp|php|gif|jpg|jpeg|png|bmp|ico|rar|css|js|
             zip|java|jar|txt|flv|swf|mid|doc|ppt|xls|pdf|txt|mp3|wma)$ {
                 root /opt/webapp;
                expires 24h;
            }

            location / {
                proxy_pass http://tomcats;# 反向代理
                include proxy.conf;
            }

            error_page 404 /html/404.html;

            # redirect server error pages to the static page /50x.html
            #
             error_page 502 503 /html/502.html;
            error_page 500 504 /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
     


    Nginx 監控

    上面是一個實際網站的配置實例,其中灰色文字為配置說明。上述配置中,首先我們定義了一個 location ~^/NginxStatus/,這樣通過 http://localhost/NginxStatus/ 就可以監控到 Nginx的運行信息,顯示的內容如下:

    以下為引用的內容:
    Active connections: 70
    server accepts handled requests
    14553819 14553819 19239266
    Reading: 0 Writing: 3 Waiting: 67 


    NginxStatus 顯示的內容意思如下:
               
    active connections – 當前 Nginx 正處理的活動連接數。

    erveraccepts handled requests -- 總共處理了 14553819 個連接 , 成功創建 14553819 次握手 (證明中間沒有失敗的 ), 總共處理了 19239266 個請求 ( 平均每次握手處理了 1.3 個數據請求 )。

    reading -- nginx 讀取到客戶端的 Header 信息數。

    writing -- nginx 返回給客戶端的 Header 信息數。

    waiting -- 開啟 keep-alive 的情況下,這個值等于 active - (reading + writing),意思就是 Nginx 已經處理完正在等候下一次請求指令的駐留連接。

    靜態文件處理

    通過正則表達式,我們可讓 Nginx 識別出各種靜態文件,例如 images 路徑下的所有請求可以寫為:

    以下為引用的內容:
                location ~ ^/images/ {
        root /opt/webapp/images;
    }
                            
                而下面的配置則定義了幾種文件類型的請求處理方式。
                location ~ \.(htm|html|gif|jpg|jpeg|png|bmp|ico|css|js|txt)$ {
        root /opt/webapp;
        expires 24h;
    }
     


    對于例如圖片、靜態 HTML 文件、js 腳本文件和 css 樣式文件等,我們希望 Nginx 直接處理并返回給瀏覽器,這樣可以大大的加快網頁瀏覽時的速度。因此對于這類文件我們需要通過 root 指令來指定文件的存放路徑,同時因為這類文件并不常修改,通過 expires 指令來控制其在瀏覽器的緩存,以減少不必要的請求。 expires 指令可以控制 HTTP 應答中的“ Expires ”和“ Cache-Control ”的頭標(起到控制頁面緩存的作用)。您可以使用例如以下的格式來書寫 Expires:

    以下為引用的內容:
    expires 1 January, 1970, 00:00:01 GMT;
    expires 60s;
    expires 30m;
    expires 24h;
    expires 1d;
    expires max;
    expires off;


    動態頁面請求處理

    Nginx本身并不支持現在流行的 JSP、ASP、PHP、PERL 等動態頁面,但是它可以通過反向代理將請求發送到后端的服務器,例如Tomcat、Apache、IIS 等來完成動態頁面的請求處理。前面的配置示例中,我們首先定義了由 Nginx直接處理的一些靜態文件請求后,其他所有的請求通過 proxy_pass 指令傳送給后端的服務器(在上述例子中是 Tomcat)。最簡單的 proxy_pass 用法如下:

    以下為引用的內容:
                location / {
        proxy_pass        http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
    }


    這里我們沒有使用到集群,而是將請求直接送到運行在 8080 端口的 Tomcat 服務上來完成類似 JSP 和 Servlet 的請求處理。

    當頁面的訪問量非常大的時候,往往需要多個應用服務器來共同承擔動態頁面的執行操作,這時我們就需要使用集群的架構。 Nginx 通過 upstream 指令來定義一個服務器的集群,最前面那個完整的例子中我們定義了一個名為 tomcats 的集群,這個集群中包括了三臺服務器共 6 個 Tomcat 服務。而 proxy_pass 指令的寫法變成了:

    以下為引用的內容:
                location / {
        proxy_pass        http://tomcats;
        proxy_set_header X-Real-IP $remote_addr;
    }


    在 Nginx 的集群配置中,Nginx 使用最簡單的平均分配規則給集群中的每個節點分配請求。一旦某個節點失效時,或者重新起效時,Nginx 都會非常及時的處理狀態的變化,以保證不會影響到用戶的訪問。

    總結

    盡管整個程序包只有五百多 K,但麻雀雖小、五臟俱全。 Nginx官方提供的各種功能模塊應有盡有,結合這些模塊可以完整各種各樣的配置要求,例如:壓縮、防盜鏈、集群、FastCGI、流媒體服務器、Memcached 支持、URL 重寫等等,更關鍵的是 Nginx 擁有 Apache 和其他 HTTP服務器無法比擬的高性能。您甚至可以在不改變原有網站的架構上,通過在前端引入 Nginx 來提升網站的訪問速度。
     

    posted @ 2008-08-29 15:01 小馬歌 閱讀(182) | 評論 (0)編輯 收藏
     
    cacheModel的屬性值等于指定的 cacheModel 元素的 name 屬性值。屬性 cacheModel 定義查詢 mapped statement 的緩存。每一個查詢 mapped statement 可以使用不同或相同的cacheModel,以下給出個例子。

    <cacheModel id="product-cache" imlementation="LRU"(或 type ="LRU") [readOnly=“true” serialize=“false”]> // [ ] 表示可選
        <flushInterval hours="24"/>
        <flushOnExecute statement="insertProduct"/>
        <flushOnExecute statement="updateProduct"/>
        <flushOnExecute statement="deleteProduct"/>
    <property name="size" value="1000" />
    </cacheModel>

    <statement id="getPoductList" parameerClass="int" cacheModel="product-cache">
        select * from PRODUCT where PRD_CAT_ID = #value#
    </statement>

    // 使用“近期最少使用”(LRU)實現
    // 上面例子中,“getProductList”的緩存每 24 小時刷新一次,或當更新的操作發生時刷新。一個 cacheModel 只能有一個 flushInteval 元素,它可以使用 hours,minutes,seconds或 milliseconds 來設定。某些 cache model 的實現可能需要另外的屬性,如上面的“cache-size”屬性。在 LRU cache model 中,cache-size指定了緩存儲存的項數


    緩存類型
    Cache Model 使用插件方式來支持不同的緩存算法。它的實現在cacheModel 的用 type 屬性來指定(如上所示)。指定的實現類必須實現 CacheController接口,或是下面 4個別名中的其中之一。Cache Model 實現的其他配置參數通過 cacheModel的 property元素來設置。目前包括以下的 4 個實現:

    "MEMORY" (com.ibatis.db.sqlmap.cache.memory.MemoryCacheController)
    MEMORY cache 實現使用 reference 類型來管理 cache 的行為。垃圾收集器可以根據 reference類型判斷是否要回收 cache 中的數據。MEMORY實現適用于沒有統一的對象重用模式的應用,或內存不足的應用。

    MEMORY實現可以這樣配置:

    <cacheModel id="product-cache" type="MEMORY">
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertProduct"/>
    <flushOnExecute statement="updateProduct"/>
    <flushOnExecute statement="deleteProduct"/>
    <property name="reference-type" value="WEAK"/>
    </cacheModel>

    // MEMORY cache 實現只認識一個<property>元素。這個名為“reference-type”屬性的值必須是 STRONG,SOFT 和 WEAK 三者其一。這三個值分別對應于 JVM 不同的內存 reference類型。

    "LRU" (com.ibatis.db.sqlmapache.lru.LruCacheController)
    LRU Cache 實現用“近期最少使用”原則來確定如何從 Cache 中清除對象。當 Cache 溢出時,最近最少使用的對象將被從 Cache 中清除。使用這種方法,如果一個特定的對象總是被使用,它將保留在 Cache 中,而且被清除的可能性最小。對于在較長的期間內,某些用戶經常使用某些特定對象的情況(例如,在 PaginatedList 和常用的查詢關鍵字結果集中翻
    頁),LRU Cache 是一個不錯的選擇。

    LRU Cache實現可以這樣配置:

    <cacheModel id="product-cache" type="LRU">
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertProduct"/>
    <flushOnExecute statement="updateProduct"/>
    <flushOnExecute statement="deleteProduct"/>
    <property name="size" value="1000"/>
    </cacheModel>

    // LRU Cache實現只認可一個 property元素。其名為“cache-size”的屬性值必須是整數,代表同時保存在 Cache中對象的最大數目。值得注意的是,這里指的對象可以是任意的,從單一的 String 對象到 Java Bean 的 ArrayList 對象都可以。因此,不要 Cache太多的對象,以免內存不足。


    "FIFO" (com.ibatis.db.sqlmap.cache.fifo.FifoCacheController)
    FIFO Cache 實現用“先進先出”原則來確定如何從 Cache 中清除對象。當 Cache 溢出時,最先進入 Cache 的對象將從 Cache 中清除。對于短時間內持續引用特定的查詢而后很可能不再使用的情況,FIFO Cache 是很好的選擇。

    FIFO Cache可以這樣配置:

    <cacheModel id="product-cache" type="FIFO">
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertProduct"/>
    <flushOnExecute statement="updateProduct"/>
    <flushOnExecute statement="deleteProduct"/>
    <property name="size" value="1000"/>
    </cacheModel>

    // property 的 size 同LRU

    "OSCACHE" (com.ibatis.db.sqlmap.cache.oscache.OSCacheController)
    OSCACHE Cache 實現是OSCache2.0緩存引擎的一個 Plugin。它具有高度的可配置性,
    分布式,高度的靈活性。

    OSCACHE 實現可以這樣配置:
    <cacheModel id="product-cache" type="OSCACHE">
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertProduct"/>
    <flushOnExecute statement="updateProduct"/>
    <flushOnExecute statement="deleteProduct"/>
    </cacheModel>

    // OSCACHE 實現不使用 property 元素,而是在類路徑的根路徑中使用標準的oscache.properties 文件進行配置。在 oscache.properties文件中,您可以配置 Cache 的算法(和上面討論的算法很類似),Cache 的大小,持久化方法(內存,文件等)和集群方法。
    要獲得更詳細的信息,請參考 OSCache 文檔。OSCache 及其文檔可以從 OpenSymphony
    網站上獲取:
    http://www.opensymphony.com/oscache/
    posted @ 2008-08-29 12:09 小馬歌 閱讀(923) | 評論 (0)編輯 收藏
    僅列出標題
    共95頁: First 上一頁 81 82 83 84 85 86 87 88 89 下一頁 Last 
     
    主站蜘蛛池模板: 午夜国产大片免费观看| 成人浮力影院免费看| 亚洲国产成人五月综合网 | 亚洲av片不卡无码久久| 最近中文字幕免费mv在线视频| 久久亚洲精品无码| 无码人妻一区二区三区免费看| 久久精品国产亚洲av麻豆| 在线看无码的免费网站| 亚洲一区二区三区不卡在线播放| 4虎永免费最新永久免费地址| 国产v亚洲v天堂a无| 日本免费一区二区三区最新| WWW国产亚洲精品久久麻豆| 亚洲国产成人五月综合网| 久久99毛片免费观看不卡| 亚洲综合综合在线| 成人免费无码大片a毛片| 黄色网页免费观看| 亚洲精品午夜国产VA久久成人 | 欧美a级成人网站免费| 亚洲AV香蕉一区区二区三区| 亚洲爽爽一区二区三区| 99久热只有精品视频免费观看17| 亚洲成人高清在线观看| 国产成人免费全部网站| a级毛片免费全部播放| 亚洲国产精品成人久久久| 国产精品va无码免费麻豆| 国产精品一区二区三区免费| 久久久婷婷五月亚洲97号色| 在线播放高清国语自产拍免费| 五月天国产成人AV免费观看| 久久精品国产亚洲AV大全| 国产午夜无码视频免费网站| 精品在线免费观看| 国产亚洲精品AAAA片APP| 久久精品国产亚洲av四虎| 午夜无遮挡羞羞漫画免费| 成av免费大片黄在线观看| 久久亚洲国产成人影院|