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

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

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

    vickzhu

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      151 隨筆 :: 0 文章 :: 34 評論 :: 0 Trackbacks

    2009年1月22日 #

    ##通用查詢日志:記錄建立的客戶端連接和執行的語句
    ##慢查詢日志:記錄所有執行時間超過long_query_time值的所有查詢或者不使用索引的查詢
    ##查看數據庫版本
    SHOW VARIABLES LIKE '%version%';
    ##查看通用查詢日志
    SHOW VARIABLES LIKE '%general%';
    ##設置通用查詢日志為開啟
    SET GLOBAL general_log=ON;
    ##設置通用查詢日志為關閉
    SET GLOBAL general_log=OFF;
    ##查看當前慢查詢日志輸出的格式,可以是FILE(存儲在數數據庫的數據文件中的hostname.log),也可以是TABLE(存儲在數據庫中的mysql.general_log)
    SHOW VARIABLES LIKE '%log_output%';
    ##設置查詢日志輸出到文件
    SET GLOBAL log_output='file';
    ##設置慢查詢日志保存的文件
    SET GLOBAL slow_query_log_file="/var/lib/mysql/localhost-slow.log";
    ##查看慢查詢相關設置
    SHOW VARIABLES LIKE '%slow_query%';
    ##設置慢查詢閾值為1,默認為10
    SET GLOBAL long_query_time=1;
    ##設置慢查詢閾值為10,默認為10
    SET GLOBAL long_query_time=10;
    ##查看慢查詢的閾值
    SHOW GLOBAL VARIABLES LIKE '%long_query_time%';
    ##查看有多少慢查詢
    SHOW GLOBAL STATUS LIKE '%Slow_queries%';
    ##睡眠11秒,測試慢查詢
    ##select SLEEP(11);
    posted @ 2018-10-09 16:59 筱 筱 閱讀(181) | 評論 (0)編輯 收藏

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

    1、達到默認最大buffer size
    2、調用HttpServletResponse.flushBuffer()
    3、調用HttpServletResponse.getOutputStream().flush()或者HttpServletResponse.getWriter().flush()
    4、調用HttpServletResponse.sendError()或者HttpServletResponse.sendRedirect()
    posted @ 2014-07-23 13:11 筱 筱 閱讀(5902) | 評論 (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) | 評論 (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 筱 筱 閱讀(7034) | 評論 (0)編輯 收藏

    uml
    1. 類圖之間的關系
    2. 依賴和關聯關系:
      依賴:是類與類之間的連接,表示一個類依賴于另一個類的定義。例如如果A依賴于B,則B體現為局部變量,方法的參數、或靜態方法的調用。 
      關聯:類與類之間的聯接,它使一個類知道另一個類的屬性和方法, 具體表現為類的成員變量中包含某個對象 

      組合和聚合:
      在有整體和部分關系是才有組合和聚合的概念,屬于關聯關系
      組合:部分離開整體不能存在
      聚合:部分可以離開整體而存在

    3. 用例圖之間的關系:
    4. 包含、泛化、擴展
      包含:當兩個或多個用例中共用一組相同的動作,這時可以將這組相同的動作抽出來作為一個獨立的子用例,供多個基用例所共享。因為子用例被抽出,基用例并非一個完整的用例,所以include關系中的基用例必須和子用例一起使用才夠完整,子用例也必然被執行 
      泛化:繼承關系,子用例將繼承基用例的所有行為 ,也就是說在任何使用基用例的地方都可以用子用例來代替。領導擁有審批的權限,而請假申請審批、加班申請審批都是審批的子類
      擴展:對基用例的擴展,基用例是一個完整的用例,即使沒有子用例的參與,也可以完成一個完整的功能。 

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

    學習osworkflow
    http://my.so-net.net.tw/idealist/OSWorkflow/
     

    wfentry表中的state字段來自于接口WorkflowEntry,有如下幾個值:
        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接口相當于我們service層的接口,而WorkflowStore接口相當于我們DAO層的接口,
    我們知道osworkflow提供的Workflow實現(如:BasicWorkflow)有時并不能滿足業務的需要,因此我們可以實現自己的Workflow,具體可以參照BasicWorkflow 
    繼承AbstractWorkflow,接著加入自己想要的方法。同理,我們可以通過繼承相應的WorkflowStore(如:HibernateWorkflowStore)來編寫自己的方法
    posted @ 2012-06-26 14:49 筱 筱 閱讀(5727) | 評論 (0)編輯 收藏

    1、日期格式化:
        DateFormat
        SimplateDateFormat

    2、數字格式化
        NumberFormat
        DecimalFormat

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

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

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

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

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

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

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

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

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

    如果用的是TortoiseSVN,開始菜單 -> TortoiseSVN -> Settings -> General,此時右側有一個名為Edit的按鈕,點擊之后就可以編輯config了

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

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

    在頁面中顯示某字段時,字段值過長會導致頁面樣式錯亂,這時候我們需要對值進行截取,當截取值時會碰到以下問題:
    1、如果按字符截取會導致中英文顯示的長度不一
    2、如果按字節截取可能會導致最后一個中文截成兩部分
    以下代碼是在網上獲取并經過改造而成,能夠很好的解決上面兩個問題
        /**
         * 根據指定字節數截取字符串,當指定處為中文第一個字節時少截取一個字符,當長度大于指定截取長度時,截取后在字符串末尾追加指定字符串<br/>
         * 這里添加了字符串的編碼,因為頁面的編碼不同,字符串所占字節也不同
         *
         * @param str 待截取字符串,如果為null或者"",則立即返回str
         * @param length 需要截取的長度
         * @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;// 這里要和頁面的編碼相關
                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) | 評論 (0)編輯 收藏

    英文不太好,經常忘記,所以現在寫下來:
    1,transient:在序列化一個類時,如果類中某個字段不想被序列化,則使用此關鍵字
    2、volatile:用于線程同步時

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

    根據分代收集器原理(可以參考垃圾回收機制分類),JVM的內存可分為三個域: 新域、舊域以及永久域
    JVM生成的所有新對象放在新域中。一旦對象經歷了一定數量的垃圾收集循環后,便進入舊域。而在永久域中是用來存儲JVM自己的反射對象的,如class 和method對象,而且GC(Garbage Collection)不會在主程序運行期對永久域進行清理。其中新域和舊域屬于堆,永久域是一個獨立域并且不認為是堆的一部分
    一、java.lang.OutOfMemoryError: PermGen space

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

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

    二、java.lang.OutOfMemoryError: Java heap space
    Heap size 設置
    JVM堆 的設置是指java程序運行過程中JVM可以調配使用的內存空間的設置.JVM在啟動的時候會自動設置Heap size的值,
    其初始空間(即 -Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項可
    進行設 置。Heap size 的大小是Young Generation 和Tenured Generaion 之和(新域和舊域之和)。
    提示:在JVM中如果98% 的時間是用于GC且可用的Heap size 不足2%的時候將拋出此異常信息。
    提示:Heap Size 最大不要超過可用物理內存的80%,一般的要將-Xms和-Xmx選項設置為相同,而-Xmn為1/4的-Xmx值。
    解決方法:手動設置 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) | 評論 (0)編輯 收藏

    動態應用,是相對于網站靜態內容而言, 是指以c/c++、php、Java、perl、.net等 服務器端語言開發的網絡應用軟件,比如論壇、網絡相冊、交友、BLOG等常見應用。動態應用系統通 常與數據庫系統、緩存系統、分布式存儲系統等密不可分。

    大型動態應用系統平臺主要是針對于大流 量、高并發網站建立的底層系統架構。大型網站的運行需要一個可靠、安全、可擴展、易維護的應用系統平臺做為支撐,以保證網站應用的平穩運行。

    大型動態應用系統又可分為幾個子系統:

    l         Web前端系統

    l         負載均衡系統

    l         數據庫集群系統

    l         緩存系統

    l         分布式存儲系統

    l         分布式服務器管理系統

    l         代碼分發系統

    Web前端系統

    結構圖:

    為了達到不同應用的服務器共享、避免單點故障、集中管理、統一配置等目的,不以應用劃分服 務器,而是將所有服務器做統一使用,每臺服務器都可以對多個應用提供服務,當某些應用訪問量升高時,通過增加服務器節點達到整個服務器集群的性能提高,同 時使他應用也會受益。該Web前端系統基于Apache/Lighttpd/Eginx等 的虛擬主機平臺,提供PHP程序運行環境服務器對開發人員是透明的,不需要開發人員介入服務器管理

    負載均衡系統


    負載均衡系統分為硬件和軟件兩種。硬件負載均衡效率高,但是價格貴,比如F5等。軟件負載均衡系統價格較低或者免費,效率較硬件負載均衡系統 低,不過對于流量一般或稍大些網站來講也足夠使用,比如lvs,nginx。大多數網站都是硬件、軟件負載均衡系統并用。

    數據庫集群系統

    結構圖:


    由于Web前端采用了負載均衡集群結構提高了服務的有效性和擴展性,因此數據庫必須也是高可靠的才能保證整個服務體系的高可靠性,如何構建一個高可靠的、可以提供大規模并發處理的數據庫體系?

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

    1)        使用 MySQL 數據庫,考慮到Web應用的數據庫讀多寫少的特點,我們主要對讀數據庫做了優化,提供專用的讀數據庫和寫數據庫,在應用程序中實現讀操作和寫操作分別訪問不同的數據庫。

    2)        使用 MySQL Replication 機制實現快速將主庫(寫庫)的數據庫復制到從庫(讀庫)。一個主庫對應多個從庫,主庫數據實時同步到從庫。

    3)        寫數據庫有多臺,每臺都可以提供多個應用共同使用,這樣可以解決寫庫的性能瓶頸問題和單點故障問題。

    4)        讀數據庫有多臺,通過負載均衡設備實現負載均衡,從而達到讀數據庫的高性能、高可靠和高可擴展性。

    5)        數據庫服務器和應用服務器分離。

    6)        從數據庫使用BigIP做負載均衡。

    緩存系統


    緩存分為文件緩存、內存緩存、數據庫緩存。在大型Web應用中使用最多且效率最高的是內存緩存。最常用的內存緩存工具是Memcachd。使用正確的緩存系統可以達到實現以下目標:

    1、   使用緩存系統可以提高訪問效率,提高服務器吞吐能力,改善用戶體驗。

    2、   減輕對數據庫及存儲集服務器的訪問壓力

    3、Memcached服務器有多臺,避免單點故障,提供高可靠性和可擴展性,提高性能。

    分布式存儲系統

    結構圖:


    WEB系統平臺中的存儲需求有下面兩個特點:

    1) 存儲量很大,經常會達到單臺服務器無法提供的規模,比如相冊、視頻等應用。因此需要專業的大規模存儲系統。

    2) 負載均衡cluster中的每個節點都有可能訪問任何一個數據對象,每個節點對數據的處理也能被其他節點共享,因此這些節點要操作的數據從邏輯上看只能是一個整體,不是各自獨立的數據資源。

    因此高性能的分布式存儲系統對于大型網站應用來說是非常重要的一環。(這個地方需要加入對某個分布式存儲系統的簡單介紹。)

    分布式服務器管理系統

    結構圖:


    隨著網站訪問流量的不斷增加,大多的網絡服務都是以負載均衡集群的方式對外提供服務,隨之集群規模的擴大,原來基于單機的服務器管理模式已經不能夠滿足我們的需求,新的需求必須能夠集中式的、分組的、批量的、自動化的對服務器進行管理,能夠批量化的執行計劃任務。

    在分布式服務器管理系統軟件中有一些比較優秀的軟件,其中比較理想的一個是 Cfengine。它可以對服務器進行分組,不同的分組可以分別定制系統配置文件、計劃任務等配置。它是基于C/S 結構的,所有的服務器配置和管理腳本程序都保存在Cfengine Server上,而被管理的服務器運行著 Cfengine Client 程序,Cfengine Client通過SSL加密的連接定期的向服務器端發送請求以獲取最新的配置文件和管理命令、腳本程序、補丁安裝等任務。

    有了Cfengine 這種集中式的服務器管理工具,我們就可以高效的實現大規模的服務器集群管理,被管理服務器和 Cfengine Server 可以分布在任何位置,只要網絡可以連通就能實現快速自動化的管理。

    代碼發布系統

    結構圖:

    隨著網站訪問流量的不斷增加,大多的網絡服務都是以負載均衡集群的方式對外提供服務,隨之集群規模的擴大,為了滿足集群環境下程序代碼的批量分發和更新,我們還需要一個程序代碼發布系統。

    這個發布系統可以幫我們實現下面的目標:

    1) 生產環境的服務器以虛擬主機方式提供服務,不需要開發人員介入維護和直接操作,提供發布系統可以實現不需要登陸服務器就能把程序分發到目標服務器。

    2) 我們要實現內部開發、內部測試、生產環境測試、生產環境發布的4個開發階段的管理,發布系統可以介入各個階段的代碼發布。

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

    這里面可以使用常用的工具Rsync,通過開發相應的腳本工具實現服務器集群間代碼同步分發。

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

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

    樣式代碼如下:
    html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); }
    需要最新網頁標準支持:
    <!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標簽中加入如下代碼:
    <param value="false" name="menu"/>
    <param value="opaque" name="wmode"/>
    posted @ 2010-04-21 12:19 筱 筱 閱讀(234) | 評論 (0)編輯 收藏

    1、下載wamp5,安裝wamp5,如需更改端口請修改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、安裝后訪問首頁http://localhost:8888,點擊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文件,沒有[Zend]塊,表明ZendOptimizer沒有安裝
    3、下載ZendOptimizer,安裝路徑選擇D:\Program Files\Zend,選擇apache2.x及php.ini的位置,安裝完成后php.ini最后會添加以下內容:
        [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、訪問http://loalhost:8888/ppframe進行ppframe的安裝,安裝成功后登陸后臺,如果沒有安裝ZendOptimizer,左側的exam是打不開的,但是passport可以打開。

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

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

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

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

    比如java向txt文件中寫入新的一行時,java獲得文本輸入框中的新行時等
    Unix系統里,每行結尾只有“<換行>”,即“\r”;
    Windows系統里面,每行結尾是“<換行><回車>”,即“\r\n”;
    Mac系統里,每行結尾是“<回車>”,即“\n”。
    一個直接后果是,Unix/Mac系統下的文件在Windows里打開的話,所有文字會變成一行;
    而Windows里的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號。

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

    如果已經配置mysql的環境變量,請直接執行:mysql -u 輸入用戶名 -p 回車 之后輸入密碼
    如果未配置環境變量請先進入mysql的bin目錄下
    執行如下語句導入:source 輸入sql文件的位置
    執行如下語句導出:mysqldump -u輸入用戶名 -p輸入密碼 數據庫名 表名 >文件名.sql

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

    服務端:http://labs.northscale.com/memcached-packages/
    客戶端:http://code.google.com/p/memcached/wiki/Clients/
    posted @ 2009-12-31 10:57 筱 筱 閱讀(428) | 評論 (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、打開cmd,進入到tomcat5.5bin目錄 --> D:\Program Files\Apache Software Foundation\Tomcat 5.5\bin>
    5、執行命令:service install tomcat
            執行結果為:
                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.
            此時產生名為:Apache Tomcat tomcat 的服務
    6、卸載命令:service remove tomcat
            執行結果為:
                The service 'tomcat' has been removed

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

    @echo off
    rem 這段代碼的作用是對mysql進行查詢操作,并將查詢結果寫入到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 筱 筱 閱讀(358) | 評論 (0)編輯 收藏

    千萬人同時訪問的網站,一般是有很多個數據庫同時工作,說明白一點就是數據庫集群和并發控制,這樣的網站實時性也是相對的。這些網站都有一些共同的特點:數據量大,在線人數多,并發請求多,pageview高,響應速度快。總結了一下各個大網站的架構,主要提高效率及穩定性的幾個地方包括:

      1、程序

      程序開發是一方面,系統架構設計(硬件+網絡+軟件)是另一方面。

      軟件架構方面,做網站首先需要很多web服務器存儲靜態資源,比如圖片、視頻、靜態頁等,千萬不要把靜態資源和應用服務器放在一起。

      一個好的程序員寫出來的程序會非常簡潔、性能很好,一個初級程序員可能會犯很多低級錯誤,這也是影響網站性能的原因之一。

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

      用數據庫也未必不能解決訪問量巨大所帶來的問題,作成靜態文件硬盤的尋址時間也未必少于數據庫的搜索時間,當然對資料的索引要下一翻工夫。我自己覺得門戶往往也就是當天、熱門的資料點擊率較高,將其做緩存最多也不過1~2G的數據量吧,舉個例子:

    拿網易新聞來http://news.163.com/07/0606/09/3GA0D10N00011229.html

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

      可以把當天發布的、熱門的、流攬量大的作個緩寸,用hashtable(key:年-月-日-分類-ID,value:新聞對象),靜態將其放到內存(速度絕對快過硬盤尋址靜態頁面)。

    通常是采用oracle存儲過程+2個weblogic,更新機制也幾乎一樣每簽發一條新聞,就會生成靜態頁面,然后發往前端的web服務器,前端的web都是做負載均衡的。另外還有定時的程序,每5-15分鐘自動生成一次。在發布新聞的同時將數據緩存。當然緩存也不會越來越大,在個特定的時間段(如凌晨)剔除過期的數據。做一個大的網站遠沒有想象中那么簡單,服務器基本就要百十個的。

      這樣可以大大增加一臺計算機的處理速度,如果一臺機器處理不了,可以用httpserver集群來解決問題了。


      2、網絡
      中國的網絡分南北電信和網通,訪問的ip就要區分南北進入不同的網絡。


      3、集群
      通常會使用CDN與GSBL與DNS負載均衡技術,每個地區一組前臺服務器群,例如:網易,百度使用了DNS負載均衡技術,每個頻道一組前臺服務器,一搜使用了DNS負載技術,所有頻道共用一組前臺服務器集群。

      網站使用基于Linux集群的負載均衡,失敗恢復,包括應用服務器和數據庫服務器,基于linux-ha的服務狀態檢測及高可用化。

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

     4、數據庫

      因為是千萬人同時訪問的網站,所以一般是有很多個數據庫同時工作的,說明白一點就是數據庫集群和并發控制,數據分布到地理位置不同的數據中心,以免發生斷電事故。另外還有一點的是,那些網站的靜態化網頁并不是真的,而是通過動態網頁與靜態網頁網址交換做出現的假象,這可以用urlrewrite 這樣的開源網址映射器實現。這樣的網站實時性也是相對的,因為在數據庫復制數據的時候有一個過程,一般在技術上可以用到hibernate和 ecache,但是如果要使網站工作地更好,可以使用EJB和websphere,weblogic這樣大型的服務器來支持,并且要用oracle這樣的大型數據庫。

      大型門戶網站不建議使用Mysql數據庫,除非你對Mysql數據的優化非常熟悉。Mysql數據庫服務器的master-slave模式,利用數據庫服務器在主從服務器間進行同步,應用只把數據寫到主服務器,而讀數據時則根據負載選擇一臺從服務器或者主服務器來讀取,將數據按不同策略劃分到不同的服務器(組)上,分散數據庫壓力。

      大型網站要用oracle,數據方面操作盡量多用存儲過程,絕對提升性能;同時要讓DBA對數據庫進行優化,優化后的數據庫與沒優化的有天壤之別;同時還可以擴展分布式數據庫,以后這方面的研究會越來越多;


      5、頁面

      從開始就考慮使用虛擬存儲/簇文件系統。它能讓你大量并行IO訪問,而且不需要任何重組就能夠增加所需要的磁盤。

      頁面數據調用更要認真設計,一些數據查詢可以不通過數據庫的方式,實時性要求不高的可以使用lucene來實現,即使有實時性的要求也可以用lucene,lucene+compass還是非常優秀的。

      新聞類的網站可以用靜態頁存儲,采用定時更新機制減輕服務器負擔;首頁每個小模塊可以使用oscache緩存,這樣不用每次都拉數據。

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

      生成靜態頁面的服務器和www服務器是兩組不同的服務器,頁面生成后才會到www服務器,一部分數據庫并不是關系數據庫,這樣更適合信息衍生,www、mail服務器、路由器多,主要用負載平衡解決訪問瓶頸。

      靜態頁面的缺點:

      1) 增加了程序的復雜度

      2) 不利于管理資料

      3) 速度不是最快

      4) 傷硬盤

      6、緩存

      從一開始就應該使用緩存,高速緩存是一個更好的地方存儲臨時數據,比如Web站點上跟蹤一個特定用戶的會話產生的臨時文件,就不再需要記錄到數據庫里。

      不能用lucene實現的可以用緩存,分布式緩存可以用memcached,如果有錢的話用10來臺機器做緩存,> 10G的存儲量相信存什么都夠了;如果沒錢的話可以在頁面緩存和數據緩存上下功夫,多用OSCACHE和EHCACHE,SWARMCACHE也可以,不過據說同步性不是很好;

      可以使用Memcache進行緩存,用大內存把這些不變的數據全都緩存起來,而當修改時就通知cache過期,memcache是LJ開發的一款分布式緩存產品,很多大型網站在應用,我們可以把Cache Server與AppServer裝在一起。因為Cache Server對CPU消耗不大,而有了Cache Server的支援,App Server對內存要求也不是太高,所以可以和平共處,更有效的利用資源。
    posted @ 2009-11-30 16:50 筱 筱 閱讀(272) | 評論 (0)編輯 收藏


    將response內響應給使用者的內容,使用GZIP壓縮的方式回傳給瀏覽器,而IE5和NS6也都有支持Gzip的壓縮格式。
    這個方法在之前就有人提出過,因為是讓網頁在輸出時經過壓縮,可以讓傳輸量變小很多,雖然現在的網絡頻寬對于用來看網頁已經綽綽有余,但是檔案大小太大的網頁還是會造成一定的影響。
    經過Gzip壓縮過的網頁,檔案大小可以到原本壓縮前的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中的設定為:
    <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> 

     

    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/a_heng/archive/2009/09/22/4579979.aspx

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

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

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

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

    Insert是T-sql中常用語句,Insert INTO table(field1,field2,...) values(value1,value2,...)這種形式的在應用程序開發中必不可少。但我們在開發、測試過程中,經常會遇到需要表復制的情況,如將一個table1的數據的部分字段復制到table2中,或者將整個table1復制到table2中,這時候我們就要使用SELECT INTO 和 INSERT INTO SELECT 表復制語句了。

          1.INSERT INTO SELECT語句

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

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

    select into與insert into select - xiaolei_funny - 一葉知秋 的博客select into與insert into select - xiaolei_funny - 一葉知秋 的博客INSERT INTO SELECT語句復制表數據

       --1.創建測試表

        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.創建測試數據

        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語句復制表數據

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

        GO

        --4.顯示更新后的結果

        select * from Table2

        GO

        --5.刪除測試表

        drop TABLE Table1

        drop TABLE Table2

          2.SELECT INTO FROM語句

          語句形式為:SELECT vale1, value2 into Table2 from Table1

          要求目標表Table2不存在,因為在插入時會自動創建表Table2,并將Table1中指定字段數據復制到Table2中。示例如下:

    select into與insert into select - xiaolei_funny - 一葉知秋 的博客select into與insert into select - xiaolei_funny - 一葉知秋 的博客SELECT INTO FROM創建表并復制表數據

       --1.創建測試表

        create TABLE Table1

        (

            a varchar(10),

            b varchar(10),

            c varchar(10),

            CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED

            (

                a ASC

            )

        ) ON [PRIMARY]

        GO

        --2.創建測試數據

        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語句創建表Table2并復制數據

        select a,c INTO Table2 from Table1

        GO

        --4.顯示更新后的結果

        select * from Table2

        GO

        --5.刪除測試表

        drop TABLE Table1

        drop TABLE Table2

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

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

    測試
    Microsoft Windows XP [版本 5.1.2600](C) 版權所有 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>
    看到上面這個就說明安裝成功!一般的登錄為:mysql -h host -u user -p (password)

    非安裝包的安裝
    1.將mysql-noinstall-5.0.19-win32.zip到C:\(或者其他你想的安裝目錄),重命名mysql
    2.進入C:\mysql\可以找到如下的配置文件樣本,my-small.ini,my-medium.ini等。我選擇my-medium.ini,先將復制到另外的地方,例如:桌面,然后重命名為my.ini,再剪切回C:\mysql\目錄下。
    3.打開my.ini進行編輯,要修改的地方如下:
    [client]#password = your_passwordport = 3309#socket = /tmp/mysql.sock
    將socket項用'#'注釋掉,因為windows下沒有,又因為我上面用了端口3306,所以這里要把端口也改了,改為3309,你可以改成其他沒有被占用的端口3307,3308等。
    [mysqld]
    basedir=C:/mysql/datadir=C:/mysql/data/port = 3309#socket = /tmp/mysql.sock
    default-character-set=utf8
    這里同樣把socket注釋掉,端口改成3309;basedir為安裝目錄,datadir為存放數據的目錄,記住要用“/”,而不是“\”,如果要用"\"就要這樣使用C:\\mysql\\data,另外這里我還設置了默認的字符集為utf8。
    還有
    [mysql]
    default-character-set=utf8
    no-auto-rehash# Remove the next comment character if you are not familiar with SQL#safe-updates在上面添加默認的字符集就可以了。
    4.編輯完my.ini文件后就要選擇一種MySQL服務器類型,它們之間的區別如下:
    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目錄下找到對應的.exe程序,例如:mysqld-max.exe,mysqld-nt.exe等。
    5.選擇好后就要安裝成windows服務了,過程如下:(我選的是mysqld-max)
    Microsoft Windows XP [版本 5.1.2600](C) 版權所有 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 服務正在啟動 .mysql-max 服務已經啟動成功。
    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服務的命令格式為:服務器類型 --install(自動) 名稱(你想要用的名稱) --defaults-file=my.ini文件的絕對路徑。--install-manual(手動)
    注意:上面的登錄mysql -uroot --port=3309 非安裝默認設定的用戶為root,密碼為空,同時因為我改了端口,所以要加上--port選項。

    一臺機器上安裝多個windows服務
    1.創建要安裝的目錄,例如:F:\mysql,在F:\mysql目錄下再創建一個子目錄data.
    2.再到已經裝好的mysql的目錄下,例如:C:\mysql\,把里面data目錄下的mysql目錄copy到F:\mysql\data\目錄 下,再C:\mysql\目錄下share目錄和my.ini文件也copy到F:\mysql\目錄下,其實只需要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服務同上面的非安裝版本的安裝過程是一樣的,過程如下:
    Microsoft Windows XP [版本 5.1.2600](C) 版權所有 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 服務正在啟動 .mysql-debug 服務已經啟動成功。
    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) | 評論 (0)編輯 收藏

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

    頁面如果用到Ext最好不要在body有任何文字輸出,不然的話ext會報一個錯誤!

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

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

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

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

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

    apache common Pool 對象池
    apache common dbcp 數據庫連接池
    common dbcp依賴 common pool
    posted @ 2009-07-09 09:53 筱 筱 閱讀(174) | 評論 (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) | 評論 (1)編輯 收藏

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

    不管是那種類型的http請求總是可以由一個過濾器來捕捉。
    分類:普通http請求的header參數中沒有x-requested-with:XMLHttpRequest頭信息,而異步的有。
    其實對于常見的ajax框架,header中還有標示自己身份的header信息。

    對于普通的http請求,發現session超時后直接重定向到一個超時頁面,顯示訪問超時。
    對于異步http請求,發現session超時后則向請求的response中寫入特定的超時頭信息,客戶端ajax對象檢測
    頭信息,發現有超時狀態標志后調用顯示超時信息的javascript方法,提示用戶訪問超時。

    服務器端session超時后在過濾器中為response添加新的頭信息,標記該請求超時:

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

    使用Ext.Ajaxt對象完成異步請求交互,假如checkUserSessionStatus是你的回調方法,每個頁面引用:

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


    })

     對于其他的ajax框架,解決用戶訪問請求超時這個問題的思路是類似的。

    在這里推薦一個很實用的Js方法:

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

     

    通過該方法,可以在一個任意深度的iframe中調用父iframe中的方法。具體到這里就是無論哪一個iframe中的用戶訪

    問請求超時,都可以通過該方法調用最外層iframe中的退出方法,這樣便為用戶提供了一個統一的訪問超時退出的UI

    呈現。

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

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

    Ext的數據存儲器為:Ext.data.Store
    ExtJS中有一個名為Record的類,表格等控件中使用的數據是存放在Record對象中,一個Record可以理解為關系數據表中的一行,也可以稱為記錄。Record對象中即包含了記錄(行中各列)的定義信息(也就是該記錄包含哪些字段,每一個字段的數據類型等),同時又包含了記錄具體的數據信息(也就是各個字段的值)。一個比較正規的創建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在創建的時候會自動使用HttpProxy來加載參數,并且使用post方式來提交請求,因此上面的代碼可簡化為:
    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類的基礎上提供了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) | 評論 (0)編輯 收藏

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

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

    使用group by子句的注意事項:

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

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

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

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

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

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

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

    創建變量
    最簡單的方法是使用<setvar>元素,語法如下:
    <setvar name="string" value="string" />

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

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

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

    ESCAPE
    轉換

    前面說過變量可以用作替換用途,但是在URL中使用時,變量的內容必須遵守[RFC2396]標準。
    這個標準規定某些特殊字符在URL里使用的時候必須用特殊表示方法,即ESCAPE八進制表示。
    例如:
    list.asp?id=3

    在URL中要表示為:

    list.asp%3fid=3

    所以變量有可能需要標志為是否對其內容進行ESCAPE轉換,變量定義就有如下幾種特殊方式:

    效果 表達方式1 表達方式2 表達方式3
    對變量中ESCAPE字符進行轉換 $(var:e) $(var:E) $(var:escape)
    不進行ESCAPE轉換 $(var:u) $(var:U) $(var:unesc)
    變量中沒有ESCAPE字符 $(var:n) $(var:N)

    $(noesc)


    給變量進行ESCAPE轉換是WML的默認方式。
    posted @ 2009-04-13 14:11 筱 筱 閱讀(148) | 評論 (0)編輯 收藏

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

    Listener接口

    Event

    ServletContextListener

    ServletContextEvent

    ServletContextAttributeListener

    ServletContextAttributeEvent

    HttpSessionListener

    HttpSessionEvent

    HttpSessionActivationListener

    HttpSessionAttributeListener

    HttpSessionBindingEvent

    HttpSessionBindingListener

    ServletRequestListener

    ServletRequestEvent

    ServletRequestAttributeListener

    ServletRequestAttributeEvent

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

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


    1.ServletContextListener:
    用于監聽WEB 應用啟動和銷毀的事件,監聽器類需要實現javax.servlet.ServletContextListener 接口。
    ServletContextListener 是 ServletContext 的監聽者,如果 ServletContext 發生變化,如服務器啟動時 ServletContext 被創建,服務器關閉時 ServletContext 將要被銷毀。

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

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


    2.ServletContextAttributeListener:用于監聽WEB應用屬性改變的事件,包括:增加屬性、刪除屬性、修改屬性,監聽器類需要實現javax.servlet.ServletContextAttributeListener接口。

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


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

    二、HttpSession相關監聽接口
    1.HttpSessionBindingListener接口
    注意:HttpSessionBindingListener接口是唯一不需要再web.xml中設定的Listener

    當我們的類實現了HttpSessionBindingListener接口后,只要對象加入Session范圍 (即調用HttpSession對象的setAttribute方法的時候)或從Session范圍中移出(即調用HttpSession對象的 removeAttribute方法的時候或Session Time out的時候)時,容器分別會自動調用下列兩個方法:
    void valueBound(HttpSessionBindingEvent event)
    void valueUnbound(HttpSessionBindingEvent event)

    思考:如何實現記錄網站的客戶登錄日志, 統計在線人數?

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

    3.HttpSessionListener接口
    HttpSessionListener監聽 HttpSession的操作。當創建一個Session時,激發session Created(HttpSessionEvent se)方法;當銷毀一個Session時,激發sessionDestroyed (HttpSessionEvent se)方法。

    4.HttpSessionActivationListener接口
    主要用于同一個Session轉移至不同的JVM的情形。

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


    三、ServletRequest監聽接口
    1.ServletRequestListener接口
    和ServletContextListener接口類似的,這里由ServletContext改為ServletRequest
    2.ServletRequestAttributeListener接口
    和ServletContextListener接口類似的,這里由ServletContext改為ServletRequest

      下面說明如何在web.xml中布署事件監聽器以實現對事件的處理,格式如下:
    <listener>
      <listener-class> 
        fey.servlet.listener.CustomServletContextListener 
      </listener-class >  
    </listener>
      其中fey.servlet.listener.CustomServletContextListener是實現上述各事件監聽器接口的類名。當然,你需要將這些類放入Web容器的Web應用的classes或lib目錄下以讓Web容器可以找到。
      另外說明一點,一個類可以一個或多個監聽器接口。

    有的listener可用于統計網站在線人數及訪問量。 如下:

    服務器啟動時(實現ServletContextListener監聽器contextInitialized方法),讀取數據庫,并將其用一個計數變量保存在application范圍內

    session創建時(實現HttpSessionListener監聽器sessionCreated方法),讀取計數變量加1并重新保存

    服務器關閉時(實現ServletContextListener監聽器contextDestroyed方法),更新數據庫

    簡例一

    監聽用戶上線與退出,顯示在線用戶

    1、登陸頁面 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、控制頁面(只是為了說明監聽器問題,所以簡單了點...) 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、顯示頁面 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("在線人數 "+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、配置頁面 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、監聽器 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 {
    // 參數
    ServletContext sc;
    ArrayList list = new ArrayList();
    // 新建一個session時觸發此操作
    public void sessionCreated(HttpSessionEvent se) {
    sc=se.getSession().getServletContext();
    System.out.println("新建一個session");
    }
    // 銷毀一個session時觸發此操作
    public void sessionDestroyed(HttpSessionEvent se) {
    System.out.println("銷毀一個session");
    if (!list.isEmpty()) {
       list.remove((String) se.getSession().getAttribute("userName"));
       sc.setAttribute("list", list);
    }
    }
    // 在session中添加對象時觸發此操作,在list中添加一個對象
    public void attributeAdded(HttpSessionBindingEvent sbe) {
    list.add((String) sbe.getValue());
    sc.setAttribute("list", list);
    }
    // 修改、刪除session中添加對象時觸發此操作
    public void attributeRemoved(HttpSessionBindingEvent arg0) {
    }
    public void attributeReplaced(HttpSessionBindingEvent arg0) {
    }
    }

    在Web開發中關于監聽器的應用
    首先,也要在web.xml配置文件中進行聲明:
            在web.xml文件中的聲明如下:(聲明片斷)    要放在filter過濾器聲明和filter-mapping聲明后面
       
       <listener>
            <listener-class>markchen.web.listener.MySessionListener</listener-class>
        </listener>
        <listener>
             <listener-class>markchen.web.listener.MyServletContextListener</listener-class>
        </listener>


    //這兩個java類的內容都和簡單,僅僅是為了演示說明而已

    //MySessionListener.java文件的內容如下
         //Web應用程序中會話的生命周期監聽器實現   
    package markchen.web.listener;

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

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

          //MyServletContextListener.java
                //Web應用程序的生命周期監聽器實現
    package markchen.web.listener;

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

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

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

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

    一,查看linux的ssh服務是否已經啟動:service sshd status;
        如果沒有啟動則執行:service sshd start 或者 service sshd restart
    二,使linux防火墻開啟22端口,因為ssh是通過22端口提供服務的
        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.看下狀態

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

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

    四,OK

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

    redhat9下安裝VMware Tools

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

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

      Web2.0時代,大家都一再強調互動! 互動! 互動! 企業級網站需要與客戶溝通互動,所以我們之前介紹了10款免費的網站在線客服系統,個人站長們也越來越追求互動,博客從一開始就為互動而生,好像不互動就不像個博客似兒的.雖然本博早已厭倦互動,但還是為大家介紹10多款基于Web的網頁即時聊天程序.使用網頁即時聊天程序的好處就是,讓訪客能即時的和站長或博客主溝通交流,形成良好的氛圍,甚至成為朋友.尤其對博客來說,能很好的增加穩定的讀者群.

    注:下面的其中幾個程序并非標準的Web即時聊天程序,只能算留言本而已.但其實他能當聊天程序用,只是少了”即時”…

    Plugoo

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

    Hab.la

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

    Chatback Badge

    Chatback Badge是Google Talk團隊發布的一款很有意思的網頁即時聊天小工具,它可以在頁面上實時顯示你的GT在線狀態以及個性化簽名等信息;不僅如 此,Chatback 還是一款可以即時引導用戶進入Google Talk 網頁版 Badge進行實時交流狀態的擴展,這樣,你的訪客便可以借助網頁版GT和你的客戶端GTalk進行即時聊天了,簡單而快捷,你的讀者甚至不需要獨立的 GTalk帳戶也能夠輕松和你交流。via

    TocPlus

    TocPlus是讓您直接與網上商城、博客、網頁的訪客進行實時對話的通訊系統。如果將TocPlus的服務適用于網上商城,就如地面商城可以向顧客直接推薦合適的商品或即時回答顧客所提出的咨詢,因此可提高營業效益。TocPlus的所有服務為免費。

    vawkr

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

    -以下5個來自web20share

    Gabbly

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

    Blobber

    功能和Gabbly類似,需要注冊。

    Woocall

    新浪推出的服務,和新浪網頁上的差不多。需要郵件申請,感覺用戶的可定制性不是很強.

    MeeboMe
    作 為一個可以嵌入website/blog的flash widget,本身并不突出,但是當它和Meebo結合起來之后,任何人都會覺得眼前一亮!換句簡單點的話說,登錄Meebo之后,你不僅可以同時和 MSN、Y!M、Jabber/Gtalk以及AIM中的聯系人進行交流,而且還能實時地和你的website/blog上的讀者進行交流,而這一切都在 你的瀏覽器頁面中完成.

    Cbox-blog
    Cbox-更像是一個可以嵌入到blog中的留言本服務,使用非常簡單方便,通過調用一段代碼就可插入到blog中。并且還可以自定義大小和顏色樣式等,以便符合自已的blog風絡。

    Twitterchat

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

    chirrup

    Chirrup是一個基于twitter的簡單的評論/留言系統,可以很方便地加入到自己blog/wiki/Web中。如果你的blog或者其他web沒有評論或者留言本系統,除了以前介紹的js-kit外,chirrup也是一個不錯的選擇,在twitter“大行其道”的網絡時代,所謂“鳥隨鸞鳳飛騰遠,人伴賢良品質高”,安裝一個基于twitter的留言或評論系統,對提高blog的流量、人氣等等也是很有幫助的。使用方法

    Aimboo

    是一個類似于Plugoo的 即時通訊服務,可通過代碼調用放置一個聊天窗口在你的Blog上,并與你的本地IM軟件連接,這樣當你的讀者訪問你的Blog時,就可以與你及時聯絡了, 目前 Aimboo支持Jabber、Gtalk、MSN、AIM及ICQ等常用的IM協議。

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

    FTPClient client = new FTPClient();
      client.connect("ip地址", 21);
      client.login("用戶名", "密碼");
      client.setSoTimeout(5000);//設置連接超時時間為5000毫秒
      // 在嘗試連接以后,你應該檢查返回碼驗證是否連接成功!
      int reply = client.getReplyCode();
      if (!FTPReply.isPositiveCompletion(reply)) {
       client.disconnect();
       System.err.println("FTP 服務器拒絕連接.");
       System.exit(1);
      }
      System.out.println("連接正在建立中......");
      if (client.isConnected()) {
       System.out.println("連接已建立!");
       client.setControlEncoding("gb2312");// 設置編碼方式,默認編碼方式為:ISO8859-1
       client.changeWorkingDirectory("archives");// 改變當前ftp的工作目錄
       // client.changeToParentDirectory();//回到上級目錄
       FTPFile[] fs = client.listFiles(); // 得到當前工作目錄下的所有文件
       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");// 隨機訪問文件類
         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() + " 數據寫入中...");
         while (input.read(data) != -1) {
          rfile.write(data);
         }
         System.out.println(new Date() + " 所有數據已接受完成!");
         input.close();
         rfile.close();
        }
       }
      }
      client.logout();
      client.disconnect();
    posted @ 2009-03-20 11:20 筱 筱 閱讀(1914) | 評論 (0)編輯 收藏

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

    posted @ 2009-03-20 10:57 筱 筱 閱讀(496) | 評論 (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) | 評論 (0)編輯 收藏

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

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

    Hibernate支持第三方的連接池,官方推薦的連接池是C3P0,Proxool,以及DBCP。在配置連接池時需要注意的有三點:
      一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已經不再推薦使用,官方的解釋是這個連接池存在缺陷。如果你因為某種原因需要在Hibernate3中使用DBCP,建議采用JNDI方式。
      二、默認情況下(即沒有配置連接池的情況下),Hibernate會采用內建的連接池。但這個連接池性能不佳,且存在諸多BUG,因此官方也只是建議僅在開發環境下使用。
      三、Hibernate2和Hibernate3的命名空間有所變化。例如,配置C3P0時的provider_class有Hibernate2環境下使用net.sf.hibernate.connection.C3P0ConnectionProvider,在Hibernate3環境下使用org.hibernate.connection.C3P0ConnectionProvider。
      下面是Hibernate環境下幾種常見的連接池配置,都是以連接MySQl為例。
      <!-- JDBC驅動程序 -->
      <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>
      <!-- 數據庫用戶名 -->
      <property name="connection.username">root</property>
      <!-- 數據庫密碼 -->
      <property name="connection.password">8888</property>
      上面的一段配置,在c3p0和dbcp中,都是必需的,因為hibernate會根據上述的配置來生成connections,再交給c3p0或dbcp管理。但是proxool則不能,可以讓proxool自身來生成連接,這在下面再講。
      從網上google了一下,發現大致有三種可以實施的解決方案:
      1、使用hibernate自帶的連接池;
      2、使用c3po包的連接池功能;
      3、使用dbcp包的連接池功能;
      4、使用Proxool包的連接池功能;
            5、使用JNDI連接池
      第一種方案,Hibernate默認連接池,就是在myeclipse產生的hibernate.cfg.xml中添加一個屬性:
      <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
      建立一個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>
      現在來看下配置的意思:
      <alias>配置連接池的別名;
      <driver-url>和寫JDBC連接數據庫時的URL一樣。
      <driver-class>和寫JDBC連接數據庫時的Driver一樣。
      <driver-properies>就是連接數據庫時的用戶名和密碼。
      <house-keeping-sleep-time>proxool自動偵察各個連接狀態的時間間隔(毫秒),偵察到空閑的連接就馬上回收,超時的銷毀
      <prototype-count>最少保持的空閑連接數
      <maximum-connection-count>最大連接數。
      <minimum-connection-count>最小連接數。
      以下是在Hibernate配置文件中對連接池的配置:
      <?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>
      <!--連接池的別名,即配置連接池時起的別名-->
      <property name="hibernate.proxool.pool_alias">
      mysql
      </property>
      <!--連接池文件的地址-->
      <property name="hibernate.proxool.xml">
      config/proxool/proxool.xml
      </property>
      <!--是否將運行期生成的SQL輸出到日志以供調試-->
      <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連接池。數據源已經由應用服務配置好(如Web服務器),Hibernate需要做的只是通過JNDI名查找到此數據源。應用服務器將連接池對外顯示為JNDI綁定數據源,它是javax.jdbc.Datasource類的一個實例。只要配置一個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) | 評論 (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. 請查詢出學生出姓名mark<60
    2. 請查詢每門學科中存在有一門不及格的學生姓名
    3. 請查詢出各科總分排行前三名的學生姓名和成績(包含并列)
    4. 請查詢出每門科目中前三名的學生姓名和科目(包含并列的)




    posted @ 2009-02-25 20:32 筱 筱 閱讀(240) | 評論 (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) | 評論 (0)編輯 收藏

    困擾我多年的sql語句執行順序今天終于在網上找到了
    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
        (查詢班上總分排名前三的學生姓名)
    開心啦,開心!
    posted @ 2009-02-03 16:31 筱 筱 閱讀(264) | 評論 (0)編輯 收藏

    1,load()方法從來就是假定數據在數據庫中是存在的,在使用時如果不存在則會拋出ObjectNotFoundException;而get()方法不會假定數據在數據庫中存在,如果不存在則返回null
    2,load()方法返回的是實體類的代理類,因此load()可以使用延遲加載策略來加載對象
          get()方法返回的不一定是實體類,可能是代理類,因為get()方法如果在session緩存(一級緩存)中找到了該id對應的對象,如果剛好該對象前面是被代理過的,如被load方法使用過,或者被其他關聯對象延遲加載過,那么返回的還是原先的代理對象,而不是實體類對象。
    3,load()方法查詢數據時會先從session緩存(一級緩存)中查找,如果沒有找到則會創建代理類,該代理類僅僅初始化了OID屬性,當第一次訪問其他屬性值時,則會依次從二級緩存-->數據庫查找,直到找到數據,最后將所有屬性值賦給代理類。而get()方法則會直接按照一級緩存-->二級緩存-->數據庫的順序查找。

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

    主站蜘蛛池模板: 色婷婷亚洲十月十月色天| 无遮挡国产高潮视频免费观看| jlzzjlzz亚洲乱熟在线播放| 成人免费在线看片| 永久免费A∨片在线观看| 国产成人精品亚洲| 久久亚洲精品国产精品婷婷 | 亚洲人成网站看在线播放| 狠狠综合久久综合88亚洲| 国产午夜无码视频免费网站| 国产91免费在线观看| 日韩人妻无码精品久久免费一| 亚欧国产一级在线免费| 美女黄色毛片免费看| 中文字幕精品三区无码亚洲| 久久亚洲AV无码精品色午夜 | 亚洲男女一区二区三区| 国产亚洲精品xxx| 亚洲乱码一区二区三区在线观看 | 亚洲中文字幕乱码AV波多JI| 亚洲视频中文字幕在线| 亚洲人成亚洲精品| 久久精品国产亚洲AV麻豆~| 国产亚洲AV夜间福利香蕉149| 成人亚洲综合天堂| 免费在线观看日韩| 国产免费131美女视频| 国产精品免费视频网站| 成人免费a级毛片无码网站入口| 成人免费福利视频| 18勿入网站免费永久| 麻豆视频免费播放| 国产91免费在线观看| 久久精品免费一区二区喷潮| a毛片基地免费全部视频| 一二三四视频在线观看中文版免费 | 欧美亚洲国产SUV| 偷自拍亚洲视频在线观看99| 美女被艹免费视频| www免费黄色网| 亚洲一区二区在线免费观看|