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

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

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

    vickzhu

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      151 隨筆 :: 0 文章 :: 34 評(píng)論 :: 0 Trackbacks

    2008年12月11日 #

    ##通用查詢?nèi)罩荆河涗浗⒌目蛻舳诉B接和執(zhí)行的語(yǔ)句
    ##慢查詢?nèi)罩荆河涗浰袌?zhí)行時(shí)間超過(guò)long_query_time值的所有查詢或者不使用索引的查詢
    ##查看數(shù)據(jù)庫(kù)版本
    SHOW VARIABLES LIKE '%version%';
    ##查看通用查詢?nèi)罩?/div>
    SHOW VARIABLES LIKE '%general%';
    ##設(shè)置通用查詢?nèi)罩緸殚_(kāi)啟
    SET GLOBAL general_log=ON;
    ##設(shè)置通用查詢?nèi)罩緸殛P(guān)閉
    SET GLOBAL general_log=OFF;
    ##查看當(dāng)前慢查詢?nèi)罩据敵龅母袷剑梢允荈ILE(存儲(chǔ)在數(shù)數(shù)據(jù)庫(kù)的數(shù)據(jù)文件中的hostname.log),也可以是TABLE(存儲(chǔ)在數(shù)據(jù)庫(kù)中的mysql.general_log)
    SHOW VARIABLES LIKE '%log_output%';
    ##設(shè)置查詢?nèi)罩据敵龅轿募?/div>
    SET GLOBAL log_output='file';
    ##設(shè)置慢查詢?nèi)罩颈4娴奈募?/div>
    SET GLOBAL slow_query_log_file="/var/lib/mysql/localhost-slow.log";
    ##查看慢查詢相關(guān)設(shè)置
    SHOW VARIABLES LIKE '%slow_query%';
    ##設(shè)置慢查詢閾值為1,默認(rèn)為10
    SET GLOBAL long_query_time=1;
    ##設(shè)置慢查詢閾值為10,默認(rèn)為10
    SET GLOBAL long_query_time=10;
    ##查看慢查詢的閾值
    SHOW GLOBAL VARIABLES LIKE '%long_query_time%';
    ##查看有多少慢查詢
    SHOW GLOBAL STATUS LIKE '%Slow_queries%';
    ##睡眠11秒,測(cè)試慢查詢
    ##select SLEEP(11);
    posted @ 2018-10-09 16:59 筱 筱 閱讀(180) | 評(píng)論 (0)編輯 收藏

    velocity properties加載時(shí)是放在HashMap中的,首先會(huì)加載configLocation中指定文件的內(nèi)容,然后加載VelocityConfigurer中通過(guò)velocityProperties配置的屬性,
    因此,在VelocityConfigurer中配置的屬性會(huì)覆蓋configLocation指定文件中的屬性
    posted @ 2014-08-22 11:03 筱 筱 閱讀(5891) | 評(píng)論 (0)編輯 收藏

    1、達(dá)到默認(rèn)最大buffer size
    2、調(diào)用HttpServletResponse.flushBuffer()
    3、調(diào)用HttpServletResponse.getOutputStream().flush()或者HttpServletResponse.getWriter().flush()
    4、調(diào)用HttpServletResponse.sendError()或者HttpServletResponse.sendRedirect()
    posted @ 2014-07-23 13:11 筱 筱 閱讀(5901) | 評(píng)論 (0)編輯 收藏

    <plugins>
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>1.7</source>
              <target>1.7</target>
              <encoding>UTF-8</encoding>
              <compilerArguments>
                <extdirs>WebContent/WEB-INF/lib</extdirs>
              </compilerArguments>
              </configuration>
            </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
              <webXml>WebContent/WEB-INF/web.xml</webXml>
              <warSourceDirectory>WebContent</warSourceDirectory>
            </configuration>
          </plugin>
        </plugins>
    posted @ 2013-11-01 17:03 筱 筱 閱讀(6452) | 評(píng)論 (1)編輯 收藏

    在onPrepareDialog()中添加如下代碼:
    AlertDialog syncDialog = (AlertDialog) dialog;
    Button button = syncDialog.getButton(AlertDialog.BUTTON_POSITIVE);
    button.setText("確定");
    button.setVisibility(View.VISIBLE);
    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });
    posted @ 2013-03-01 12:51 筱 筱 閱讀(7033) | 評(píng)論 (0)編輯 收藏

    uml
    1. 類圖之間的關(guān)系
    2. 依賴和關(guān)聯(lián)關(guān)系:
      依賴:是類與類之間的連接,表示一個(gè)類依賴于另一個(gè)類的定義。例如如果A依賴于B,則B體現(xiàn)為局部變量,方法的參數(shù)、或靜態(tài)方法的調(diào)用。 
      關(guān)聯(lián):類與類之間的聯(lián)接,它使一個(gè)類知道另一個(gè)類的屬性和方法, 具體表現(xiàn)為類的成員變量中包含某個(gè)對(duì)象 

      組合和聚合:
      在有整體和部分關(guān)系是才有組合和聚合的概念,屬于關(guān)聯(lián)關(guān)系
      組合:部分離開(kāi)整體不能存在
      聚合:部分可以離開(kāi)整體而存在

    3. 用例圖之間的關(guān)系:
    4. 包含、泛化、擴(kuò)展
      包含:當(dāng)兩個(gè)或多個(gè)用例中共用一組相同的動(dòng)作,這時(shí)可以將這組相同的動(dòng)作抽出來(lái)作為一個(gè)獨(dú)立的子用例,供多個(gè)基用例所共享。因?yàn)樽佑美怀槌觯美⒎且粋€(gè)完整的用例,所以include關(guān)系中的基用例必須和子用例一起使用才夠完整,子用例也必然被執(zhí)行 
      泛化:繼承關(guān)系,子用例將繼承基用例的所有行為 ,也就是說(shuō)在任何使用基用例的地方都可以用子用例來(lái)代替。領(lǐng)導(dǎo)擁有審批的權(quán)限,而請(qǐng)假申請(qǐng)審批、加班申請(qǐng)審批都是審批的子類
      擴(kuò)展:對(duì)基用例的擴(kuò)展,基用例是一個(gè)完整的用例,即使沒(méi)有子用例的參與,也可以完成一個(gè)完整的功能。 

    posted @ 2012-06-29 11:42 筱 筱 閱讀(5765) | 評(píng)論 (0)編輯 收藏

    學(xué)習(xí)osworkflow
    http://my.so-net.net.tw/idealist/OSWorkflow/
     

    wfentry表中的state字段來(lái)自于接口WorkflowEntry,有如下幾個(gè)值:
        public static final int CREATED = 0;
        public static final int ACTIVATED = 1;
        public static final int SUSPENDED = 2;
        public static final int KILLED = 3;
        public static final int COMPLETED = 4;
        public static final int UNKNOWN = -1;


    Workflow接口相當(dāng)于我們service層的接口,而WorkflowStore接口相當(dāng)于我們DAO層的接口,
    我們知道osworkflow提供的Workflow實(shí)現(xiàn)(如:BasicWorkflow)有時(shí)并不能滿足業(yè)務(wù)的需要,因此我們可以實(shí)現(xiàn)自己的Workflow,具體可以參照BasicWorkflow 
    繼承AbstractWorkflow,接著加入自己想要的方法。同理,我們可以通過(guò)繼承相應(yīng)的WorkflowStore(如:HibernateWorkflowStore)來(lái)編寫自己的方法
    posted @ 2012-06-26 14:49 筱 筱 閱讀(5727) | 評(píng)論 (0)編輯 收藏

    1、日期格式化:
        DateFormat
        SimplateDateFormat

    2、數(shù)字格式化
        NumberFormat
        DecimalFormat

    3、字符串格式化:
        MessageFormat 以{0},{1}作為占位符,如果你的pattern中有兩個(gè)以上的{0},在format時(shí)都會(huì)用第一個(gè)參數(shù)替換
        String.format 以%s作為占位符,按傳入的參數(shù)一一匹配
        
    posted @ 2011-09-01 17:39 筱 筱 閱讀(3140) | 評(píng)論 (0)編輯 收藏

    文字:openfire
    語(yǔ)音/視頻:FMS,red5
    posted @ 2011-08-29 13:58 筱 筱 閱讀(2754) | 評(píng)論 (1)編輯 收藏

    在使用svn add 時(shí)提示:
    A  (bin)  templates/translate/screen/selectTransLang.vm
    請(qǐng)看官方文檔的解釋:

    當(dāng)你第一次添加或者導(dǎo)入文件到Subversion中時(shí),Subversion會(huì)檢測(cè)該文件是否是二進(jìn)制文件。目前,Subversion的策略是只檢測(cè)文件的前1024個(gè)字節(jié);如果所有字節(jié)都是0,或者超過(guò)15%都是非ASCII碼輸出字符的話,那么Subversion就認(rèn)定該文件是二進(jìn)制文件。
    如果Subversion認(rèn)定文件是二進(jìn)制文件,那么這個(gè)文件就會(huì)自動(dòng)添加svn:mime-type屬性,并設(shè)置為“application/octet-stream”。(你隨時(shí)可以使用auto-props特性來(lái)重寫這樣的行為,或者使用svn propset手動(dòng)設(shè)置屬性。)
    Subversion對(duì)以下的文件做普通文本處理:
    1、沒(méi)有設(shè)置svn:mime-type屬性的文件
    2、文件的svn:mime-type屬性值以“text/”開(kāi)頭
    3、文件的svn:mime-type屬性值等于“image/x-xbitmap”
    4、文件的svn:mime-type屬性值等于“image/x-xpixmap”

    所有其他文件都將被視為二進(jìn)制文件處理,這意味著Subversion:
    1、不會(huì)嘗試在svn update或者svn merge操作時(shí)將遠(yuǎn)程修改合并到本地中
    2、在svn diff中不會(huì)顯示出不同
    3、在svn blame不會(huì)每行顯示版本和作者信息

    在其他方面,Subversion將二進(jìn)制文件和其他文本文件一樣對(duì)待
    需要注意,不管是不是二進(jìn)制文件,都不會(huì)影響版本庫(kù)中用來(lái)存儲(chǔ)文件變更的空間大小,也不會(huì)影響客戶端和服務(wù)端之間的通訊量。出于存儲(chǔ)和傳輸考慮,Subversion使用的是對(duì)二進(jìn)制文件和普通文本文件一致處理的diffing方法;這和‘svn diff’使用的diffing方法完全不相關(guān)。

    好了,我們來(lái)看看剛才加的文件是否為二進(jìn)制:
    進(jìn)入.svn/props 發(fā)現(xiàn)生成文件:selectTransLang.vm.svn-work
    內(nèi)容如下:
    K 13
    svn:mime-type
    V 24
    application/octet-stream
    END
    或者用如下方法
    svn propget svn:mime-type selectTransLang.vm
    輸出:application/octet-stream

    解決方法,直接編輯去掉這個(gè)屬性
    svn propedit svn:mime-type selectTransLang.vm
    或者刪除.svn/props/selectTransLang.vm.svn-work

    看看網(wǎng)上其他牛人的解決方法:
    修改~/.subversion/config
    找到最后一個(gè)section,在最后加上如下一行話:
    *.txt = svn:mime-type=text/plain;svn:eol-style=native
    光這個(gè)還不夠,向上搜索到這么一行
    # enable-auto-props = yes
    把前面用來(lái)注釋這行的那個(gè)#和其后的空格去掉

    如果用的是TortoiseSVN,開(kāi)始菜單 -> TortoiseSVN -> Settings -> General,此時(shí)右側(cè)有一個(gè)名為Edit的按鈕,點(diǎn)擊之后就可以編輯config了

    posted @ 2011-08-04 21:51 筱 筱 閱讀(4030) | 評(píng)論 (0)編輯 收藏

    gson:java對(duì)象和json之間相互轉(zhuǎn)換
    xsteam:java對(duì)象和xml之間相互轉(zhuǎn)換
    posted @ 2011-07-15 16:55 筱 筱 閱讀(2326) | 評(píng)論 (0)編輯 收藏

    在頁(yè)面中顯示某字段時(shí),字段值過(guò)長(zhǎng)會(huì)導(dǎo)致頁(yè)面樣式錯(cuò)亂,這時(shí)候我們需要對(duì)值進(jìn)行截取,當(dāng)截取值時(shí)會(huì)碰到以下問(wèn)題:
    1、如果按字符截取會(huì)導(dǎo)致中英文顯示的長(zhǎng)度不一
    2、如果按字節(jié)截取可能會(huì)導(dǎo)致最后一個(gè)中文截成兩部分
    以下代碼是在網(wǎng)上獲取并經(jīng)過(guò)改造而成,能夠很好的解決上面兩個(gè)問(wèn)題
        /**
         * 根據(jù)指定字節(jié)數(shù)截取字符串,當(dāng)指定處為中文第一個(gè)字節(jié)時(shí)少截取一個(gè)字符,當(dāng)長(zhǎng)度大于指定截取長(zhǎng)度時(shí),截取后在字符串末尾追加指定字符串<br/>
         * 這里添加了字符串的編碼,因?yàn)轫?yè)面的編碼不同,字符串所占字節(jié)也不同
         *
         * @param str 待截取字符串,如果為null或者"",則立即返回str
         * @param length 需要截取的長(zhǎng)度
         * @param endStr 截取后末尾追加的字符串
         * @param charset 待截取字符串的編碼
         * @return
         */
        public String subStringByByte(String str, int length, String endStr, String charset) {
            if (str == null || "".equals(str.trim()) || length <= 0) {
                return str;
            }
            try {
                int strlen = str.getBytes(charset).length;// 這里要和頁(yè)面的編碼相關(guān)
                if (strlen < length) return str;
                Pattern p = Pattern.compile("^[""u4e00-""u9fa5]$");
                int i = 0, j = 0;
                int sublength = length - ((endStr == null) ? 0 : endStr.getBytes(charset).length);
                for (char c : str.toCharArray()) {
                    Matcher m = p.matcher(String.valueOf(c));
                    i += m.find() ? 2 : 1;
                    ++j;
                    if (i == sublength) break;
                    if (i > sublength) {
                        --j;
                        break;
                    }
                }
                return str.substring(0, j) + endStr;
            } catch (UnsupportedEncodingException e) {
                return str;
            }
        }
    posted @ 2010-12-14 10:49 筱 筱 閱讀(350) | 評(píng)論 (0)編輯 收藏

    英文不太好,經(jīng)常忘記,所以現(xiàn)在寫下來(lái):
    1,transient:在序列化一個(gè)類時(shí),如果類中某個(gè)字段不想被序列化,則使用此關(guān)鍵字
    2、volatile:用于線程同步時(shí)

    posted @ 2010-12-13 20:49 筱 筱 閱讀(241) | 評(píng)論 (0)編輯 收藏

    根據(jù)分代收集器原理(可以參考垃圾回收機(jī)制分類),JVM的內(nèi)存可分為三個(gè)域: 新域、舊域以及永久域
    JVM生成的所有新對(duì)象放在新域中。一旦對(duì)象經(jīng)歷了一定數(shù)量的垃圾收集循環(huán)后,便進(jìn)入舊域。而在永久域中是用來(lái)存儲(chǔ)JVM自己的反射對(duì)象的,如class 和method對(duì)象,而且GC(Garbage Collection)不會(huì)在主程序運(yùn)行期對(duì)永久域進(jìn)行清理。其中新域和舊域?qū)儆诙?,永久域是一個(gè)獨(dú)立域并且不認(rèn)為是堆的一部分
    一、java.lang.OutOfMemoryError: PermGen space

    PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,
    這塊內(nèi)存主要是被 JVM存放Class和Method信息的,Class在被Loader時(shí)就會(huì)被放到PermGen space中,
    它和存放類實(shí)例 (Instance)的Heap區(qū)域不同,GC(Garbage Collection)不會(huì)在主程序運(yùn)行期對(duì)
    PermGen space進(jìn)行清理,所以如果你的應(yīng)用中有很多CLASS的話,就很可能出現(xiàn)PermGen space錯(cuò)誤,
    這種錯(cuò)誤常見(jiàn)在web服務(wù)器對(duì) JSP進(jìn)行pre compile(預(yù)編譯)的時(shí)候。如果你的WEB APP下都用了大量的第三方j(luò)ar, 其大小
    超過(guò)了jvm默認(rèn)的大小(4M)那么就會(huì) 產(chǎn)生此錯(cuò)誤信息了。
    解決方法: 手動(dòng)設(shè)置MaxPermSize大小

    修改TOMCAT_HOME/bin/catalina.sh
    在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
    JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
    建議:將相同的第三方j(luò)ar文件移置到tomcat/shared/lib目錄下,這樣可以達(dá)到減少 jar 文檔重復(fù)占用內(nèi)存的目的。

    二、java.lang.OutOfMemoryError: Java heap space
    Heap size 設(shè)置
    JVM堆 的設(shè)置是指java程序運(yùn)行過(guò)程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè)置.JVM在啟動(dòng)的時(shí)候會(huì)自動(dòng)設(shè)置Heap size的值,
    其初始空間(即 -Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4??梢岳肑VM提供的-Xmn -Xms -Xmx等選項(xiàng)可
    進(jìn)行設(shè) 置。Heap size 的大小是Young Generation 和Tenured Generaion 之和(新域和舊域之和)。
    提示:在JVM中如果98% 的時(shí)間是用于GC且可用的Heap size 不足2%的時(shí)候?qū)伋龃水惓P畔ⅰ?br /> 提示:Heap Size 最大不要超過(guò)可用物理內(nèi)存的80%,一般的要將-Xms和-Xmx選項(xiàng)設(shè)置為相同,而-Xmn為1/4的-Xmx值。
    解決方法:手動(dòng)設(shè)置 Heap size
    修改TOMCAT_HOME/bin/catalina.sh
    在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
    JAVA_OPTS="-server -Xms800m -Xmx800m   -XX:MaxNewSize=256m"


    posted @ 2010-08-19 20:39 筱 筱 閱讀(242) | 評(píng)論 (0)編輯 收藏

    動(dòng)態(tài)應(yīng)用,是相對(duì)于網(wǎng)站靜態(tài)內(nèi)容而言, 是指以c/c++、php、Java、perl、.net等 服務(wù)器端語(yǔ)言開(kāi)發(fā)的網(wǎng)絡(luò)應(yīng)用軟件,比如論壇、網(wǎng)絡(luò)相冊(cè)、交友、BLOG等常見(jiàn)應(yīng)用。動(dòng)態(tài)應(yīng)用系統(tǒng)通 常與數(shù)據(jù)庫(kù)系統(tǒng)、緩存系統(tǒng)、分布式存儲(chǔ)系統(tǒng)等密不可分。

    大型動(dòng)態(tài)應(yīng)用系統(tǒng)平臺(tái)主要是針對(duì)于大流 量、高并發(fā)網(wǎng)站建立的底層系統(tǒng)架構(gòu)。大型網(wǎng)站的運(yùn)行需要一個(gè)可靠、安全、可擴(kuò)展、易維護(hù)的應(yīng)用系統(tǒng)平臺(tái)做為支撐,以保證網(wǎng)站應(yīng)用的平穩(wěn)運(yùn)行。

    大型動(dòng)態(tài)應(yīng)用系統(tǒng)又可分為幾個(gè)子系統(tǒng):

    l         Web前端系統(tǒng)

    l         負(fù)載均衡系統(tǒng)

    l         數(shù)據(jù)庫(kù)集群系統(tǒng)

    l         緩存系統(tǒng)

    l         分布式存儲(chǔ)系統(tǒng)

    l         分布式服務(wù)器管理系統(tǒng)

    l         代碼分發(fā)系統(tǒng)

    Web前端系統(tǒng)

    結(jié)構(gòu)圖:

    為了達(dá)到不同應(yīng)用的服務(wù)器共享、避免單點(diǎn)故障、集中管理、統(tǒng)一配置等目的,不以應(yīng)用劃分服 務(wù)器,而是將所有服務(wù)器做統(tǒng)一使用,每臺(tái)服務(wù)器都可以對(duì)多個(gè)應(yīng)用提供服務(wù),當(dāng)某些應(yīng)用訪問(wèn)量升高時(shí),通過(guò)增加服務(wù)器節(jié)點(diǎn)達(dá)到整個(gè)服務(wù)器集群的性能提高,同 時(shí)使他應(yīng)用也會(huì)受益。該Web前端系統(tǒng)基于Apache/Lighttpd/Eginx等 的虛擬主機(jī)平臺(tái),提供PHP程序運(yùn)行環(huán)境。服務(wù)器對(duì)開(kāi)發(fā)人員是透明的,不需要開(kāi)發(fā)人員介入服務(wù)器管理

    負(fù)載均衡系統(tǒng)


    負(fù)載均衡系統(tǒng)分為硬件和軟件兩種。硬件負(fù)載均衡效率高,但是價(jià)格貴,比如F5等。軟件負(fù)載均衡系統(tǒng)價(jià)格較低或者免費(fèi),效率較硬件負(fù)載均衡系統(tǒng) 低,不過(guò)對(duì)于流量一般或稍大些網(wǎng)站來(lái)講也足夠使用,比如lvs,nginx。大多數(shù)網(wǎng)站都是硬件、軟件負(fù)載均衡系統(tǒng)并用。

    數(shù)據(jù)庫(kù)集群系統(tǒng)

    結(jié)構(gòu)圖:


    由于Web前端采用了負(fù)載均衡集群結(jié)構(gòu)提高了服務(wù)的有效性和擴(kuò)展性,因此數(shù)據(jù)庫(kù)必須也是高可靠的才能保證整個(gè)服務(wù)體系的高可靠性,如何構(gòu)建一個(gè)高可靠的、可以提供大規(guī)模并發(fā)處理的數(shù)據(jù)庫(kù)體系?

    我們可以采用如上圖所示的方案:

    1)        使用 MySQL 數(shù)據(jù)庫(kù),考慮到Web應(yīng)用的數(shù)據(jù)庫(kù)讀多寫少的特點(diǎn),我們主要對(duì)讀數(shù)據(jù)庫(kù)做了優(yōu)化,提供專用的讀數(shù)據(jù)庫(kù)和寫數(shù)據(jù)庫(kù),在應(yīng)用程序中實(shí)現(xiàn)讀操作和寫操作分別訪問(wèn)不同的數(shù)據(jù)庫(kù)。

    2)        使用 MySQL Replication 機(jī)制實(shí)現(xiàn)快速將主庫(kù)(寫庫(kù))的數(shù)據(jù)庫(kù)復(fù)制到從庫(kù)(讀庫(kù))。一個(gè)主庫(kù)對(duì)應(yīng)多個(gè)從庫(kù),主庫(kù)數(shù)據(jù)實(shí)時(shí)同步到從庫(kù)。

    3)        寫數(shù)據(jù)庫(kù)有多臺(tái),每臺(tái)都可以提供多個(gè)應(yīng)用共同使用,這樣可以解決寫庫(kù)的性能瓶頸問(wèn)題和單點(diǎn)故障問(wèn)題。

    4)        讀數(shù)據(jù)庫(kù)有多臺(tái),通過(guò)負(fù)載均衡設(shè)備實(shí)現(xiàn)負(fù)載均衡,從而達(dá)到讀數(shù)據(jù)庫(kù)的高性能、高可靠和高可擴(kuò)展性。

    5)        數(shù)據(jù)庫(kù)服務(wù)器和應(yīng)用服務(wù)器分離。

    6)        從數(shù)據(jù)庫(kù)使用BigIP做負(fù)載均衡。

    緩存系統(tǒng)


    緩存分為文件緩存、內(nèi)存緩存、數(shù)據(jù)庫(kù)緩存。在大型Web應(yīng)用中使用最多且效率最高的是內(nèi)存緩存。最常用的內(nèi)存緩存工具是Memcachd。使用正確的緩存系統(tǒng)可以達(dá)到實(shí)現(xiàn)以下目標(biāo):

    1、   使用緩存系統(tǒng)可以提高訪問(wèn)效率,提高服務(wù)器吞吐能力,改善用戶體驗(yàn)。

    2、   減輕對(duì)數(shù)據(jù)庫(kù)及存儲(chǔ)集服務(wù)器的訪問(wèn)壓力

    3、Memcached服務(wù)器有多臺(tái),避免單點(diǎn)故障,提供高可靠性和可擴(kuò)展性,提高性能。

    分布式存儲(chǔ)系統(tǒng)

    結(jié)構(gòu)圖:


    WEB系統(tǒng)平臺(tái)中的存儲(chǔ)需求有下面兩個(gè)特點(diǎn):

    1) 存儲(chǔ)量很大,經(jīng)常會(huì)達(dá)到單臺(tái)服務(wù)器無(wú)法提供的規(guī)模,比如相冊(cè)、視頻等應(yīng)用。因此需要專業(yè)的大規(guī)模存儲(chǔ)系統(tǒng)。

    2) 負(fù)載均衡cluster中的每個(gè)節(jié)點(diǎn)都有可能訪問(wèn)任何一個(gè)數(shù)據(jù)對(duì)象,每個(gè)節(jié)點(diǎn)對(duì)數(shù)據(jù)的處理也能被其他節(jié)點(diǎn)共享,因此這些節(jié)點(diǎn)要操作的數(shù)據(jù)從邏輯上看只能是一個(gè)整體,不是各自獨(dú)立的數(shù)據(jù)資源。

    因此高性能的分布式存儲(chǔ)系統(tǒng)對(duì)于大型網(wǎng)站應(yīng)用來(lái)說(shuō)是非常重要的一環(huán)。(這個(gè)地方需要加入對(duì)某個(gè)分布式存儲(chǔ)系統(tǒng)的簡(jiǎn)單介紹。)

    分布式服務(wù)器管理系統(tǒng)

    結(jié)構(gòu)圖:


    隨著網(wǎng)站訪問(wèn)流量的不斷增加,大多的網(wǎng)絡(luò)服務(wù)都是以負(fù)載均衡集群的方式對(duì)外提供服務(wù),隨之集群規(guī)模的擴(kuò)大,原來(lái)基于單機(jī)的服務(wù)器管理模式已經(jīng)不能夠滿足我們的需求,新的需求必須能夠集中式的、分組的、批量的、自動(dòng)化的對(duì)服務(wù)器進(jìn)行管理,能夠批量化的執(zhí)行計(jì)劃任務(wù)。

    在分布式服務(wù)器管理系統(tǒng)軟件中有一些比較優(yōu)秀的軟件,其中比較理想的一個(gè)是 Cfengine。它可以對(duì)服務(wù)器進(jìn)行分組,不同的分組可以分別定制系統(tǒng)配置文件、計(jì)劃任務(wù)等配置。它是基于C/S 結(jié)構(gòu)的,所有的服務(wù)器配置和管理腳本程序都保存在Cfengine Server上,而被管理的服務(wù)器運(yùn)行著 Cfengine Client 程序,Cfengine Client通過(guò)SSL加密的連接定期的向服務(wù)器端發(fā)送請(qǐng)求以獲取最新的配置文件和管理命令、腳本程序、補(bǔ)丁安裝等任務(wù)。

    有了Cfengine 這種集中式的服務(wù)器管理工具,我們就可以高效的實(shí)現(xiàn)大規(guī)模的服務(wù)器集群管理,被管理服務(wù)器和 Cfengine Server 可以分布在任何位置,只要網(wǎng)絡(luò)可以連通就能實(shí)現(xiàn)快速自動(dòng)化的管理。

    代碼發(fā)布系統(tǒng)

    結(jié)構(gòu)圖:

    隨著網(wǎng)站訪問(wèn)流量的不斷增加,大多的網(wǎng)絡(luò)服務(wù)都是以負(fù)載均衡集群的方式對(duì)外提供服務(wù),隨之集群規(guī)模的擴(kuò)大,為了滿足集群環(huán)境下程序代碼的批量分發(fā)和更新,我們還需要一個(gè)程序代碼發(fā)布系統(tǒng)。

    這個(gè)發(fā)布系統(tǒng)可以幫我們實(shí)現(xiàn)下面的目標(biāo):

    1) 生產(chǎn)環(huán)境的服務(wù)器以虛擬主機(jī)方式提供服務(wù),不需要開(kāi)發(fā)人員介入維護(hù)和直接操作,提供發(fā)布系統(tǒng)可以實(shí)現(xiàn)不需要登陸服務(wù)器就能把程序分發(fā)到目標(biāo)服務(wù)器。

    2) 我們要實(shí)現(xiàn)內(nèi)部開(kāi)發(fā)、內(nèi)部測(cè)試、生產(chǎn)環(huán)境測(cè)試、生產(chǎn)環(huán)境發(fā)布的4個(gè)開(kāi)發(fā)階段的管理,發(fā)布系統(tǒng)可以介入各個(gè)階段的代碼發(fā)布。

    3) 我們需要實(shí)現(xiàn)源代碼管理和版本控制,SVN可以實(shí)現(xiàn)該需求。

    這里面可以使用常用的工具Rsync,通過(guò)開(kāi)發(fā)相應(yīng)的腳本工具實(shí)現(xiàn)服務(wù)器集群間代碼同步分發(fā)。

    posted @ 2010-08-04 20:24 筱 筱 閱讀(201) | 評(píng)論 (0)編輯 收藏

    管道:"|"
        將一個(gè)命令的輸出作為下一個(gè)命令的輸入
        例:ls | grep text            --這個(gè)命令將查找當(dāng)前目錄下名稱中包含text的目錄或者文件
    xargs:
        將一個(gè)命令的輸入作為下一個(gè)命令的參數(shù)
        例:ls | xargs grep -i text        --這個(gè)命令將當(dāng)前目下的所有文件作為參數(shù)傳遞給grep來(lái)查找文件中是否包含"text" 
             find . | xargs grep "user"    --查詢當(dāng)前目錄及其子目錄下所有內(nèi)容中包含"user"的文件
    posted @ 2010-07-19 00:19 筱 筱 閱讀(376) | 評(píng)論 (0)編輯 收藏

    mysql:select * from 表名 order by rand() limit 10;
    sql server:select top 10 * from 表名 order by newid();
    oracle:select * from(select * from 表名 order by dbms_random.value) where rownum<=20;
    access:select top 10 * from 表名 order by rnd(ID)
    posted @ 2010-05-09 22:35 筱 筱 閱讀(698) | 評(píng)論 (0)編輯 收藏

    樣式代碼如下:
    html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); }
    需要最新網(wǎng)頁(yè)標(biāo)準(zhǔn)支持:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    Flash要在object標(biāo)簽中加入如下代碼:
    <param value="false" name="menu"/>
    <param value="opaque" name="wmode"/>
    posted @ 2010-04-21 12:19 筱 筱 閱讀(234) | 評(píng)論 (0)編輯 收藏

    1、下載wamp5,安裝wamp5,如需更改端口請(qǐng)修改Apache配置文件,更改端口(如:8888)后還需要更改wamp根目錄wampmanager.ini文件中的以下地方
        Type: item; Caption: "Localhost"; Action: run; FileName: "C:\WINDOWS\explorer.exe"; Parameters: "http://localhost:8888/"; Glyph: 5
        Type: item; Caption: "phpMyAdmin"; Action: run; FileName: "C:\WINDOWS\explorer.exe"; Parameters: "http://localhost:8888/phpmyadmin/"; Glyph: 5
        Type: item; Caption: "SQLiteManager"; Action: run; FileName: "C:\WINDOWS\explorer.exe"; Parameters: "http://localhost:8888/sqlitemanager/"; Glyph: 5
    2、安裝后訪問(wèn)首頁(yè)http://localhost:8888,點(diǎn)擊phpinfo()查看php信息,如果只顯示如下信息:
        This program makes use of the Zend Scripting Language Engine:
        Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
        查看php目錄下的php.ini文件,沒(méi)有[Zend]塊,表明ZendOptimizer沒(méi)有安裝
    3、下載ZendOptimizer,安裝路徑選擇D:\Program Files\Zend,選擇apache2.x及php.ini的位置,安裝完成后php.ini最后會(huì)添加以下內(nèi)容:
        [Zend]
        zend_extension_manager.optimizer_ts="D:\Program Files\Zend\ZendOptimizer-3.3.0\lib\Optimizer-3.3.0"
        zend_extension_ts="D:\Program Files\Zend\ZendOptimizer-3.3.0\lib\ZendExtensionManager.dll"
    4、訪問(wèn)http://loalhost:8888/ppframe進(jìn)行ppframe的安裝,安裝成功后登陸后臺(tái),如果沒(méi)有安裝ZendOptimizer,左側(cè)的exam是打不開(kāi)的,但是passport可以打開(kāi)。

    posted @ 2010-04-19 15:00 筱 筱 閱讀(483) | 評(píng)論 (0)編輯 收藏

    1、如果頁(yè)面有<base/>標(biāo)簽的則要在js引入后再添加<base target="_self" />;

    2、在<script/>中添加屬性defer="defer";

    posted @ 2010-03-31 17:28 筱 筱 閱讀(411) | 評(píng)論 (0)編輯 收藏

    比如java向txt文件中寫入新的一行時(shí),java獲得文本輸入框中的新行時(shí)等
    Unix系統(tǒng)里,每行結(jié)尾只有“<換行>”,即“\r”;
    Windows系統(tǒng)里面,每行結(jié)尾是“<換行><回車>”,即“\r\n”;
    Mac系統(tǒng)里,每行結(jié)尾是“<回車>”,即“\n”。
    一個(gè)直接后果是,Unix/Mac系統(tǒng)下的文件在Windows里打開(kāi)的話,所有文字會(huì)變成一行;
    而Windows里的文件在Unix/Mac下打開(kāi)的話,在每行的結(jié)尾可能會(huì)多出一個(gè)^M符號(hào)。

    posted @ 2010-03-31 13:37 筱 筱 閱讀(2371) | 評(píng)論 (2)編輯 收藏

    如果已經(jīng)配置mysql的環(huán)境變量,請(qǐng)直接執(zhí)行:mysql -u 輸入用戶名 -p 回車 之后輸入密碼
    如果未配置環(huán)境變量請(qǐng)先進(jìn)入mysql的bin目錄下
    執(zhí)行如下語(yǔ)句導(dǎo)入:source 輸入sql文件的位置
    執(zhí)行如下語(yǔ)句導(dǎo)出:mysqldump -u輸入用戶名 -p輸入密碼 數(shù)據(jù)庫(kù)名 表名 >文件名.sql

    posted @ 2010-01-19 11:26 筱 筱 閱讀(280) | 評(píng)論 (0)編輯 收藏

    服務(wù)端:http://labs.northscale.com/memcached-packages/
    客戶端:http://code.google.com/p/memcached/wiki/Clients/
    posted @ 2009-12-31 10:57 筱 筱 閱讀(428) | 評(píng)論 (1)編輯 收藏

    1、安裝jdk --> D:\Program Files\Java\jdk1.5.0
    2、配置JAVA_HOME --> D:\Program Files\Java\jdk1.5.0
    3、解壓tomcat5.5 --> D:\Program Files\Apache Software Foundation\Tomcat 5.5
    4、打開(kāi)cmd,進(jìn)入到tomcat5.5bin目錄 --> D:\Program Files\Apache Software Foundation\Tomcat 5.5\bin>
    5、執(zhí)行命令:service install tomcat
            執(zhí)行結(jié)果為:
                Installing the service 'tomcat' ...
                Using CATALINA_HOME:    D:\Program Files\Apache Software Foundation\Tomcat 5.5
                Using CATALINA_BASE:    D:\Program Files\Apache Software Foundation\Tomcat 5.5
                Using JAVA_HOME:        D:\Program Files\Java\jdk1.5.0
                Using JVM:              D:\Program Files\Java\jdk1.5.0\jre\bin\server\jvm.dll
                The service 'tomcat' has been installed.
            此時(shí)產(chǎn)生名為:Apache Tomcat tomcat 的服務(wù)
    6、卸載命令:service remove tomcat
            執(zhí)行結(jié)果為:
                The service 'tomcat' has been removed

    posted @ 2009-12-25 15:12 筱 筱 閱讀(669) | 評(píng)論 (0)編輯 收藏

    @echo off
    rem 這段代碼的作用是對(duì)mysql進(jìn)行查詢操作,并將查詢結(jié)果寫入到result.txt文件中
    echo %TIME%
    set errorlevel=0
    set path_bin_mysql="D:\Program Files\mysql_1\bin\mysql"
    set host=localhost
    set port=3308
    set database_mysql=mysql
    set user_mysql=root
    set password_mysql=admin
    %path_bin_mysql% -u%user_mysql% -p%password_mysql% -h%host% -P%port% %database_mysql%< test.sql >

    result.txt
    pause

    posted @ 2009-11-30 17:17 筱 筱 閱讀(357) | 評(píng)論 (0)編輯 收藏

    千萬(wàn)人同時(shí)訪問(wèn)的網(wǎng)站,一般是有很多個(gè)數(shù)據(jù)庫(kù)同時(shí)工作,說(shuō)明白一點(diǎn)就是數(shù)據(jù)庫(kù)集群和并發(fā)控制,這樣的網(wǎng)站實(shí)時(shí)性也是相對(duì)的。這些網(wǎng)站都有一些共同的特點(diǎn):數(shù)據(jù)量大,在線人數(shù)多,并發(fā)請(qǐng)求多,pageview高,響應(yīng)速度快??偨Y(jié)了一下各個(gè)大網(wǎng)站的架構(gòu),主要提高效率及穩(wěn)定性的幾個(gè)地方包括:

      1、程序

      程序開(kāi)發(fā)是一方面,系統(tǒng)架構(gòu)設(shè)計(jì)(硬件+網(wǎng)絡(luò)+軟件)是另一方面。

      軟件架構(gòu)方面,做網(wǎng)站首先需要很多web服務(wù)器存儲(chǔ)靜態(tài)資源,比如圖片、視頻、靜態(tài)頁(yè)等,千萬(wàn)不要把靜態(tài)資源和應(yīng)用服務(wù)器放在一起。

      一個(gè)好的程序員寫出來(lái)的程序會(huì)非常簡(jiǎn)潔、性能很好,一個(gè)初級(jí)程序員可能會(huì)犯很多低級(jí)錯(cuò)誤,這也是影響網(wǎng)站性能的原因之一。

      網(wǎng)站要做到效率高,不光是程序員的事情,數(shù)據(jù)庫(kù)優(yōu)化、程序優(yōu)化這是必須的,在性能優(yōu)化上要數(shù)據(jù)庫(kù)和程序齊頭并進(jìn)!緩存也是兩方面同時(shí)入手。第一,數(shù)據(jù)庫(kù)緩存和數(shù)據(jù)庫(kù)優(yōu)化,這個(gè)由dba完成(而且這個(gè)有非常大的潛力可挖,只是由于我們都是程序員而忽略了他而已)。第二,程序上的優(yōu)化,這個(gè)非常的有講究,比如說(shuō)重要一點(diǎn)就是要規(guī)范SQL語(yǔ)句,少用in 多用or,多用preparestatement,另外避免程序冗余如查找數(shù)據(jù)少用雙重循環(huán)等。另外選用優(yōu)秀的開(kāi)源框架加以支持,我個(gè)人認(rèn)為中后臺(tái)的支持是最最重要的,可以選取spring+ibatis。因?yàn)閕batis直接操作SQL并有緩存機(jī)制。spring的好處就不用我多說(shuō)了,IOC的機(jī)制可以避免new對(duì)象,這樣也節(jié)省開(kāi)銷。據(jù)我分析,絕大部分的開(kāi)銷就是在NEW的時(shí)候和連接數(shù)據(jù)庫(kù)時(shí)候產(chǎn)生的,請(qǐng)盡量避免。另外可以用一些內(nèi)存測(cè)試工具來(lái)做一個(gè)demo說(shuō)明hibernate和ibatis誰(shuí)更快!前臺(tái)你想用什么就用什么,struts,webwork都成,如果覺(jué)得自己挺牛X可以試試tapestry。

      用數(shù)據(jù)庫(kù)也未必不能解決訪問(wèn)量巨大所帶來(lái)的問(wèn)題,作成靜態(tài)文件硬盤的尋址時(shí)間也未必少于數(shù)據(jù)庫(kù)的搜索時(shí)間,當(dāng)然對(duì)資料的索引要下一翻工夫。我自己覺(jué)得門戶往往也就是當(dāng)天、熱門的資料點(diǎn)擊率較高,將其做緩存最多也不過(guò)1~2G的數(shù)據(jù)量吧,舉個(gè)例子:

    拿網(wǎng)易新聞來(lái)http://news.163.com/07/0606/09/3GA0D10N00011229.html

      格式化一下,方便理解:http://域名/年/月日/新聞所屬分類/新聞ID.html

      可以把當(dāng)天發(fā)布的、熱門的、流攬量大的作個(gè)緩寸,用hashtable(key:年-月-日-分類-ID,value:新聞對(duì)象),靜態(tài)將其放到內(nèi)存(速度絕對(duì)快過(guò)硬盤尋址靜態(tài)頁(yè)面)。

    通常是采用oracle存儲(chǔ)過(guò)程+2個(gè)weblogic,更新機(jī)制也幾乎一樣每簽發(fā)一條新聞,就會(huì)生成靜態(tài)頁(yè)面,然后發(fā)往前端的web服務(wù)器,前端的web都是做負(fù)載均衡的。另外還有定時(shí)的程序,每5-15分鐘自動(dòng)生成一次。在發(fā)布新聞的同時(shí)將數(shù)據(jù)緩存。當(dāng)然緩存也不會(huì)越來(lái)越大,在個(gè)特定的時(shí)間段(如凌晨)剔除過(guò)期的數(shù)據(jù)。做一個(gè)大的網(wǎng)站遠(yuǎn)沒(méi)有想象中那么簡(jiǎn)單,服務(wù)器基本就要百十個(gè)的。

      這樣可以大大增加一臺(tái)計(jì)算機(jī)的處理速度,如果一臺(tái)機(jī)器處理不了,可以用httpserver集群來(lái)解決問(wèn)題了。


      2、網(wǎng)絡(luò)
      中國(guó)的網(wǎng)絡(luò)分南北電信和網(wǎng)通,訪問(wèn)的ip就要區(qū)分南北進(jìn)入不同的網(wǎng)絡(luò)。


      3、集群
      通常會(huì)使用CDN與GSBL與DNS負(fù)載均衡技術(shù),每個(gè)地區(qū)一組前臺(tái)服務(wù)器群,例如:網(wǎng)易,百度使用了DNS負(fù)載均衡技術(shù),每個(gè)頻道一組前臺(tái)服務(wù)器,一搜使用了DNS負(fù)載技術(shù),所有頻道共用一組前臺(tái)服務(wù)器集群。

      網(wǎng)站使用基于Linux集群的負(fù)載均衡,失敗恢復(fù),包括應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器,基于linux-ha的服務(wù)狀態(tài)檢測(cè)及高可用化。

      應(yīng)用服務(wù)器集群可以采用apache+tomcat集群和weblogic集群等;web服務(wù)器集群可以用反向代理,也可以用NAT的方式,或者多域名解析都可以;Squid也可以,方法很多,可以根據(jù)情況選擇。

     4、數(shù)據(jù)庫(kù)

      因?yàn)槭乔f(wàn)人同時(shí)訪問(wèn)的網(wǎng)站,所以一般是有很多個(gè)數(shù)據(jù)庫(kù)同時(shí)工作的,說(shuō)明白一點(diǎn)就是數(shù)據(jù)庫(kù)集群和并發(fā)控制,數(shù)據(jù)分布到地理位置不同的數(shù)據(jù)中心,以免發(fā)生斷電事故。另外還有一點(diǎn)的是,那些網(wǎng)站的靜態(tài)化網(wǎng)頁(yè)并不是真的,而是通過(guò)動(dòng)態(tài)網(wǎng)頁(yè)與靜態(tài)網(wǎng)頁(yè)網(wǎng)址交換做出現(xiàn)的假象,這可以用urlrewrite 這樣的開(kāi)源網(wǎng)址映射器實(shí)現(xiàn)。這樣的網(wǎng)站實(shí)時(shí)性也是相對(duì)的,因?yàn)樵跀?shù)據(jù)庫(kù)復(fù)制數(shù)據(jù)的時(shí)候有一個(gè)過(guò)程,一般在技術(shù)上可以用到hibernate和 ecache,但是如果要使網(wǎng)站工作地更好,可以使用EJB和websphere,weblogic這樣大型的服務(wù)器來(lái)支持,并且要用oracle這樣的大型數(shù)據(jù)庫(kù)。

      大型門戶網(wǎng)站不建議使用Mysql數(shù)據(jù)庫(kù),除非你對(duì)Mysql數(shù)據(jù)的優(yōu)化非常熟悉。Mysql數(shù)據(jù)庫(kù)服務(wù)器的master-slave模式,利用數(shù)據(jù)庫(kù)服務(wù)器在主從服務(wù)器間進(jìn)行同步,應(yīng)用只把數(shù)據(jù)寫到主服務(wù)器,而讀數(shù)據(jù)時(shí)則根據(jù)負(fù)載選擇一臺(tái)從服務(wù)器或者主服務(wù)器來(lái)讀取,將數(shù)據(jù)按不同策略劃分到不同的服務(wù)器(組)上,分散數(shù)據(jù)庫(kù)壓力。

      大型網(wǎng)站要用oracle,數(shù)據(jù)方面操作盡量多用存儲(chǔ)過(guò)程,絕對(duì)提升性能;同時(shí)要讓DBA對(duì)數(shù)據(jù)庫(kù)進(jìn)行優(yōu)化,優(yōu)化后的數(shù)據(jù)庫(kù)與沒(méi)優(yōu)化的有天壤之別;同時(shí)還可以擴(kuò)展分布式數(shù)據(jù)庫(kù),以后這方面的研究會(huì)越來(lái)越多;


      5、頁(yè)面

      從開(kāi)始就考慮使用虛擬存儲(chǔ)/簇文件系統(tǒng)。它能讓你大量并行IO訪問(wèn),而且不需要任何重組就能夠增加所需要的磁盤。

      頁(yè)面數(shù)據(jù)調(diào)用更要認(rèn)真設(shè)計(jì),一些數(shù)據(jù)查詢可以不通過(guò)數(shù)據(jù)庫(kù)的方式,實(shí)時(shí)性要求不高的可以使用lucene來(lái)實(shí)現(xiàn),即使有實(shí)時(shí)性的要求也可以用lucene,lucene+compass還是非常優(yōu)秀的。

      新聞?lì)惖木W(wǎng)站可以用靜態(tài)頁(yè)存儲(chǔ),采用定時(shí)更新機(jī)制減輕服務(wù)器負(fù)擔(dān);首頁(yè)每個(gè)小模塊可以使用oscache緩存,這樣不用每次都拉數(shù)據(jù)。

      前端的基于靜態(tài)頁(yè)面緩存的web加速器,主要應(yīng)用有squid等。squid 將大部分靜態(tài)資源(圖片,js,css等)緩存起來(lái),直接返回給訪問(wèn)者,減少應(yīng)用服務(wù)器的負(fù)載網(wǎng)站的靜態(tài)化網(wǎng)頁(yè)并不是真的,而是通過(guò)動(dòng)態(tài)網(wǎng)頁(yè)與靜態(tài)網(wǎng)頁(yè)網(wǎng)址交換做出現(xiàn)的假象,這可以用urlrewrite這樣的開(kāi)源網(wǎng)址映射器實(shí)現(xiàn),后綴名為htm或者h(yuǎn)tml并不能說(shuō)明程序生成了靜態(tài)頁(yè)面,可能是通過(guò) url重寫來(lái)實(shí)現(xiàn)的,為的只不過(guò)是在搜索引擎中提升自己網(wǎng)站的覆蓋面積罷了。

      生成靜態(tài)頁(yè)面的服務(wù)器和www服務(wù)器是兩組不同的服務(wù)器,頁(yè)面生成后才會(huì)到www服務(wù)器,一部分?jǐn)?shù)據(jù)庫(kù)并不是關(guān)系數(shù)據(jù)庫(kù),這樣更適合信息衍生,www、mail服務(wù)器、路由器多,主要用負(fù)載平衡解決訪問(wèn)瓶頸。

      靜態(tài)頁(yè)面的缺點(diǎn):

      1) 增加了程序的復(fù)雜度

      2) 不利于管理資料

      3) 速度不是最快

      4) 傷硬盤

      6、緩存

      從一開(kāi)始就應(yīng)該使用緩存,高速緩存是一個(gè)更好的地方存儲(chǔ)臨時(shí)數(shù)據(jù),比如Web站點(diǎn)上跟蹤一個(gè)特定用戶的會(huì)話產(chǎn)生的臨時(shí)文件,就不再需要記錄到數(shù)據(jù)庫(kù)里。

      不能用lucene實(shí)現(xiàn)的可以用緩存,分布式緩存可以用memcached,如果有錢的話用10來(lái)臺(tái)機(jī)器做緩存,> 10G的存儲(chǔ)量相信存什么都?jí)蛄耍蝗绻麤](méi)錢的話可以在頁(yè)面緩存和數(shù)據(jù)緩存上下功夫,多用OSCACHE和EHCACHE,SWARMCACHE也可以,不過(guò)據(jù)說(shuō)同步性不是很好;

      可以使用Memcache進(jìn)行緩存,用大內(nèi)存把這些不變的數(shù)據(jù)全都緩存起來(lái),而當(dāng)修改時(shí)就通知cache過(guò)期,memcache是LJ開(kāi)發(fā)的一款分布式緩存產(chǎn)品,很多大型網(wǎng)站在應(yīng)用,我們可以把Cache Server與AppServer裝在一起。因?yàn)镃ache Server對(duì)CPU消耗不大,而有了Cache Server的支援,App Server對(duì)內(nèi)存要求也不是太高,所以可以和平共處,更有效的利用資源。
    posted @ 2009-11-30 16:50 筱 筱 閱讀(272) | 評(píng)論 (0)編輯 收藏


    將response內(nèi)響應(yīng)給使用者的內(nèi)容,使用GZIP壓縮的方式回傳給瀏覽器,而IE5和NS6也都有支持Gzip的壓縮格式。
    這個(gè)方法在之前就有人提出過(guò),因?yàn)槭亲尵W(wǎng)頁(yè)在輸出時(shí)經(jīng)過(guò)壓縮,可以讓傳輸量變小很多,雖然現(xiàn)在的網(wǎng)絡(luò)頻寬對(duì)于用來(lái)看網(wǎng)頁(yè)已經(jīng)綽綽有余,但是檔案大小太大的網(wǎng)頁(yè)還是會(huì)造成一定的影響。
    經(jīng)過(guò)Gzip壓縮過(guò)的網(wǎng)頁(yè),檔案大小可以到原本壓縮前的20%。

    package com.jsptw.filter;
    import java.io.*;
    import java.util.zip.GZIPOutputStream;
    import javax.servlet.*;
    import javax.servlet.http.*;
    public class GZIPEncodeFilter implements Filter {
          public void init(FilterConfig filterConfig) {}
          public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain)
                                          throws IOException, ServletException {       
            String transferEncoding = getGZIPEncoding((HttpServletRequest)request);       
            if (transferEncoding == null) {           
              chain.doFilter(request, response);       
            } else{         
              ((HttpServletResponse)response).setHeader("Content-Encoding", transferEncoding);
                GZIPEncodableResponse wrappedResponse = new GZIPEncodableResponse((HttpServletResponse)response);
                chain.doFilter(request, wrappedResponse);         
                wrappedResponse.flush();       
            }   
          }   
          public void destroy() {}   
          private static String getGZIPEncoding(HttpServletRequest request) {       
            String acceptEncoding = request.getHeader("Accept-Encoding");       
              if (acceptEncoding == null)
                return null;       
              acceptEncoding = acceptEncoding.toLowerCase();       
              if (acceptEncoding.indexOf("x-gzip") >= 0) {
                return "x-gzip";
              }       
              if (acceptEncoding.indexOf("gzip") >= 0) {           
                return "gzip";       
              }       
              return null;   
          }   
         
          private class GZIPEncodableResponse extends HttpServletResponseWrapper {       
            private GZIPServletStream wrappedOut;       
              public GZIPEncodableResponse(HttpServletResponse response) throws IOException {          
                super(response);           
                  wrappedOut = new GZIPServletStream(response.getOutputStream());       
              }       
              public ServletOutputStream getOutputStream() throws IOException {           
                return wrappedOut;       
              }       
              private PrintWriter wrappedWriter;       
              public PrintWriter getWriter() throws IOException {           
                if (wrappedWriter == null) {               
                    wrappedWriter = new PrintWriter( new OutputStreamWriter( getOutputStream(), getCharacterEncoding()));            }           
                     return wrappedWriter;       
                  }       
              public void flush() throws IOException {           
                if (wrappedWriter != null) {              
                    wrappedWriter.flush();           
                  }          
                  wrappedOut.finish();       
              }   
          }   
         
          private class GZIPServletStream extends ServletOutputStream {       
            private GZIPOutputStream outputStream;       
              public GZIPServletStream(OutputStream source) throws IOException {           
             outputStream = new GZIPOutputStream(source);       
           }       
           public void finish() throws IOException {
             OutputStream.finish();       
           }       
          public void write(byte[] buf) throws IOException {           
            outputStream.write(buf);       
          }       
          public void write(byte[] buf, int off, int len) throws IOException {           
            outputStream.write(buf, off, len);       
          }       
          public void write(int c) throws IOException {           
            outputStream.write(c);       
          }       
          public void flush() throws IOException {           
            outputStream.flush();       
          }      
          public void close() throws IOException {           
            outputStream.close();        
          }   
        }
    }


    web.xml中的設(shè)定為:
    <filter>       
    <filter-name>GZIPEncoder</filter-name>       
    <filter-class>com.jsptw.filter.GZIPEncodeFilter</filter-class>
    </filter>

    <filter-mapping> 
    <filter-name> GZIPEncoder</filter-name> 
    <url-pattern>/*</url-pattern>
    </filter-mapping> 

     

    本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/a_heng/archive/2009/09/22/4579979.aspx

    posted @ 2009-11-30 16:26 筱 筱 閱讀(289) | 評(píng)論 (0)編輯 收藏

    一 簡(jiǎn)單加密(不可逆):
            MD5(信息摘要算法,Message Digest),SHA(安全散列算法,Secure Hash,Algorithm)、HMAC(散列消息鑒別碼,Hash Message Authentication Code)

    二 復(fù)雜算法:
            1、對(duì)稱加密:加密解密使用相同的密鑰:DES(Data Encryption Standard,數(shù)據(jù)加密算法) 、IDEA、RC2、RC4、SKIPJACK
            2、非對(duì)稱加密:分為公開(kāi)密鑰(publickey)和私有密鑰(privatekey),且公開(kāi)密鑰與私有密鑰是一對(duì)。非對(duì)稱加密算法實(shí)現(xiàn)機(jī)密信息交換的基本過(guò)程是:甲方生成一對(duì)密鑰并將其中的一把作為公用密鑰向其它方公開(kāi);得到該公用密鑰的乙方使用該密鑰對(duì)機(jī)密信息進(jìn)行加密后再發(fā)送給甲方;甲方再用自己保存的另一把專用密鑰對(duì)加密后的信息進(jìn)行解密。甲方只能用其專用密鑰解密由其公用密鑰加密后的任何信息。非對(duì)稱加密算法的保密性比較好,它消除了最終用戶交換密鑰的需要,但加密和解密花費(fèi)時(shí)間長(zhǎng)、速度慢,它不適合于對(duì)文件加密而只適用于對(duì)少量數(shù)據(jù)進(jìn)行加密。經(jīng)典的非對(duì)稱加密算法如RSA(三個(gè)人名:Ron Rivest, AdiShamir 和Leonard Adleman)算法等安全性都相當(dāng)高。

    posted @ 2009-11-05 11:30 筱 筱 閱讀(192) | 評(píng)論 (0)編輯 收藏

    Insert是T-sql中常用語(yǔ)句,Insert INTO table(field1,field2,...) values(value1,value2,...)這種形式的在應(yīng)用程序開(kāi)發(fā)中必不可少。但我們?cè)陂_(kāi)發(fā)、測(cè)試過(guò)程中,經(jīng)常會(huì)遇到需要表復(fù)制的情況,如將一個(gè)table1的數(shù)據(jù)的部分字段復(fù)制到table2中,或者將整個(gè)table1復(fù)制到table2中,這時(shí)候我們就要使用SELECT INTO 和 INSERT INTO SELECT 表復(fù)制語(yǔ)句了。

          1.INSERT INTO SELECT語(yǔ)句

          語(yǔ)句形式為:Insert into Table2(field1,field2,...) select value1,value2,... from Table1

          要求目標(biāo)表Table2必須存在,由于目標(biāo)表Table2已經(jīng)存在,所以我們除了插入源表Table1的字段外,還可以插入常量。示例如下:

    select into與insert into select - xiaolei_funny - 一葉知秋 的博客select into與insert into select - xiaolei_funny - 一葉知秋 的博客INSERT INTO SELECT語(yǔ)句復(fù)制表數(shù)據(jù)

       --1.創(chuàng)建測(cè)試表

        create TABLE Table1

        (

            a varchar(10),

            b varchar(10),

            c varchar(10),

            CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED

            (

                a ASC

            )

        ) ON [PRIMARY]

        create TABLE Table2

        (

            a varchar(10),

            c varchar(10),

            d int,

            CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED

            (

                a ASC

            )

        ) ON [PRIMARY]

        GO

        --2.創(chuàng)建測(cè)試數(shù)據(jù)

        Insert into Table1 values('趙','asds','90')

        Insert into Table1 values('錢','asds','100')

        Insert into Table1 values('孫','asds','80')

        Insert into Table1 values('李','asds',null)

        GO

        select * from Table2

        --3.INSERT INTO SELECT語(yǔ)句復(fù)制表數(shù)據(jù)

        Insert into Table2(a, c, d) select a,c,5 from Table1

        GO

        --4.顯示更新后的結(jié)果

        select * from Table2

        GO

        --5.刪除測(cè)試表

        drop TABLE Table1

        drop TABLE Table2

          2.SELECT INTO FROM語(yǔ)句

          語(yǔ)句形式為:SELECT vale1, value2 into Table2 from Table1

          要求目標(biāo)表Table2不存在,因?yàn)樵诓迦霑r(shí)會(huì)自動(dòng)創(chuàng)建表Table2,并將Table1中指定字段數(shù)據(jù)復(fù)制到Table2中。示例如下:

    select into與insert into select - xiaolei_funny - 一葉知秋 的博客select into與insert into select - xiaolei_funny - 一葉知秋 的博客SELECT INTO FROM創(chuàng)建表并復(fù)制表數(shù)據(jù)

       --1.創(chuàng)建測(cè)試表

        create TABLE Table1

        (

            a varchar(10),

            b varchar(10),

            c varchar(10),

            CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED

            (

                a ASC

            )

        ) ON [PRIMARY]

        GO

        --2.創(chuàng)建測(cè)試數(shù)據(jù)

        Insert into Table1 values('趙','asds','90')

        Insert into Table1 values('錢','asds','100')

        Insert into Table1 values('孫','asds','80')

        Insert into Table1 values('李','asds',null)

        GO

        --3.SELECT INTO FROM語(yǔ)句創(chuàng)建表Table2并復(fù)制數(shù)據(jù)

        select a,c INTO Table2 from Table1

        GO

        --4.顯示更新后的結(jié)果

        select * from Table2

        GO

        --5.刪除測(cè)試表

        drop TABLE Table1

        drop TABLE Table2

    posted @ 2009-11-04 13:21 筱 筱 閱讀(474) | 評(píng)論 (0)編輯 收藏

    MySQl詳細(xì)安裝過(guò)程
    1.利用安裝包進(jìn)行安裝:
    雙擊mysql-5.0.19-win32.zip打開(kāi),再雙擊里面的setup.exe就開(kāi)始進(jìn)行安裝了,當(dāng)然你也可以先解壓再雙擊安裝。
    a.彈出MySQL Server 5.0-Setup Wizard對(duì)話框,點(diǎn)next
    b.就到了選擇安裝類型的對(duì)話框了,有三種類型:(1)典型 (2)完全(3)自定義。一般來(lái)說(shuō)選典型就可以了,典型和完全安裝都會(huì)裝在默認(rèn)的路徑C:\Program Files\MySQL\MySQL Server 5.0,如果要改變安裝路徑就要選擇自定義,我這里選擇的是“完全”
    c.點(diǎn)擊next->install就開(kāi)始安裝了。如果選擇“自定義”的話,改變你的安裝路徑后,再點(diǎn)擊next->install是一樣的。
    d.跟著就到了一個(gè)問(wèn)你是否要申請(qǐng)一個(gè)登錄MySQL.com的帳戶,有興趣的話可以按步驟來(lái)申請(qǐng)一個(gè),呵呵。我選擇的是Skip Sign-Up->finish。注意這時(shí)并沒(méi)有安裝完成,接著要進(jìn)行配置,配置好后才能使用!
    e.點(diǎn)finish后會(huì)馬上彈出一個(gè)MySQL Server Instance Configuration Wizard的對(duì)話框,點(diǎn)next
    f.又到了一個(gè)選擇配置類型的對(duì)話框,“詳細(xì)”和“標(biāo)準(zhǔn)”配置,如果想快的話就選“標(biāo)準(zhǔn)”,再點(diǎn)next就可以了。不過(guò)我強(qiáng)烈推薦選“詳細(xì)”的單選按鈕,點(diǎn)next
    g.再選擇服務(wù)器類型“開(kāi)發(fā)者”,“服務(wù)器”,“專門的MySQL服務(wù)器”,三者之間的區(qū)別是占用的內(nèi)存的不同,從最小,中等,最大。點(diǎn)next,選擇數(shù) 據(jù)庫(kù)類型:“多功能的”,“事務(wù)專用的”,“非事務(wù)專用”。三者的區(qū)別是:“多功能的”可以同時(shí)使用MyISAM和InnoDB儲(chǔ)存引擎,它們占用 MySQL可用資源各半;“事務(wù)專用的”InnoDB作為主儲(chǔ)存引擎,占用大量的資源,MyISAM引擎仍然可用;“非事務(wù)專用的”InnoDB就不能再 用了,點(diǎn)next
    h.(因?yàn)槲疫x的是“多功能的”,不同的選項(xiàng)這里可能會(huì)不同)這里可以選擇存放InnoDB表空間的目錄,我選的默認(rèn),點(diǎn)next
    i.就到了為服務(wù)器設(shè)置合適的并發(fā)連接數(shù),有三種類型:“決策支持”并發(fā)連接數(shù)較小,默認(rèn)設(shè)為20;“在線事務(wù)處理”可以在任何時(shí)候達(dá)到500個(gè)活動(dòng)的連接;“手動(dòng)設(shè)定”自己想要的連接數(shù),選了這個(gè)后,從右邊的下拉框選一個(gè)合適的數(shù)值,點(diǎn)next后
    j.選擇端口,3306就可以了,點(diǎn)next
    k.設(shè)置字符集,這里又是有三個(gè)選擇:“標(biāo)準(zhǔn)”使用的是latin1字符集,不支持中文;“多語(yǔ)言”使用的是UTF-8,支持中文;“手動(dòng)選擇默認(rèn)的字符集”,選中后可以從右邊的下拉框中選擇你想要的字符集,里面有g(shù)b2312和gbk是支持中文的,點(diǎn)next
    l.安裝成為windows的服務(wù),并可以從右邊的下拉框中為它選擇一個(gè)名稱,例如“MySQL”,“MySQL5”等。Launch the MySQL Server automatically是否自動(dòng)啟動(dòng)服務(wù),Include Bin Directory in Windows Path是否要將安裝目錄C:\Program Files\MySQL\MySQL Server 5.0\bin加入環(huán)境變量PATH中,建議加入的好,點(diǎn)next
    m.設(shè)置root用戶的密碼,當(dāng)然也可以不把Modify Security Setting 勾掉不設(shè)密碼,建議還是設(shè)的好。Enable root access from remote machines是否允許root用戶進(jìn)行遠(yuǎn)程登錄,Create An Anonymous Account是否創(chuàng)建匿名用戶
    n.點(diǎn)next->Execute->Finish。
    至此MySQL終于安裝完成
    MySQl詳細(xì)安裝過(guò)程
    1.利用安裝包進(jìn)行安裝:
    雙擊mysql-5.0.19-win32.zip打開(kāi),再雙擊里面的setup.exe就開(kāi)始進(jìn)行安裝了,當(dāng)然你也可以先解壓再雙擊安裝。
    a.彈出MySQL Server 5.0-Setup Wizard對(duì)話框,點(diǎn)next
    b.就到了選擇安裝類型的對(duì)話框了,有三種類型:(1)典型 (2)完全(3)自定義。一般來(lái)說(shuō)選典型就可以了,典型和完全安裝都會(huì)裝在默認(rèn)的路徑C:\Program Files\MySQL\MySQL Server 5.0,如果要改變安裝路徑就要選擇自定義,我這里選擇的是“完全”
    c.點(diǎn)擊next->install就開(kāi)始安裝了。如果選擇“自定義”的話,改變你的安裝路徑后,再點(diǎn)擊next->install是一樣的。
    d.跟著就到了一個(gè)問(wèn)你是否要申請(qǐng)一個(gè)登錄MySQL.com的帳戶,有興趣的話可以按步驟來(lái)申請(qǐng)一個(gè),呵呵。我選擇的是Skip Sign-Up->finish。注意這時(shí)并沒(méi)有安裝完成,接著要進(jìn)行配置,配置好后才能使用!
    e.點(diǎn)finish后會(huì)馬上彈出一個(gè)MySQL Server Instance Configuration Wizard的對(duì)話框,點(diǎn)next
    f.又到了一個(gè)選擇配置類型的對(duì)話框,“詳細(xì)”和“標(biāo)準(zhǔn)”配置,如果想快的話就選“標(biāo)準(zhǔn)”,再點(diǎn)next就可以了。不過(guò)我強(qiáng)烈推薦選“詳細(xì)”的單選按鈕,點(diǎn)next
    g.再選擇服務(wù)器類型“開(kāi)發(fā)者”,“服務(wù)器”,“專門的MySQL服務(wù)器”,三者之間的區(qū)別是占用的內(nèi)存的不同,從最小,中等,最大。點(diǎn)next,選擇數(shù) 據(jù)庫(kù)類型:“多功能的”,“事務(wù)專用的”,“非事務(wù)專用”。三者的區(qū)別是:“多功能的”可以同時(shí)使用MyISAM和InnoDB儲(chǔ)存引擎,它們占用 MySQL可用資源各半;“事務(wù)專用的”InnoDB作為主儲(chǔ)存引擎,占用大量的資源,MyISAM引擎仍然可用;“非事務(wù)專用的”InnoDB就不能再 用了,點(diǎn)next
    h.(因?yàn)槲疫x的是“多功能的”,不同的選項(xiàng)這里可能會(huì)不同)這里可以選擇存放InnoDB表空間的目錄,我選的默認(rèn),點(diǎn)next
    i.就到了為服務(wù)器設(shè)置合適的并發(fā)連接數(shù),有三種類型:“決策支持”并發(fā)連接數(shù)較小,默認(rèn)設(shè)為20;“在線事務(wù)處理”可以在任何時(shí)候達(dá)到500個(gè)活動(dòng)的連接;“手動(dòng)設(shè)定”自己想要的連接數(shù),選了這個(gè)后,從右邊的下拉框選一個(gè)合適的數(shù)值,點(diǎn)next后
    j.選擇端口,3306就可以了,點(diǎn)next
    k.設(shè)置字符集,這里又是有三個(gè)選擇:“標(biāo)準(zhǔn)”使用的是latin1字符集,不支持中文;“多語(yǔ)言”使用的是UTF-8,支持中文;“手動(dòng)選擇默認(rèn)的字符集”,選中后可以從右邊的下拉框中選擇你想要的字符集,里面有g(shù)b2312和gbk是支持中文的,點(diǎn)next
    l.安裝成為windows的服務(wù),并可以從右邊的下拉框中為它選擇一個(gè)名稱,例如“MySQL”,“MySQL5”等。Launch the MySQL Server automatically是否自動(dòng)啟動(dòng)服務(wù),Include Bin Directory in Windows Path是否要將安裝目錄C:\Program Files\MySQL\MySQL Server 5.0\bin加入環(huán)境變量PATH中,建議加入的好,點(diǎn)next
    m.設(shè)置root用戶的密碼,當(dāng)然也可以不把Modify Security Setting 勾掉不設(shè)密碼,建議還是設(shè)的好。Enable root access from remote machines是否允許root用戶進(jìn)行遠(yuǎn)程登錄,Create An Anonymous Account是否創(chuàng)建匿名用戶
    n.點(diǎn)next->Execute->Finish。
    至此MySQL終于安裝完成

    測(cè)試
    Microsoft Windows XP [版本 5.1.2600](C) 版權(quán)所有 1985-2001 Microsoft Corp.
    C:\Documents and Settings\Administrator\桌面>mysql -uroot -pEnter password: ********Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 2 to server version: 5.0.19-nt
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    mysql>
    看到上面這個(gè)就說(shuō)明安裝成功!一般的登錄為:mysql -h host -u user -p (password)

    非安裝包的安裝
    1.將mysql-noinstall-5.0.19-win32.zip到C:\(或者其他你想的安裝目錄),重命名mysql
    2.進(jìn)入C:\mysql\可以找到如下的配置文件樣本,my-small.ini,my-medium.ini等。我選擇my-medium.ini,先將復(fù)制到另外的地方,例如:桌面,然后重命名為my.ini,再剪切回C:\mysql\目錄下。
    3.打開(kāi)my.ini進(jìn)行編輯,要修改的地方如下:
    [client]#password = your_passwordport = 3309#socket = /tmp/mysql.sock
    將socket項(xiàng)用'#'注釋掉,因?yàn)閣indows下沒(méi)有,又因?yàn)槲疑厦嬗昧硕丝?306,所以這里要把端口也改了,改為3309,你可以改成其他沒(méi)有被占用的端口3307,3308等。
    [mysqld]
    basedir=C:/mysql/datadir=C:/mysql/data/port = 3309#socket = /tmp/mysql.sock
    default-character-set=utf8
    這里同樣把socket注釋掉,端口改成3309;basedir為安裝目錄,datadir為存放數(shù)據(jù)的目錄,記住要用“/”,而不是“\”,如果要用"\"就要這樣使用C:\\mysql\\data,另外這里我還設(shè)置了默認(rèn)的字符集為utf8。
    還有
    [mysql]
    default-character-set=utf8
    no-auto-rehash# Remove the next comment character if you are not familiar with SQL#safe-updates在上面添加默認(rèn)的字符集就可以了。
    4.編輯完my.ini文件后就要選擇一種MySQL服務(wù)器類型,它們之間的區(qū)別如下:
    Binary
    Description

    mysqld-debug
    Compiled with full debugging and automatic memory allocation checking, as well as InnoDB and BDB tables.

    mysqld
    Optimized binary with InnoDB support.

    mysqld-nt
    Optimized binary for Windows NT, 2000, and XP with support for named pipes.

    mysqld-max
    Optimized binary with support for InnoDB and BDB tables.

    mysqld-max-nt
    Like mysqld-max, but compiled with support for named pipes.
    上面每一種類型都可以在C:\mysql\bin目錄下找到對(duì)應(yīng)的.exe程序,例如:mysqld-max.exe,mysqld-nt.exe等。
    5.選擇好后就要安裝成windows服務(wù)了,過(guò)程如下:(我選的是mysqld-max)
    Microsoft Windows XP [版本 5.1.2600](C) 版權(quán)所有 1985-2001 Microsoft Corp.
    C:\Documents and Settings\Administrator\桌面>cd c:\mysql\bin
    C:\mysql\bin>mysqld-max --install mysql-max --defaults-file=c:\mysql\my.iniService successfully installed.C:\mysql\bin>net start mysql-maxmysql-max 服務(wù)正在啟動(dòng) .mysql-max 服務(wù)已經(jīng)啟動(dòng)成功。
    C:\mysql\bin>mysql -uroot --port=3309Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 1 to server version: 5.0.19-max-log
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    安裝成windows服務(wù)的命令格式為:服務(wù)器類型 --install(自動(dòng)) 名稱(你想要用的名稱) --defaults-file=my.ini文件的絕對(duì)路徑。--install-manual(手動(dòng))
    注意:上面的登錄mysql -uroot --port=3309 非安裝默認(rèn)設(shè)定的用戶為root,密碼為空,同時(shí)因?yàn)槲腋牧硕丝?,所以要加?-port選項(xiàng)。

    一臺(tái)機(jī)器上安裝多個(gè)windows服務(wù)
    1.創(chuàng)建要安裝的目錄,例如:F:\mysql,在F:\mysql目錄下再創(chuàng)建一個(gè)子目錄data.
    2.再到已經(jīng)裝好的mysql的目錄下,例如:C:\mysql\,把里面data目錄下的mysql目錄copy到F:\mysql\data\目錄 下,再C:\mysql\目錄下share目錄和my.ini文件也copy到F:\mysql\目錄下,其實(shí)只需要C:\mysql\share \english目錄下的errmsg.sys文件.
    3.編輯F:\mysql\my.ini文件,修改里面的端口和basedir,datadir就可以了.
    [client]#password = 123456port = 3308#socket = /tmp/mysql.sock
    [mysqld]
    # set basedir to your installation pathbasedir=F:/mysql/# set datadir to the location of your data directorydatadir=F:/mysql/data/
    port = 3308
    4.安裝成windows服務(wù)同上面的非安裝版本的安裝過(guò)程是一樣的,過(guò)程如下:
    Microsoft Windows XP [版本 5.1.2600](C) 版權(quán)所有 1985-2001 Microsoft Corp.
    C:\Documents and Settings\Administrator\桌面>cd c:\mysql\bin
    C:\mysql\bin>mysqld-debug --install mysql-debug --defaults-file=F:\mysql\my.iniService successfully installed.
    C:\mysql\bin>net start mysql-debugmysql-debug 服務(wù)正在啟動(dòng) .mysql-debug 服務(wù)已經(jīng)啟動(dòng)成功。
    C:\mysql\bin>mysql -uroot --port=3308Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 1 to server version: 5.0.19-community-debug-log
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.mysql>

    posted @ 2009-10-10 14:03 筱 筱 閱讀(275) | 評(píng)論 (0)編輯 收藏

    用于指定服務(wù)器上可以使用該COOKIE的文件所在的路徑,它只對(duì)該網(wǎng)址下的該路徑下的應(yīng)用起作用."/"表示服務(wù)器上所有目錄都可以使用該COOKIE.
    posted @ 2009-09-18 11:38 筱 筱 閱讀(1166) | 評(píng)論 (0)編輯 收藏

    頁(yè)面如果用到Ext最好不要在body有任何文字輸出,不然的話ext會(huì)報(bào)一個(gè)錯(cuò)誤!

    對(duì)象不支持此屬性或方法
    ext-all.js                                        行:9
    posted @ 2009-07-31 23:26 筱 筱 閱讀(151) | 評(píng)論 (0)編輯 收藏

    郁悶了兩天了,spring+hibernate查詢數(shù)據(jù),sql語(yǔ)句在數(shù)據(jù)庫(kù)里試過(guò)了是正確的,數(shù)據(jù)庫(kù)里有數(shù)據(jù),但是就是查不出數(shù)據(jù)。后來(lái)仔細(xì)看日志文件,恍然大悟,原來(lái)是整形字段賦值為null,
    Null value was assigned to a property of primitive type setter of com.*.*.*.age

    posted @ 2009-07-31 11:40 筱 筱 閱讀(1193) | 評(píng)論 (0)編輯 收藏

    1、得到record中的某個(gè)字段:record.get("字段名稱")
    2、得到form中的某個(gè)字段值:this.form.findField("字段名稱").getValue()
    3、從reader中得到root指定的字段除外的字段:store.reader.jsonData.字段名稱
    4、關(guān)于combobx
        valueField  :  設(shè)置值
        displayField  :設(shè)置顯示的值
        hiddenName :動(dòng)態(tài)產(chǎn)生一個(gè)隱藏字段,以便表單提交的時(shí)候一起提交,事實(shí)上valueField和displayField在表單提交中沒(méi)有啟任何作用,往往指定hiddenName就行,如果在combobox中找到hiddenName匹配的值,則將匹配的值顯示出來(lái),因此,細(xì)心的朋友可以發(fā)現(xiàn),在將選擇的記錄賦給combobox所在的form時(shí)(this.form.loadRecord(record)),在combobox里首先會(huì)顯示出hiddenName指定的值(一般是id),在combobox的store加載完后,如果找到匹配的值則會(huì)顯示匹配的值,中間有個(gè)值的變化過(guò)程!引申一下,如果我們combobox下拉框里用的是樹(shù),則hiddenName肯定是找不到匹配項(xiàng)的(Ext總是會(huì)在原始combobox下拉項(xiàng)中匹配,而現(xiàn)在下拉項(xiàng)換成了樹(shù)),因此combobox會(huì)一直顯示hiddenName的值(即一個(gè)id值)。在這種情況下我們就需要手動(dòng)指定combobox的顯示值,具體方法是在combobox的load事件中用setRawValue指定。注意這里不能用setValue指定,因?yàn)樵谑褂胔iddenName的情況下,setValue首先將值賦給隱藏字段,如果在combobox中找到匹配項(xiàng)則顯示匹配項(xiàng)的值,如果沒(méi)有匹配的值就顯示setValue的值。

    posted @ 2009-07-29 13:29 筱 筱 閱讀(269) | 評(píng)論 (0)編輯 收藏

    apache common Pool 對(duì)象池
    apache common dbcp 數(shù)據(jù)庫(kù)連接池
    common dbcp依賴 common pool
    posted @ 2009-07-09 09:53 筱 筱 閱讀(174) | 評(píng)論 (0)編輯 收藏

    一、Ignoring namespace handler [org.springframework.ejb.config.JeeNamespaceHandler]: handler class not found
            需要添加spring-remoting.jar包,具體路徑為:MyEclipse 6.0\myeclipse\eclipse\plugins\com.genuitec.eclipse.springframework_6.0.1.zmyeclipse601200710\data\2.0\dist\modules
    二、org.springframework.scripting.config.LangNamespaceHandler
            添加spring-support.jar包,具體路徑為:MyEclipse 6.0\myeclipse\eclipse\plugins\com.genuitec.eclipse.springframework_6.0.1.zmyeclipse601200710\data\2.0\dist\modules

    posted @ 2009-06-24 18:13 筱 筱 閱讀(324) | 評(píng)論 (1)編輯 收藏

    解決兩種情況下的用戶訪問(wèn)超時(shí)。
    a)普通http請(qǐng)求的session超時(shí)。
    b)異步http請(qǐng)求的session超時(shí),使用ext后大部分的界面刷新都是異步的ajax請(qǐng)求。

    不管是那種類型的http請(qǐng)求總是可以由一個(gè)過(guò)濾器來(lái)捕捉。
    分類:普通http請(qǐng)求的header參數(shù)中沒(méi)有x-requested-with:XMLHttpRequest頭信息,而異步的有。
    其實(shí)對(duì)于常見(jiàn)的ajax框架,header中還有標(biāo)示自己身份的header信息。

    對(duì)于普通的http請(qǐng)求,發(fā)現(xiàn)session超時(shí)后直接重定向到一個(gè)超時(shí)頁(yè)面,顯示訪問(wèn)超時(shí)。
    對(duì)于異步http請(qǐng)求,發(fā)現(xiàn)session超時(shí)后則向請(qǐng)求的response中寫入特定的超時(shí)頭信息,客戶端ajax對(duì)象檢測(cè)
    頭信息,發(fā)現(xiàn)有超時(shí)狀態(tài)標(biāo)志后調(diào)用顯示超時(shí)信息的javascript方法,提示用戶訪問(wèn)超時(shí)。

    服務(wù)器端session超時(shí)后在過(guò)濾器中為response添加新的頭信息,標(biāo)記該請(qǐng)求超時(shí):

    if(r.getHeader("x-requested-with")!=null
    && r.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
    response.setHeader("sessionstatus","timeout");
    }
    使用Ext.Ajaxt對(duì)象完成異步請(qǐng)求的交互,Ext.Ajax是單實(shí)例對(duì)象(非常重要,全局單一Ext.Ajax實(shí)例?。?。
    注冊(cè)Ext.Ajax的requestcomplete事件,每個(gè)ajax請(qǐng)求成功后首先響應(yīng)該事件。在該事件的回調(diào)函數(shù)里面判斷
    訪問(wèn)請(qǐng)求是否超時(shí)。使用Ext.Ajax對(duì)象的好處是,只需要引入一個(gè)包含了幾行超時(shí)處理代碼的js文件,就可以
    為當(dāng)前應(yīng)用增加超時(shí)處理功能,原有代碼不需要做任何修改。

    使用Ext.Ajaxt對(duì)象完成異步請(qǐng)求交互,假如checkUserSessionStatus是你的回調(diào)方法,每個(gè)頁(yè)面引用:

    Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this);
    function checkUserSessionStatus(conn,response,options){
    //Ext重新封裝了response對(duì)象
    if(typeof response.getResponseHeader.sessionstatus != 'undefined'){
    //發(fā)現(xiàn)請(qǐng)求超時(shí),退出處理代碼...
    }
    }
    可以利用的幾個(gè)特性:
    a)所有的ajax請(qǐng)求均帶有x-requested-with:XMLHttpRequest頭信息
    b)Ext.Ajax是單實(shí)例對(duì)象(非常重要,全局單一Ext.Ajax實(shí)例?。?br />c)注冊(cè)Ext.Ajax的requestcomplete事件,每個(gè)ajax請(qǐng)求成功后首先響應(yīng)該事件(概念類似spring的aop攔截)。
    jquery提供了幾個(gè)全局事件可以用來(lái)處理session過(guò)期請(qǐng)求,如當(dāng)ajax請(qǐng)求開(kāi)始時(shí)會(huì)觸發(fā)ajaxStart()方法的回調(diào)函數(shù);
    當(dāng)ajax請(qǐng)求結(jié)束時(shí),會(huì)觸發(fā)ajaxStop()方法的回調(diào)函數(shù)。這些方法都是全局的方法,因此無(wú)論創(chuàng)建它們的代碼位于何處,
    只要有ajax請(qǐng)求發(fā)生時(shí),都會(huì)觸發(fā)它們。類似的事件還有:ajaxComplete(),ajaxError(),ajaxSend(),ajaxSuccess()等。
    如果使某個(gè)ajax請(qǐng)求不受全局方法的影響,那么可以在使用$.ajax()方法時(shí),將參數(shù)中的global設(shè)置為false,jquery代碼如下:
    $.ajax({
        url:"test.html",
        global:false//不觸發(fā)全局ajax事件


    })

     對(duì)于其他的ajax框架,解決用戶訪問(wèn)請(qǐng)求超時(shí)這個(gè)問(wèn)題的思路是類似的。

    在這里推薦一個(gè)很實(shí)用的Js方法:

    function getRootWin(){
    var win = window;
    while (win != win.parent){
    win = win.parent;
    }
    return win;
    }
    

     

    通過(guò)該方法,可以在一個(gè)任意深度的iframe中調(diào)用父iframe中的方法。具體到這里就是無(wú)論哪一個(gè)iframe中的用戶訪

    問(wèn)請(qǐng)求超時(shí),都可以通過(guò)該方法調(diào)用最外層iframe中的退出方法,這樣便為用戶提供了一個(gè)統(tǒng)一的訪問(wèn)超時(shí)退出的UI

    呈現(xiàn)。

    posted @ 2009-06-05 15:54 筱 筱 閱讀(3476) | 評(píng)論 (0)編輯 收藏

    failure:function(form, action){
        if(action.failureType == 'server'){
            //服務(wù)器端你自己返回success為false時(shí)
         Ext.MessageBox.alert('友情提示', action.result.info);
        }else if(action.failureType == 'connect'){
            //服務(wù)器指定的路徑鏈接不上時(shí)
         Ext.Msg.alert('連接錯(cuò)誤','指定路徑連接錯(cuò)誤!');
        }else if(action.failureType == 'client'){
            //客戶端數(shù)據(jù)驗(yàn)證失敗的情況下,例如客戶端驗(yàn)證郵件格式不正確的情況下提交表單
         Ext.Msg.alert('提示','數(shù)據(jù)錯(cuò)誤,非法提交');
        }else{
            //其它類型的錯(cuò)誤
         Ext.MessageBox.alert('警告', '服務(wù)器數(shù)據(jù)傳輸失敗:'+action.response.responseText);
        }
    },
    posted @ 2009-05-22 13:50 筱 筱 閱讀(575) | 評(píng)論 (0)編輯 收藏

    Ext的數(shù)據(jù)存儲(chǔ)器為:Ext.data.Store
    ExtJS中有一個(gè)名為Record的類,表格等控件中使用的數(shù)據(jù)是存放在Record對(duì)象中,一個(gè)Record可以理解為關(guān)系數(shù)據(jù)表中的一行,也可以稱為記錄。Record對(duì)象中即包含了記錄(行中各列)的定義信息(也就是該記錄包含哪些字段,每一個(gè)字段的數(shù)據(jù)類型等),同時(shí)又包含了記錄具體的數(shù)據(jù)信息(也就是各個(gè)字段的值)。一個(gè)比較正規(guī)的創(chuàng)建store的代碼如下:
    var MyRecord = Ext.data.Record.create([
     {name: 'title'},
     {name: 'username', mapping: 'author'},
     {name: 'loginTimes', type: 'int'},
     {name: 'lastLoginTime', mapping: 'loginTime', type: 'date'}
    ]);
    var dataProxy=new Ext.data.HttpProxy({url:"login.do"});
    var theReader=new Ext.data.JsonReader({
     totalProperty: "results", 
     root: "rows",             
     id: "id"                  
     },MyRecord
    );
    var store=new Ext.data.Store({  
     proxy:dataProxy,
     reader:theReader
    });
    store.load();
    store在創(chuàng)建的時(shí)候會(huì)自動(dòng)使用HttpProxy來(lái)加載參數(shù),并且使用post方式來(lái)提交請(qǐng)求,因此上面的代碼可簡(jiǎn)化為:
    var MyRecord = Ext.data.Record.create([
     {name: 'title'},
     {name: 'username', mapping: 'author'},
     {name: 'loginTimes', type: 'int'},
     {name: 'lastLoginTime', mapping: 'loginTime', type: 'date'}
    ]);
    var theReader=new Ext.data.JsonReader({
     totalProperty: "results", 
     root: "rows",             
     id: "id"                  
     },MyRecord
    );
    var store=new Ext.data.Store({  
    url:'login.do',
     reader:theReader
    });
    store.load();
    在Store類的基礎(chǔ)上提供了SimpleStore、JSonStore、GroupingStore等,因此上面的JsonReader可以省略:
    var store = new Ext.data.JsonStore({
                url:'contact.do',
                root:'data',
                totalProperty:'totalCount',
                fields:[{name: 'vid', mapping: 'id'},
                    {name: 'name', mapping: 'name'},
                    {name: 'vmethod', mapping: 'vmethod'}]
            });
    posted @ 2009-05-22 11:15 筱 筱 閱讀(750) | 評(píng)論 (0)編輯 收藏

           success:function(form,action){
                  window.location.href = 'index.jsp'; 
            },
            failure : function(form, action) {
             if(action.failureType == 'server'){
              Ext.Msg.alert('登錄錯(cuò)誤',action.result.errors);
                }else if(action.failureType == 'connect'){
                 Ext.Msg.alert('連接錯(cuò)誤','指定路徑連接錯(cuò)誤!');
                }else{
                 Ext.MessageBox.alert('警告', '服務(wù)器數(shù)據(jù)傳輸失敗:'+action.response.responseText);
                }
            }

            
            java返回的數(shù)據(jù),成功為:String json="{success:true}",失敗為: String json="{success:false,errors:'用戶名或者密碼錯(cuò)誤?。?!'}";
    posted @ 2009-05-08 11:11 筱 筱 閱讀(1386) | 評(píng)論 (0)編輯 收藏

    使用group by子句的注意事項(xiàng):

    (1)在SELECT子句的字段列表中,除了聚集函數(shù)外,其他所出現(xiàn)的字段一定要在group by子句中有定義才行。例如“group by A,B”,那么“SELECT SUM(A),C”就有問(wèn)題,因?yàn)镃不在group by中,但是SUM(A)是可以的。

    (2)SELECT子句的字段列表中不一定要有聚集函數(shù),但至少要用到group by子句列表中的一個(gè)項(xiàng)目。例如“group by A,B,C”,則“SELECT A”是可以的。

    (3)在SQL Server中text、ntext和image數(shù)據(jù)類型的字段不能作為group by子句的分組依據(jù)。

    posted @ 2009-04-21 18:26 筱 筱 閱讀(158) | 評(píng)論 (0)編輯 收藏

    格式 
    定義變量:
    $identifier
    $(identifier)
    $(identifier:conversion)

    變量的字符串級(jí)別最高,如果遇到相同的字符串,首先被認(rèn)為是變量。顯示$,需要后面在跟一個(gè),$$。例如:
    You account has $$1650.00 in it.

    變量名稱規(guī)則:
    1、變量名是由US-ASCII碼、下劃線和數(shù)字組成;
    2、只能以US-ASCII碼開(kāi)頭;
    3、變量名大小寫敏感。
    注意:
    1、WML變量沒(méi)有類型,均表示為字符串;
    2、變量沒(méi)有被賦值的時(shí)候,內(nèi)容為空,即空字符串。
    3、可以在運(yùn)行過(guò)程中改變它的值。

    創(chuàng)建變量
    最簡(jiǎn)單的方法是使用<setvar>元素,語(yǔ)法如下:
    <setvar name="string" value="string" />

    <setvar>只能在<go>、<prev>和<refresh>中使用。
    下例定義了一個(gè)叫vNAME的變量并賦值為“Jeff”:
    <setvar name="vNAME" value="Jeff" />

    另外,還可以在<input>、<select>和<postfield>中定義變量。

    替換文本 
    變量可以用作替換用途,但只能在文本類型(如顯示字符、URL等)中使用。
    任何元素和屬性都不能使用變量來(lái)替代。例如:
    Hello, $vNAME.
    將顯示:
    Hello, Jeff.

    ESCAPE
    轉(zhuǎn)換

    前面說(shuō)過(guò)變量可以用作替換用途,但是在URL中使用時(shí),變量的內(nèi)容必須遵守[RFC2396]標(biāo)準(zhǔn)。
    這個(gè)標(biāo)準(zhǔn)規(guī)定某些特殊字符在URL里使用的時(shí)候必須用特殊表示方法,即ESCAPE八進(jìn)制表示。
    例如:
    list.asp?id=3

    在URL中要表示為:

    list.asp%3fid=3

    所以變量有可能需要標(biāo)志為是否對(duì)其內(nèi)容進(jìn)行ESCAPE轉(zhuǎn)換,變量定義就有如下幾種特殊方式:

    效果 表達(dá)方式1 表達(dá)方式2 表達(dá)方式3
    對(duì)變量中ESCAPE字符進(jìn)行轉(zhuǎn)換 $(var:e) $(var:E) $(var:escape)
    不進(jìn)行ESCAPE轉(zhuǎn)換 $(var:u) $(var:U) $(var:unesc)
    變量中沒(méi)有ESCAPE字符 $(var:n) $(var:N)

    $(noesc)


    給變量進(jìn)行ESCAPE轉(zhuǎn)換是WML的默認(rèn)方式。
    posted @ 2009-04-13 14:11 筱 筱 閱讀(148) | 評(píng)論 (0)編輯 收藏

    概述:
    Servlet監(jiān)聽(tīng)器用于監(jiān)聽(tīng)一些重要事件的發(fā)生,監(jiān)聽(tīng)器對(duì)象可以在事情發(fā)生前、發(fā)生后可以做一些必要的處理。
    接口:
    目前Servlet2.4和JSP2.0總共有8個(gè)監(jiān)聽(tīng)器接口和6個(gè)Event類,其中HttpSessionAttributeListener與
    HttpSessionBindingListener 皆使用HttpSessionBindingEvent;HttpSessionListener和 HttpSessionActivationListener則都使用HttpSessionEvent;其余Listener對(duì)應(yīng)的Event如下所 示:

    Listener接口

    Event

    ServletContextListener

    ServletContextEvent

    ServletContextAttributeListener

    ServletContextAttributeEvent

    HttpSessionListener

    HttpSessionEvent

    HttpSessionActivationListener

    HttpSessionAttributeListener

    HttpSessionBindingEvent

    HttpSessionBindingListener

    ServletRequestListener

    ServletRequestEvent

    ServletRequestAttributeListener

    ServletRequestAttributeEvent

    分別介紹:
    一 ServletContext相關(guān)監(jiān)聽(tīng)接口
    補(bǔ)充知識(shí):
    通過(guò)ServletContext 的實(shí)例可以存取應(yīng)用程序的全局對(duì)象以及初始化階段的變量。
    在JSP文件中,application 是 ServletContext 的實(shí)例,由JSP容器默認(rèn)創(chuàng)建。Servlet 中調(diào)用 getServletContext()方法得到 ServletContext 的實(shí)例。
    注意:
    全局對(duì)象即Application范圍對(duì)象,初始化階段的變量指在web.xml中,經(jīng)由<context-param>元素所設(shè)定的變量,它的范圍也是Application范圍,例如:

    <context-param>
    <param-name>Name</param-name>
    <param-value>browser</param-value>
    </context-param>
    當(dāng)容器啟動(dòng)時(shí),會(huì)建立一個(gè)Application范圍的對(duì)象,若要在JSP網(wǎng)頁(yè)中取得此變量時(shí):
    String name = (String)application.getInitParameter("Name");
    或者使用EL時(shí):
    ${initPara.name}
    若是在Servlet中,取得Name的值方法:
    String name = (String)ServletContext.getInitParameter("Name");


    1.ServletContextListener:
    用于監(jiān)聽(tīng)WEB 應(yīng)用啟動(dòng)和銷毀的事件,監(jiān)聽(tīng)器類需要實(shí)現(xiàn)javax.servlet.ServletContextListener 接口。
    ServletContextListener 是 ServletContext 的監(jiān)聽(tīng)者,如果 ServletContext 發(fā)生變化,如服務(wù)器啟動(dòng)時(shí) ServletContext 被創(chuàng)建,服務(wù)器關(guān)閉時(shí) ServletContext 將要被銷毀。

    ServletContextListener接口的方法:
    void contextInitialized(ServletContextEvent sce)
    通知正在接受的對(duì)象,應(yīng)用程序已經(jīng)被加載及初始化。
    void contextDestroyed(ServletContextEvent sce)
    通知正在接受的對(duì)象,應(yīng)用程序已經(jīng)被載出。

    ServletContextEvent中的方法:
    ServletContext getServletContext()
    取得ServletContext對(duì)象


    2.ServletContextAttributeListener:用于監(jiān)聽(tīng)WEB應(yīng)用屬性改變的事件,包括:增加屬性、刪除屬性、修改屬性,監(jiān)聽(tīng)器類需要實(shí)現(xiàn)javax.servlet.ServletContextAttributeListener接口。

    ServletContextAttributeListener接口方法:
    void attributeAdded(ServletContextAttributeEvent scab)
    若有對(duì)象加入Application的范圍,通知正在收聽(tīng)的對(duì)象
    void attributeRemoved(ServletContextAttributeEvent scab)
    若有對(duì)象從Application的范圍移除,通知正在收聽(tīng)的對(duì)象
    void attributeReplaced(ServletContextAttributeEvent scab)
    若在Application的范圍中,有對(duì)象取代另一個(gè)對(duì)象時(shí),通知正在收聽(tīng)的對(duì)象


    ServletContextAttributeEvent中的方法:
    java.lang.String getName()
    回傳屬性的名稱
    java.lang.Object getValue()
    回傳屬性的值

    二、HttpSession相關(guān)監(jiān)聽(tīng)接口
    1.HttpSessionBindingListener接口
    注意:HttpSessionBindingListener接口是唯一不需要再web.xml中設(shè)定的Listener

    當(dāng)我們的類實(shí)現(xiàn)了HttpSessionBindingListener接口后,只要對(duì)象加入Session范圍 (即調(diào)用HttpSession對(duì)象的setAttribute方法的時(shí)候)或從Session范圍中移出(即調(diào)用HttpSession對(duì)象的 removeAttribute方法的時(shí)候或Session Time out的時(shí)候)時(shí),容器分別會(huì)自動(dòng)調(diào)用下列兩個(gè)方法:
    void valueBound(HttpSessionBindingEvent event)
    void valueUnbound(HttpSessionBindingEvent event)

    思考:如何實(shí)現(xiàn)記錄網(wǎng)站的客戶登錄日志, 統(tǒng)計(jì)在線人數(shù)?

    2.HttpSessionAttributeListener接口
    HttpSessionAttributeListener監(jiān)聽(tīng)HttpSession中的屬性的操作。
    當(dāng) 在Session增加一個(gè)屬性時(shí),激發(fā)attributeAdded(HttpSessionBindingEvent se) 方法;當(dāng)在Session刪除一個(gè)屬性時(shí),激發(fā)attributeRemoved(HttpSessionBindingEvent se)方法;當(dāng)在Session屬性被重新設(shè)置時(shí),激發(fā)attributeReplaced(HttpSessionBindingEvent se) 方法。這和ServletContextAttributeListener比較類似。

    3.HttpSessionListener接口
    HttpSessionListener監(jiān)聽(tīng) HttpSession的操作。當(dāng)創(chuàng)建一個(gè)Session時(shí),激發(fā)session Created(HttpSessionEvent se)方法;當(dāng)銷毀一個(gè)Session時(shí),激發(fā)sessionDestroyed (HttpSessionEvent se)方法。

    4.HttpSessionActivationListener接口
    主要用于同一個(gè)Session轉(zhuǎn)移至不同的JVM的情形。

    請(qǐng)注意HttpSessionAttributeListener與HttpSessionBindingListener的區(qū)別:
    1.前者是需要在web.xml中進(jìn)行描述的,后者不需要。
    2.前者是在任何session的屬生變化時(shí)都會(huì)觸發(fā)執(zhí)行其方法中的代碼,而后者只是在實(shí)現(xiàn)它的對(duì)象被綁定到會(huì)話屬性或被從會(huì)話屬生中解除綁定時(shí),才會(huì)觸發(fā)執(zhí)行那個(gè)對(duì)象的valueBound和valueUnboundy這兩個(gè)方法的代碼。比如說(shuō)有兩個(gè)對(duì)象A和B都實(shí)現(xiàn)了HttpSessionBindingListener接口,當(dāng)A被綁定到會(huì)話屬性中時(shí),只是A的valueBound()方法被觸發(fā)執(zhí)行。


    三、ServletRequest監(jiān)聽(tīng)接口
    1.ServletRequestListener接口
    和ServletContextListener接口類似的,這里由ServletContext改為ServletRequest
    2.ServletRequestAttributeListener接口
    和ServletContextListener接口類似的,這里由ServletContext改為ServletRequest

      下面說(shuō)明如何在web.xml中布署事件監(jiān)聽(tīng)器以實(shí)現(xiàn)對(duì)事件的處理,格式如下:
    <listener>
      <listener-class> 
        fey.servlet.listener.CustomServletContextListener 
      </listener-class >  
    </listener>
      其中fey.servlet.listener.CustomServletContextListener是實(shí)現(xiàn)上述各事件監(jiān)聽(tīng)器接口的類名。當(dāng)然,你需要將這些類放入Web容器的Web應(yīng)用的classes或lib目錄下以讓W(xué)eb容器可以找到。
      另外說(shuō)明一點(diǎn),一個(gè)類可以一個(gè)或多個(gè)監(jiān)聽(tīng)器接口。

    有的listener可用于統(tǒng)計(jì)網(wǎng)站在線人數(shù)及訪問(wèn)量。 如下:

    服務(wù)器啟動(dòng)時(shí)(實(shí)現(xiàn)ServletContextListener監(jiān)聽(tīng)器contextInitialized方法),讀取數(shù)據(jù)庫(kù),并將其用一個(gè)計(jì)數(shù)變量保存在application范圍內(nèi)

    session創(chuàng)建時(shí)(實(shí)現(xiàn)HttpSessionListener監(jiān)聽(tīng)器sessionCreated方法),讀取計(jì)數(shù)變量加1并重新保存

    服務(wù)器關(guān)閉時(shí)(實(shí)現(xiàn)ServletContextListener監(jiān)聽(tīng)器contextDestroyed方法),更新數(shù)據(jù)庫(kù)

    簡(jiǎn)例一

    監(jiān)聽(tīng)用戶上線與退出,顯示在線用戶

    1、登陸頁(yè)面 Login.jsp

    <%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
    <%
    session=request.getSession(false);
    if(session!=null)session.invalidate();
    %>
    <html>
    <head><title></title></head>
    <body>
    <form action="isOnline.jsp" method="post">
    用戶名:<input type="text" name="uName"/>
    <input type="submit" value="上線">
    </form>
    </body>
    </html>

    2、控制頁(yè)面(只是為了說(shuō)明監(jiān)聽(tīng)器問(wèn)題,所以簡(jiǎn)單了點(diǎn)...) isOnline.jsp

    <%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
    <html>
    <head><title></title></head>
    <body>
    <%
    session=request.getSession();
    session.setAttribute("userName",request.getParameter("uName"));
    response.sendRedirect("showOnline.jsp");
    %>
    </body>
    </html>


    3、顯示頁(yè)面 showOnline.jsp

    <%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" import="java.util.ArrayList" %>
    <html>
    <head><title></title></head>
    <body>
    <%
    ArrayList showList=(ArrayList)(getServletContext().getAttribute("list"));
    out.print("在線人數(shù) "+showList.size()+"<br>");
    for(int i=0;i<showList.size();i++){
    out.print(showList.get(i)+"在線"+"<br>");
    }
    %>
    <br>
    <a href="Login.jsp">退出</a>
    </body>
    </html>

    4、配置頁(yè)面 web.xml

    <?xml version="1.0" encoding="gb2312"?>
    <!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "
    http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
    <listener>
        <listener-class>org.xiosu.listener.onlineListener</listener-class>
    </listener>
    </web-app>

    5、監(jiān)聽(tīng)器 onlineListener.java

    package org.xiosu.listener;

    import java.util.ArrayList;
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpSessionAttributeListener;
    import javax.servlet.http.HttpSessionBindingEvent;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;

    public class onlineListener implements HttpSessionListener,
    HttpSessionAttributeListener {
    // 參數(shù)
    ServletContext sc;
    ArrayList list = new ArrayList();
    // 新建一個(gè)session時(shí)觸發(fā)此操作
    public void sessionCreated(HttpSessionEvent se) {
    sc=se.getSession().getServletContext();
    System.out.println("新建一個(gè)session");
    }
    // 銷毀一個(gè)session時(shí)觸發(fā)此操作
    public void sessionDestroyed(HttpSessionEvent se) {
    System.out.println("銷毀一個(gè)session");
    if (!list.isEmpty()) {
       list.remove((String) se.getSession().getAttribute("userName"));
       sc.setAttribute("list", list);
    }
    }
    // 在session中添加對(duì)象時(shí)觸發(fā)此操作,在list中添加一個(gè)對(duì)象
    public void attributeAdded(HttpSessionBindingEvent sbe) {
    list.add((String) sbe.getValue());
    sc.setAttribute("list", list);
    }
    // 修改、刪除session中添加對(duì)象時(shí)觸發(fā)此操作
    public void attributeRemoved(HttpSessionBindingEvent arg0) {
    }
    public void attributeReplaced(HttpSessionBindingEvent arg0) {
    }
    }

    在Web開(kāi)發(fā)中關(guān)于監(jiān)聽(tīng)器的應(yīng)用
    首先,也要在web.xml配置文件中進(jìn)行聲明:
            在web.xml文件中的聲明如下:(聲明片斷)    要放在filter過(guò)濾器聲明和filter-mapping聲明后面
       
       <listener>
            <listener-class>markchen.web.listener.MySessionListener</listener-class>
        </listener>
        <listener>
             <listener-class>markchen.web.listener.MyServletContextListener</listener-class>
        </listener>


    //這兩個(gè)java類的內(nèi)容都和簡(jiǎn)單,僅僅是為了演示說(shuō)明而已

    //MySessionListener.java文件的內(nèi)容如下
         //Web應(yīng)用程序中會(huì)話的生命周期監(jiān)聽(tīng)器實(shí)現(xiàn)   
    package markchen.web.listener;

    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;

    public class MySessionListener implements HttpSessionListener {
       
        //在會(huì)話一創(chuàng)建時(shí)該方法被調(diào)用,可以在此處編寫自己需要做特殊處理的程序代碼
         public void sessionCreated(HttpSessionEvent event) {
                   
                      HttpSession session = event.getSession();       
                      String sessionId=session.getId();
                      System.out.println("Session::::::"+sessionId+"******Created******");
            }
           
         //在會(huì)話即將銷毀時(shí)該方法被調(diào)用,可以在此處編寫自己需要做特殊處理的程序代碼
         public void sessionDestroyed(HttpSessionEvent event) {
                   
                     HttpSession session = event.getSession();       
                     String sessionId=session.getId();
                     System.out.println("Session::::::"+sessionId+"******Destroyed******");
           
                    }       
    }
        
          注意:在sessionDestroyed()方法中一定不要再調(diào)用session.invalidate()方法了
                因?yàn)槊空{(diào)用一次session.invalidate()方法都會(huì)觸發(fā)sessionDestroyed()方法的調(diào)用
                 進(jìn)而形成死循環(huán),最終使Web應(yīng)用程序意外終止

          //MyServletContextListener.java
                //Web應(yīng)用程序的生命周期監(jiān)聽(tīng)器實(shí)現(xiàn)
    package markchen.web.listener;

    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;

    public class MyServletContextListener implements ServletContextListener {
           
             //在Web應(yīng)用程序初始化后該方法被調(diào)用
             public void contextInitialized(ServletContextEvent event) {
                  
                  System.out.println("******Application started******");               
             }
           
             //在Web應(yīng)用程序銷毀時(shí)該方法被調(diào)用
           public void contextDestroyed(ServletContextEvent event) {

                     System.out.println("******Application ended******");               
            }
    }

    posted @ 2009-04-08 10:07 筱 筱 閱讀(1565) | 評(píng)論 (0)編輯 收藏

    一,查看linux的ssh服務(wù)是否已經(jīng)啟動(dòng):service sshd status;
        如果沒(méi)有啟動(dòng)則執(zhí)行:service sshd start 或者 service sshd restart
    二,使linux防火墻開(kāi)啟22端口,因?yàn)閟sh是通過(guò)22端口提供服務(wù)的
        1.在/etc/sysconfig/iptables里添加

    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT


        2.重啟iptables

    [root@localhost ~]# /etc/init.d/iptables restart


        3.看下?tīng)顟B(tài)

    [root@localhost ~]# /etc/init.d/iptables status

    三,使用SSH Secure shell連接,選接連接方式為:password。

    四,OK

    posted @ 2009-03-28 21:56 筱 筱 閱讀(574) | 評(píng)論 (0)編輯 收藏

    redhat9下安裝VMware Tools

    下面是安裝步驟:
    1.啟動(dòng)Rad Hat 9.0(圖形界面方式登陸),并且以管理員的身份登陸。
    2.在VMware虛擬機(jī)的菜單中點(diǎn)擊:虛擬機(jī)->安裝VMware 工具->install。
    3.Red Hat 9.0自動(dòng)掛載VMware Tools的虛擬光驅(qū),并顯示在桌面。
    4.進(jìn)去VMware Tools的虛擬光驅(qū)里,把VMwareTools-5.5.1-19175.tar.gz復(fù)制到/tmp目錄。
    5.進(jìn)去/tmp目錄,把VMwareTools-5.5.1-19175.tar.gz解壓到當(dāng)前目錄下。
    6.打開(kāi)一個(gè)終端(shell),并以root身份登陸。
    7.輸入以下命令:cd /tmp/vmware-tools-distrib(進(jìn)入vmware-tools-distrib目錄)。
    8.輸入:./vmware-install.pl(執(zhí)行vmware-install.pl文件)。
    9.然后一路“回車”,就OK。
    10. 輸入reboot命令(重新啟動(dòng))。
    OK?。?!

    posted @ 2009-03-26 17:03 筱 筱 閱讀(125) | 評(píng)論 (0)編輯 收藏

      Web2.0時(shí)代,大家都一再?gòu)?qiáng)調(diào)互動(dòng)! 互動(dòng)! 互動(dòng)! 企業(yè)級(jí)網(wǎng)站需要與客戶溝通互動(dòng),所以我們之前介紹了10款免費(fèi)的網(wǎng)站在線客服系統(tǒng),個(gè)人站長(zhǎng)們也越來(lái)越追求互動(dòng),博客從一開(kāi)始就為互動(dòng)而生,好像不互動(dòng)就不像個(gè)博客似兒的.雖然本博早已厭倦互動(dòng),但還是為大家介紹10多款基于Web的網(wǎng)頁(yè)即時(shí)聊天程序.使用網(wǎng)頁(yè)即時(shí)聊天程序的好處就是,讓訪客能即時(shí)的和站長(zhǎng)或博客主溝通交流,形成良好的氛圍,甚至成為朋友.尤其對(duì)博客來(lái)說(shuō),能很好的增加穩(wěn)定的讀者群.

    注:下面的其中幾個(gè)程序并非標(biāo)準(zhǔn)的Web即時(shí)聊天程序,只能算留言本而已.但其實(shí)他能當(dāng)聊天程序用,只是少了”即時(shí)”…

    Plugoo

    plugoo不需要額外的帳號(hào),只需要你經(jīng)常使用的IM帳號(hào)即可(目前plugoo支持的IM 有: MSN Messenger/ Yahoo! Messenger/ GoogleTalk/ Jabber ),注冊(cè)成功以后系統(tǒng)會(huì)自動(dòng)添加 plugoo@plugoo.com為你IM的好友,同時(shí)生成一段代碼,掛在自己的網(wǎng)站上便可以直接于你網(wǎng)站的訪客進(jìn)行Web網(wǎng)頁(yè)即時(shí)聊天。via

    Hab.la

    一款十分高效且簡(jiǎn)潔的網(wǎng)頁(yè)即時(shí)聊天程序序,一段簡(jiǎn)單的Javascript代碼可以幫助你完善個(gè)人站點(diǎn)的客服系統(tǒng)。Hab.la 目前仍然是一款測(cè)試中的產(chǎn)品,他們提供了一整套高效的網(wǎng)頁(yè)客服解決方案。缺少了MSN、AIM、Y! Messenger等多款I(lǐng)M通信協(xié)議的支持外,Hab.la 幾乎同Plugoo實(shí)現(xiàn)的功能如出一轍——只需要在自己的站點(diǎn)中添加上一小段輕量級(jí)的Javascript代碼,便可以很輕松的幫助站長(zhǎng)和管理員來(lái)連接自己用戶和讀者,并建立相對(duì)比較完善的客服系統(tǒng)。目前,Hab.la 已經(jīng)能夠全面支持Jabber與Google Talk!via

    Chatback Badge

    Chatback Badge是Google Talk團(tuán)隊(duì)發(fā)布的一款很有意思的網(wǎng)頁(yè)即時(shí)聊天小工具,它可以在頁(yè)面上實(shí)時(shí)顯示你的GT在線狀態(tài)以及個(gè)性化簽名等信息;不僅如 此,Chatback 還是一款可以即時(shí)引導(dǎo)用戶進(jìn)入Google Talk 網(wǎng)頁(yè)版 Badge進(jìn)行實(shí)時(shí)交流狀態(tài)的擴(kuò)展,這樣,你的訪客便可以借助網(wǎng)頁(yè)版GT和你的客戶端GTalk進(jìn)行即時(shí)聊天了,簡(jiǎn)單而快捷,你的讀者甚至不需要獨(dú)立的 GTalk帳戶也能夠輕松和你交流。via

    TocPlus

    TocPlus是讓您直接與網(wǎng)上商城、博客、網(wǎng)頁(yè)的訪客進(jìn)行實(shí)時(shí)對(duì)話的通訊系統(tǒng)。如果將TocPlus的服務(wù)適用于網(wǎng)上商城,就如地面商城可以向顧客直接推薦合適的商品或即時(shí)回答顧客所提出的咨詢,因此可提高營(yíng)業(yè)效益。TocPlus的所有服務(wù)為免費(fèi)。

    vawkr

    一個(gè)即時(shí)的視頻聊天服務(wù),通常我們需要使用同一種IM即時(shí)聊天工具,才能實(shí)現(xiàn)和別人視頻聊天,但是通過(guò)vawkr,只要雙方都有攝像頭,那么無(wú)需下載任何 IM工具,雙方都可進(jìn)行視頻聊天,你可以創(chuàng)建一個(gè)永久的聊天室,然后得到一個(gè)url地址,將這個(gè)地址發(fā)給你要邀請(qǐng)的人,當(dāng)他點(diǎn)擊進(jìn)入后,如果允許 vawkr使用其攝像頭和麥克風(fēng),那么你們就可以進(jìn)行視頻聊天了,vawkr還支持將聊天室放在MySpace 、Facebook、 blog 或者web上。via

    -以下5個(gè)來(lái)自web20share

    Gabbly

    可 以在瀏覽器,網(wǎng)頁(yè)中嵌入聊天系統(tǒng),可以自定義用戶名,顯示在線訪問(wèn)人數(shù),訪客登陸/離開(kāi)網(wǎng)站提示(可以選擇關(guān)閉),訪客登陸提示音(可以選擇關(guān)閉),所有 聊天記錄都可以被RSS訂閱保存。Gabbly還有一個(gè)功能,任何一個(gè)網(wǎng)頁(yè),即便沒(méi)有裝Gabbly 在線聊天器,你只要在網(wǎng)址前加上’gabbly.com/’,如gabbly.com/hopesome.com,就可以和同在這個(gè)頁(yè)面的人即時(shí)聊天。

    Blobber

    功能和Gabbly類似,需要注冊(cè)。

    Woocall

    新浪推出的服務(wù),和新浪網(wǎng)頁(yè)上的差不多。需要郵件申請(qǐng),感覺(jué)用戶的可定制性不是很強(qiáng).

    MeeboMe
    作 為一個(gè)可以嵌入website/blog的flash widget,本身并不突出,但是當(dāng)它和Meebo結(jié)合起來(lái)之后,任何人都會(huì)覺(jué)得眼前一亮!換句簡(jiǎn)單點(diǎn)的話說(shuō),登錄Meebo之后,你不僅可以同時(shí)和 MSN、Y!M、Jabber/Gtalk以及AIM中的聯(lián)系人進(jìn)行交流,而且還能實(shí)時(shí)地和你的website/blog上的讀者進(jìn)行交流,而這一切都在 你的瀏覽器頁(yè)面中完成.

    Cbox-blog
    Cbox-更像是一個(gè)可以嵌入到blog中的留言本服務(wù),使用非常簡(jiǎn)單方便,通過(guò)調(diào)用一段代碼就可插入到blog中。并且還可以自定義大小和顏色樣式等,以便符合自已的blog風(fēng)絡(luò)。

    Twitterchat

    通過(guò)twitter也可以做個(gè)簡(jiǎn)單的聊天室. 你必須有個(gè)twitter帳號(hào),然后在 twitterchat.com注冊(cè)一個(gè)帳號(hào),需要用twitter的用戶名及密碼,郵箱填自己的隨便一個(gè).注冊(cè)后會(huì)得到一段代碼,可以自己修改聊天窗口寬和高。然后掛在自己上的blog 即可。via

    chirrup

    Chirrup是一個(gè)基于twitter的簡(jiǎn)單的評(píng)論/留言系統(tǒng),可以很方便地加入到自己blog/wiki/Web中。如果你的blog或者其他web沒(méi)有評(píng)論或者留言本系統(tǒng),除了以前介紹的js-kit外,chirrup也是一個(gè)不錯(cuò)的選擇,在twitter“大行其道”的網(wǎng)絡(luò)時(shí)代,所謂“鳥(niǎo)隨鸞鳳飛騰遠(yuǎn),人伴賢良品質(zhì)高”,安裝一個(gè)基于twitter的留言或評(píng)論系統(tǒng),對(duì)提高blog的流量、人氣等等也是很有幫助的。使用方法

    Aimboo

    是一個(gè)類似于Plugoo的 即時(shí)通訊服務(wù),可通過(guò)代碼調(diào)用放置一個(gè)聊天窗口在你的Blog上,并與你的本地IM軟件連接,這樣當(dāng)你的讀者訪問(wèn)你的Blog時(shí),就可以與你及時(shí)聯(lián)絡(luò)了, 目前 Aimboo支持Jabber、Gtalk、MSN、AIM及ICQ等常用的IM協(xié)議。

    posted @ 2009-03-24 11:33 筱 筱 閱讀(2871) | 評(píng)論 (0)編輯 收藏

    FTPClient client = new FTPClient();
      client.connect("ip地址", 21);
      client.login("用戶名", "密碼");
      client.setSoTimeout(5000);//設(shè)置連接超時(shí)時(shí)間為5000毫秒
      // 在嘗試連接以后,你應(yīng)該檢查返回碼驗(yàn)證是否連接成功!
      int reply = client.getReplyCode();
      if (!FTPReply.isPositiveCompletion(reply)) {
       client.disconnect();
       System.err.println("FTP 服務(wù)器拒絕連接.");
       System.exit(1);
      }
      System.out.println("連接正在建立中......");
      if (client.isConnected()) {
       System.out.println("連接已建立!");
       client.setControlEncoding("gb2312");// 設(shè)置編碼方式,默認(rèn)編碼方式為:ISO8859-1
       client.changeWorkingDirectory("archives");// 改變當(dāng)前ftp的工作目錄
       // client.changeToParentDirectory();//回到上級(jí)目錄
       FTPFile[] fs = client.listFiles(); // 得到當(dāng)前工作目錄下的所有文件
       for (FTPFile ff : fs) {
        if (ff.getName().equals("test.txt")) {
         File file = new File("E:\\ftpdata" + File.separator
           + "test.txt");
         RandomAccessFile rfile = new RandomAccessFile(file, "rw");// 隨機(jī)訪問(wèn)文件類
         long offset = rfile.length();
         client.setRestartOffset(offset);
         rfile.seek(offset);
         InputStream input = client
           .retrieveFileStream("test.txt");
         byte[] data = new byte[1024];
         System.out.println(new Date() + " 數(shù)據(jù)寫入中...");
         while (input.read(data) != -1) {
          rfile.write(data);
         }
         System.out.println(new Date() + " 所有數(shù)據(jù)已接受完成!");
         input.close();
         rfile.close();
        }
       }
      }
      client.logout();
      client.disconnect();
    posted @ 2009-03-20 11:20 筱 筱 閱讀(1914) | 評(píng)論 (0)編輯 收藏

    基本步驟:
        1,創(chuàng)建連接
        2,登錄
        3,上傳或下載文件
        4,退出
        5,斷開(kāi)連接
    常用方法:
        void setControlEncoding(String encoding):設(shè)置FTP控制連接的編碼方式(默認(rèn)讀取中文文件名時(shí)為亂碼)
        boolean changeWorkingDirectory(String pathname):設(shè)置當(dāng)前的工作目錄
        boolean changeToParentDirectory():返回上級(jí)目錄
        void setRestartOffset(long offset):設(shè)置重新啟動(dòng)的偏移量(用于斷點(diǎn)續(xù)傳)
    下載文件:
        boolean retrieveFile(String,remote,OutputStream local):從服務(wù)器返回指定名稱的文件并且寫入到OuputStream,以便寫入到文件或其它地方。
        InputStream retrieveFileStream(String remote):從服務(wù)器返回指定名稱的文件的InputStream以便讀取。
    上傳文件:
        boolean storeFile(String remote,InputStream local):利用給定的名字(remote)和輸入流(InputStream)向服務(wù)器上傳一個(gè)文件。
        OutputStream storeFileStream(String remote):根據(jù)給定的名字返回一個(gè)能夠向服務(wù)器上傳文件的OutputStream。
        boolean storeUniqueFile(InputStream local):根據(jù)服務(wù)器自己指定的唯一的名字和輸入流InputStream向服務(wù)器上傳一個(gè)文件。
        boolean storeUniqueFile(String remote,InputStream local):根據(jù)指定的名字和輸入流InputStream向服務(wù)器上傳一個(gè)文件。
        OuputStream storeUniqueFileStream():返回一個(gè)輸出流OutputStream,以便向服務(wù)器寫入一個(gè)文件,該文件由服務(wù)器自己命名。
        OutputStream storeUniqueFileStream(String remote):返回一個(gè)輸出流OutputStream,以便向服務(wù)器寫入一個(gè)文件,該文件由用戶自己指定。

    posted @ 2009-03-20 10:57 筱 筱 閱讀(496) | 評(píng)論 (0)編輯 收藏

        OutputStream os=new FileOutputStream("");
      OutputStreamWriter osr=new OutputStreamWriter(os);
      BufferedWriter bw=new BufferedWriter(osr);
        
        InputStream is = new FileInputStream("");
      InputStreamReader isr=new InputStreamReader(is);
      BufferedReader br=new BufferedReader(isr);

        
    posted @ 2009-03-19 09:47 筱 筱 閱讀(566) | 評(píng)論 (0)編輯 收藏

    oracle占領(lǐng)http8080端口的問(wèn)題最近得以解決
    最簡(jiǎn)單的一種:
    登錄oracle enterprise manager console 選擇獨(dú)立登錄,選擇xml數(shù)據(jù)庫(kù),配置,直接修改http-port就ok了!
    posted @ 2009-03-13 14:59 筱 筱 閱讀(294) | 評(píng)論 (0)編輯 收藏

    posted @ 2009-03-12 10:37 筱 筱 閱讀(194) | 評(píng)論 (0)編輯 收藏

    Hibernate支持第三方的連接池,官方推薦的連接池是C3P0,Proxool,以及DBCP。在配置連接池時(shí)需要注意的有三點(diǎn):
      一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已經(jīng)不再推薦使用,官方的解釋是這個(gè)連接池存在缺陷。如果你因?yàn)槟撤N原因需要在Hibernate3中使用DBCP,建議采用JNDI方式。
      二、默認(rèn)情況下(即沒(méi)有配置連接池的情況下),Hibernate會(huì)采用內(nèi)建的連接池。但這個(gè)連接池性能不佳,且存在諸多BUG,因此官方也只是建議僅在開(kāi)發(fā)環(huán)境下使用。
      三、Hibernate2和Hibernate3的命名空間有所變化。例如,配置C3P0時(shí)的provider_class有Hibernate2環(huán)境下使用net.sf.hibernate.connection.C3P0ConnectionProvider,在Hibernate3環(huán)境下使用org.hibernate.connection.C3P0ConnectionProvider。
      下面是Hibernate環(huán)境下幾種常見(jiàn)的連接池配置,都是以連接MySQl為例。
      <!-- JDBC驅(qū)動(dòng)程序 -->
      <property name="connection.driver_class">org.gjt.mm.mysql.Driver</property>
      <property name="connection.url">jdbc:mysql://localhost:3306/struts?useUnicode=true
      & characterEncoding=GBK</property>
      <!-- 數(shù)據(jù)庫(kù)用戶名 -->
      <property name="connection.username">root</property>
      <!-- 數(shù)據(jù)庫(kù)密碼 -->
      <property name="connection.password">8888</property>
      上面的一段配置,在c3p0和dbcp中,都是必需的,因?yàn)閔ibernate會(huì)根據(jù)上述的配置來(lái)生成connections,再交給c3p0或dbcp管理。但是proxool則不能,可以讓proxool自身來(lái)生成連接,這在下面再講。
      從網(wǎng)上google了一下,發(fā)現(xiàn)大致有三種可以實(shí)施的解決方案:
      1、使用hibernate自帶的連接池;
      2、使用c3po包的連接池功能;
      3、使用dbcp包的連接池功能;
      4、使用Proxool包的連接池功能;
            5、使用JNDI連接池
      第一種方案,Hibernate默認(rèn)連接池,就是在myeclipse產(chǎn)生的hibernate.cfg.xml中添加一個(gè)屬性:
      <property name="connection.pool_size">20</property>
      第二種方案是:C3P0
      只需在hibernate.cfg.xml中加入
      <property name="c3p0.min_size">2</property>
      <property name="c3p0.max_size">10</property>
      <property name="c3p0.timeout">1800</property>
      <property name="c3p0.acquireRetryAttempts">4</property>
      <property name="c3p0.acquireIncrement">1</property>
      <property name="c3p0.idleConnectionTestPeriod">36000</property>
      <property name="c3p0.initialPoolSize">2</property>
      <property name="c3p0.maxPoolSize">10</property>
      <property name="c3p0.maxIdleTime">1200</property>
      <property name="c3p0.maxStatements">30</property>
      <property name="c3p0.minPoolSize">2</property>
      <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
      還有在classespath中加入c3p0-0.8.4.5.jar
      第三種方案是:dbcp
      在hibernate.cfg.xml中加入
      <property name="dbcp.maxActive">100</property>
      <property name="dbcp.whenExhaustedAction">1</property>
      <property name="dbcp.maxWait">60000</property>
      <property name="dbcp.maxIdle">10</property>
      <property name="dbcp.ps.maxActive">100</property>
      <property name="dbcp.ps.whenExhaustedAction">1</property>
      <property name="dbcp.ps.maxWait">60000</property>
      <property name="dbcp.ps.maxIdle">10</property>
      還有在classespath中加入commons-pool-1.2.jar 和commons-dbcp-1.2.1.jar.
      第四種方案是:Proxool
      建立一個(gè)Proxool.xml文件:
      <?xml version="1.0" encoding="UTF-8"?>
      <!-- the proxool configuration can be embedded within your own application’s.
      Anything outside the "proxool" tag is ignored. -->
      <something-else-entirely>
      <proxool>
      <alias>
      mysql
      </alias>
      <driver-url>
      jdbc:mysql://localhost:3306/jackdemo
      </driver-url>
      <driver-class>
      com.mysql.jdbc.Driver
      </driver-class>
      <driver-properties>
      <property name="user" value="root" />
      <property name="password" value="jack" />
      </driver-properties>
      <house-keeping-sleep-time>
      60000
      </house-keeping-sleep-time>
      <proxool.simultaneous-build-throttle>
      100
      </proxool.simultaneous-build-throttle>
      <prototype-count>
      2
      </prototype-count>
      <maximum-connection-count>
      100
      </maximum-connection-count>
      <minimum-connection-count>
      10
      </minimum-connection-count>
      </proxool>
      </something-else-entirely>
      現(xiàn)在來(lái)看下配置的意思:
      <alias>配置連接池的別名;
      <driver-url>和寫JDBC連接數(shù)據(jù)庫(kù)時(shí)的URL一樣。
      <driver-class>和寫JDBC連接數(shù)據(jù)庫(kù)時(shí)的Driver一樣。
      <driver-properies>就是連接數(shù)據(jù)庫(kù)時(shí)的用戶名和密碼。
      <house-keeping-sleep-time>proxool自動(dòng)偵察各個(gè)連接狀態(tài)的時(shí)間間隔(毫秒),偵察到空閑的連接就馬上回收,超時(shí)的銷毀
      <prototype-count>最少保持的空閑連接數(shù)
      <maximum-connection-count>最大連接數(shù)。
      <minimum-connection-count>最小連接數(shù)。
      以下是在Hibernate配置文件中對(duì)連接池的配置:
      <?xml version=’1.0’ encoding=’UTF-8’?>
      <!DOCTYPE hibernate-configuration PUBLIC
      "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
      "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
      <hibernate-configuration>
      <session-factory>
      <!-- proxool連接池加載的類-->
      <property name="hibernate.connection.provider_class">
      org.hibernate.connection.ProxoolConnectionProvider
      </property>
      <!--連接池的別名,即配置連接池時(shí)起的別名-->
      <property name="hibernate.proxool.pool_alias">
      mysql
      </property>
      <!--連接池文件的地址-->
      <property name="hibernate.proxool.xml">
      config/proxool/proxool.xml
      </property>
      <!--是否將運(yùn)行期生成的SQL輸出到日志以供調(diào)試-->
      <property name="show_sql">true</property>
      <mapping resource="com/jack/ssh/demo/bo/City.hbm.xml" />
      <mapping resource="com/jack/ssh/demo/bo/Province.hbm.xml" />
      </session-factory>
      </hibernate-configuration>
      第五種方案是:JNDI連接池。數(shù)據(jù)源已經(jīng)由應(yīng)用服務(wù)配置好(如Web服務(wù)器),Hibernate需要做的只是通過(guò)JNDI名查找到此數(shù)據(jù)源。應(yīng)用服務(wù)器將連接池對(duì)外顯示為JNDI綁定數(shù)據(jù)源,它是javax.jdbc.Datasource類的一個(gè)實(shí)例。只要配置一個(gè)Hibernate文件,如:
      hibernate.connection.datasource = java:/comp/env/jdbc/portal //JNDI名
      hibernate.transaction.factory_class = org.hibernate.transaction.JTATransactionFactory
      hibernate.transaction.manager_loopup_class = org.hibernate.transaction.JBossTransactionManagerLookup
      hibernate.dialect = org.hibernate.dialect.MySQLDialect。
    posted @ 2009-03-10 09:23 筱 筱 閱讀(481) | 評(píng)論 (0)編輯 收藏

    Name Lession Mark
    Amy Chinese 89
    Amy Math 59
    Amy History 87
    Amy Japanese 77
    Alan Math 54
    Alan Chinese 83
    Alan History 86
    Alan Japanese 76
    Bruce History 83
    Bruce Math 58
    Bruce Japanese 82
    Alisa Math 59


    1. 請(qǐng)查詢出學(xué)生出姓名mark<60
    2. 請(qǐng)查詢每門學(xué)科中存在有一門不及格的學(xué)生姓名
    3. 請(qǐng)查詢出各科總分排行前三名的學(xué)生姓名和成績(jī)(包含并列)
    4. 請(qǐng)查詢出每門科目中前三名的學(xué)生姓名和科目(包含并列的)




    posted @ 2009-02-25 20:32 筱 筱 閱讀(240) | 評(píng)論 (0)編輯 收藏

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id=scriptmain name=scriptmain codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="560" height="176">
           <param name="movie" value="/images/bcastr.swf?bcastr_xml_url=/pages/web/xml/bcastr.xml" />
           <param name="quality" value="high" />
           <param name=scale value=noscale />
           <param name="LOOP" value="false" />
           <param name="menu" value="false" />
           <param name="wmode" value="transparent" />
           <embed src="/images/bcastr.swf?bcastr_xml_url=/pages/web/xml/bcastr.xml" width="560" height="176" loop="false" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" salign="T" name="scriptmain" menu="false" wmode="transparent"></embed>
    </object>

    <?xml version="1.0" encoding="utf-8"?>
    <bcaster autoPlayTime="5">
    <item item_url="flash圖片" link="鏈接路徑" >
    </item>
    <item item_url="flash圖片" link="鏈接路徑" >
    </item>
    </bcaster>
    posted @ 2009-02-17 09:36 筱 筱 閱讀(162) | 評(píng)論 (0)編輯 收藏

    困擾我多年的sql語(yǔ)句執(zhí)行順序今天終于在網(wǎng)上找到了
    1. 先where 后select
    2. 先where 再group 再having 后select
    3. 先where 再group 再having 再order 后select
    4. 先join 再where 后select
    例:select top 3 name from student group by name order by sum(mark) desc
        (查詢班上總分排名前三的學(xué)生姓名)
    開(kāi)心啦,開(kāi)心!
    posted @ 2009-02-03 16:31 筱 筱 閱讀(264) | 評(píng)論 (0)編輯 收藏

    1,load()方法從來(lái)就是假定數(shù)據(jù)在數(shù)據(jù)庫(kù)中是存在的,在使用時(shí)如果不存在則會(huì)拋出ObjectNotFoundException;而get()方法不會(huì)假定數(shù)據(jù)在數(shù)據(jù)庫(kù)中存在,如果不存在則返回null
    2,load()方法返回的是實(shí)體類的代理類,因此load()可以使用延遲加載策略來(lái)加載對(duì)象
          get()方法返回的不一定是實(shí)體類,可能是代理類,因?yàn)間et()方法如果在session緩存(一級(jí)緩存)中找到了該id對(duì)應(yīng)的對(duì)象,如果剛好該對(duì)象前面是被代理過(guò)的,如被load方法使用過(guò),或者被其他關(guān)聯(lián)對(duì)象延遲加載過(guò),那么返回的還是原先的代理對(duì)象,而不是實(shí)體類對(duì)象。
    3,load()方法查詢數(shù)據(jù)時(shí)會(huì)先從session緩存(一級(jí)緩存)中查找,如果沒(méi)有找到則會(huì)創(chuàng)建代理類,該代理類僅僅初始化了OID屬性,當(dāng)?shù)谝淮卧L問(wèn)其他屬性值時(shí),則會(huì)依次從二級(jí)緩存-->數(shù)據(jù)庫(kù)查找,直到找到數(shù)據(jù),最后將所有屬性值賦給代理類。而get()方法則會(huì)直接按照一級(jí)緩存-->二級(jí)緩存-->數(shù)據(jù)庫(kù)的順序查找。

    看到網(wǎng)上的全都是復(fù)制的,而且錯(cuò)誤不少,怎么就沒(méi)有人修正一下呢?
    posted @ 2009-01-22 10:29 筱 筱 閱讀(484) | 評(píng)論 (0)編輯 收藏

    HTTP頭中一般斷點(diǎn)下載時(shí)才用到Range和Content-Range實(shí)體頭,
    Range用戶請(qǐng)求頭中,指定第一個(gè)字節(jié)的位置和最后一個(gè)字節(jié)的位置,如(Range:200-300)
    Content-Range用于響應(yīng)頭

    請(qǐng)求下載整個(gè)文件:
    ***********************************
    GET  /test.rar  HTTP/1.1
    Connection:  close
    Host:  116.1.219.219
    Range:  bytes=0-100
    ***********************************
    Range頭域可以請(qǐng)求實(shí)體的一個(gè)或者多個(gè)子范圍,Range的值為0表示第一個(gè)字節(jié),也就是Range計(jì)算字節(jié)數(shù)是從0開(kāi)始的
    表示頭500個(gè)字節(jié):bytes=0-499
    表示第二個(gè)500字節(jié):bytes=500-999
    表示最后500個(gè)字節(jié):bytes=-500
    表示500字節(jié)以后的范圍:bytes=500-
    第一個(gè)和最后一個(gè)字節(jié):bytes=0-0,-1
    同時(shí)指定幾個(gè)范圍:bytes=500-600,601-999


    一般正?;貞?yīng)
    ***********************************
    HTTP/1.1 206 OK
    Content-Length:  801     
    Content-Type:  application/octet-stream 
    Content-Location: http://www.onlinedown.net/hj_index.htm
    Content-Range:  bytes  0-100/2350 //2350:文件總大小
    Last-Modified: Mon, 16 Feb 2009 16:10:12 GMT
    Accept-Ranges: bytes
    ETag: "d67a4bc5190c91:512"
    Server: Microsoft-IIS/6.0
    Date: Wed, 18 Feb 2009 07:55:26 GMT
    ***********************************

    注意:如果用戶的請(qǐng)求中含有range ,則服務(wù)器的相應(yīng)代碼為206。
    206 - Partial Content 客戶發(fā)送了一個(gè)帶有Range頭的GET請(qǐng)求,服務(wù)器完成了它(HTTP 1.1新)。
    posted @ 2009-01-21 17:48 筱 筱 閱讀(4362) | 評(píng)論 (0)編輯 收藏

            最近我們公司的jsp網(wǎng)站要和另一家公司的asp網(wǎng)站做通訊,之間通過(guò)xml傳遞信息
            現(xiàn)假如我們公司是A,對(duì)方公司是B,如果A發(fā)送一條信息給B,B必須反饋一條信息表示是否執(zhí)行成功。這里有兩種模式可以使用,
        第一:A、B把對(duì)方都當(dāng)做服務(wù)器進(jìn)行消息發(fā)送
        第二:A相當(dāng)于瀏覽器、B相當(dāng)于服務(wù)器,A發(fā)送一個(gè)消息給B,B直接返回給A信息。
        下面我們來(lái)看看這兩種方式分別怎么實(shí)現(xiàn)?
        第一種:
            1、A(a.jsp)的代碼:
            StringBuffer sb=new StringBuffer("<?xml version=\"1.0\" encoding=\"GBK\"?>");
            sb.append("<User>");
            sb.append("<HEAD>");
            sb.append("<SUCCESS></SUCCESS>");
            sb.append("</HEAD>");
            sb.append("<BODY>");
            sb.append("<MOBILE></MOBILE>");
            sb.append("<NAME></NAME>");
            sb.append("<SEX></SEX>");
            sb.append("</BODY>");
            sb.append("</User>");
            URL url = new URL("B服務(wù)器的接收路徑");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestProperty("Content-Type", "text/xml;charset=gbk");
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Length", String.valueOf(xml.length()));
            conn.setConnectTimeout(5000);
            conn.setDoOutput(true);
            OutputStream os = conn.getOutputStream();
            os.write(sb.toString().getBytes());
            os.flush();
            os.close();
            2、B服務(wù)器接收到A的請(qǐng)求后,也以類似于1(當(dāng)然asp中的代碼我不知道怎么寫)將反饋信息發(fā)送到A的指定路徑(b.jsp)
            3、A(b.jsp)接收B的反饋信息:
                InputStream is=request.getInputStream();
        第二種:
            1、A(a.jsp)的代碼
                StringBuffer sb=new StringBuffer("<?xml version=\"1.0\" encoding=\"GBK\"?>");
                sb.append("<User>");
                sb.append("<HEAD>");
                sb.append("<SUCCESS></SUCCESS>");
                sb.append("</HEAD>");
                sb.append("<BODY>");
                sb.append("<MOBILE></MOBILE>");
                sb.append("<NAME></NAME>");
                sb.append("<SEX></SEX>");
                sb.append("</BODY>");
                sb.append("</User>");
                URL url = new URL("B服務(wù)器的接收路徑");
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestProperty("Content-Type", "text/xml;charset=gbk");
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Content-Length", String.valueOf(xml.length()));
                conn.setConnectTimeout(5000);
                conn.setDoOutput(true);
                OutputStream os = conn.getOutputStream();
                os.write(sb.toString().getBytes());
                os.flush();
                os.close();
            2、B接收到A(a.jsp)服務(wù)器的代碼后用
                    byte[] byts = new byte[Request.InputStream.Length];
                 Request.InputStream.Read(byts,
    0,byts.Length);
                    
    然后用Response.OutputStream.write()返回信息
            3、A(a.jsp)接收B服務(wù)器的反饋信息(和1的代碼同在a.jsp中,并且就接著1代碼的后面)
                   if(conn.getResponseCode()==200){
                       String line=null;
                       String body="";
                       is = conn.getInputStream();
                       BufferedReader br = new BufferedReader(new InputStreamReader(is));
                       while ((line = br.readLine()) != null) {
                            body += line;
                       }
                       conn.disconnect();
                  }
            其中訪問(wèn)一個(gè)頁(yè)面主要用到了HttpURLConnection這個(gè)類,當(dāng)然還有其它幾種方式可以使用,具體請(qǐng)參見(jiàn)我的文章http://www.tkk7.com/vickzhu/archive/2008/11/12/240013.html
    posted @ 2009-01-04 14:57 筱 筱 閱讀(1045) | 評(píng)論 (1)編輯 收藏

    錯(cuò)誤代碼:
    org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
    錯(cuò)誤原因:
    OpenSessionInViewFilter在getSession的時(shí)候,會(huì)把獲取回來(lái)的session的flush mode 設(shè)為FlushMode.NEVER。然后把該sessionFactory綁定到TransactionSynchronizationManager,使request的整個(gè)過(guò)程都使用同一個(gè)session,在請(qǐng)求過(guò)后再解除該sessionFactory的綁定,最后closeSessionIfNecessary根據(jù)該session是否已和transaction綁定來(lái)決定是否關(guān)閉session。在這個(gè)過(guò)程中,若HibernateTemplate 發(fā)現(xiàn)自當(dāng)前session有不是readOnly的transaction,就會(huì)獲取到FlushMode.AUTO Session,使方法擁有寫權(quán)限。
    也即是,如果有不是readOnly的transaction就可以由Flush.NEVER轉(zhuǎn)為Flush.AUTO,擁有insert,update,delete操作權(quán)限,如果沒(méi)有transaction,并且沒(méi)有另外人為地設(shè)flush model的話,則doFilter的整個(gè)過(guò)程都是Flush.NEVER。所以受transaction保護(hù)的方法有寫權(quán)限,沒(méi)受保護(hù)的則沒(méi)有。
    參考文章:
    http://calvin.blog.javascud.org/post/46.htm
    解決辦法:
    采用spring的事務(wù)聲明,使方法受transaction控制
    <bean id="baseTransaction"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
    abstract="true">
    <property name="transactionManager" ref="transactionManager"/>
    <property name="proxyTargetClass" value="true"/>
    <property name="transactionAttributes">
    <props>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="save*">PROPAGATION_REQUIRED</prop>
    <prop key="add*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="remove*">PROPAGATION_REQUIRED</prop>
    </props>
    </property>
    </bean>
        <bean id="userService" parent="baseTransaction">
    <property name="target">
    <bean class="com.phopesoft.security.service.impl.UserServiceImpl"/>
    </property>
    </bean>

    posted @ 2008-12-11 11:20 筱 筱 閱讀(441) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 国产 亚洲 中文在线 字幕| 免费特级黄毛片在线成人观看| 久久精品国产96精品亚洲 | 成人午夜免费福利视频| 精品亚洲成a人片在线观看少妇| 国产va在线观看免费| 久久精品国产亚洲AV网站| 久久国产免费一区二区三区| 亚洲一区二区三区电影| 亚洲免费精彩视频在线观看| 亚洲一区二区影院| 亚洲网站免费观看| 亚洲一区二区三区深夜天堂 | 日韩精品无码免费专区网站| 情人伊人久久综合亚洲| 免费黄网站在线看| 精品无码一区二区三区亚洲桃色| 亚洲香蕉免费有线视频| 亚洲一区二区三区高清视频| 大地资源二在线观看免费高清| 亚洲色大成网站www久久九| 全免费一级毛片在线播放| 丰满亚洲大尺度无码无码专线 | 91午夜精品亚洲一区二区三区| 免费看美女裸露无档网站| 亚洲欧美熟妇综合久久久久| 国产精品成人免费综合| 免费人成网站永久| 区久久AAA片69亚洲| 日韩视频免费在线观看| 亚洲精品国产福利在线观看| 青青久在线视频免费观看| 亚洲AV无码一区二区一二区 | 天天摸天天操免费播放小视频| 久久久久亚洲国产AV麻豆| 亚洲色欲久久久久综合网| 成人无码a级毛片免费| 亚洲国产成人精品无码区在线秒播| 国产精品成人免费一区二区| 国产成人亚洲毛片| 亚洲综合另类小说色区|