Java Tools

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

          #

          本文介紹如何利用Eclipse插件SQLExplorer在Eclipse中連接各種數據庫進行操作使用。

            Eclipse是目前非常流行的開發平臺,開放擴展的架構讓很多程序員找到了自己個性化的工作環境。

          安裝

          JDK:1.5.0 從http://java.sun.com上去下載安裝
          Eclipse:3.1.1 從http://www.eclipse.org 上去下載解壓
          SQLExplorer 從http://eclipsesql.sourceforge.net/

          技巧

            Eclipse使用技巧之插件管理

            提示:新下載的插件PlugIn一定不要都放在原始的Eclipse目錄下去,一大堆,累死你:(

          1. 前提是你已經安裝好了Eclipse工具了,比如安裝在E:\OpenSource\Eclipse\目錄下,以下這個目錄以%ECLIPSE_HOME%來進行表示;
          2. 此時默認的插件是在%ECLIPSE_HOME%\plugins目錄中的;
          3. 在%ECLIPSE_HOME%下建立一個PlugInsNew的目錄;

            比如:E:\OpenSource\Eclipse\PlugInsNew\

          1. 你下載了個新的插件,比如叫做:XYZ

            那么就在%ECLIPSE_HOME%\PlugInsNew\目錄下建立XYZ目錄,目錄里面是eclipse目錄,eclipse目錄包含有features與plugins兩個子目錄;結構如下圖所示:

          1. 把下載的新插件的文件放在以下相應目錄中

            %ECLIPSE_HOME%\PlugInsNew\XYZ\eclipse\features
            %ECLIPSE_HOME%\PlugInsNew\ XYZ\eclipse\plugins

          2. 建立相關的.link的文件

            然后在%ECLIPSE_HOME%\links目錄里建立一個XYZ.link的文件
            內容如是:path=E:/OpenSource/Eclipse/PlugInsNew/XYZ就一行這樣的路徑指示而已。
            這樣,如果你下載了多個插件就可以如法炮制建立多個Link文件,想加載哪個插件就把哪個插件的Link文件放到%ECLIPSE_HOME%\links的目錄中即可,使用與管理都很方便,建議千萬不要放在默認的安裝目錄中;
            如果你的%ECLIPSE_HOME%與此不同,請修改XYZ.link文件里的路徑

          3. 刪除,關閉Eclipse

            刪除%ECLIPSE_HOME%\links\XYZ.link文件即可
            刪除%ECLIPSE_HOME%\PlugInsNew\XYZ整個目錄及文件

          4. 重新啟動Eclipse即可

          使用

            SQLExplorer插件安裝方法采用上一節的《Eclipse使用技巧之插件管理》
            重新啟動Eclipse后,可以在菜單Window => Show View => Other => 可以看到多了SQLExplorer
          展開SQLExplorer有七項內容,分別為:

          1. Aliases 別名,用來標識數據庫連接串的
          2. Connection Info 連接信息,用來顯示連接數據庫時的相關信息,如,數據庫產品名稱、版本、JDBC驅動程序的名稱、版本、用戶名、連接串、是否自動提交等等。
          3. Connnections 顯示活動的連接情況
          4. Database Structure View 顯示數據庫結構
          5. Drivers 配置驅動程序用
          6. SQL History 執行SQL的歷史記錄
          7. SQL Results 執行SQL的結果集

            下面會分別介紹這七項內容的具體使用:
          如下圖所示:

            菜單Window => Preferences => SQLExplorer
          右邊的項目中,可以設置預覽表結果集時返回的行數、SQL集的返回行數、是否自動提交、還是關閉SQL編輯窗口后提交和寫SQL時是否自動完成表和列名。

            菜單Window => Preferences => SQLExplorer => SQL Editor
          右邊的項目中,可以設置SQL編輯器里的字體屬性、文本屬性

            菜單Window => Show View => Other => SQLExplorer 把里面的七項內容全部顯示出來,你也可以自己進行定制一下它

            開始進行配置驅動程序,打開Drivers

            默認加載成功插件后,只有JDBC ODBC Bridge是打勾可用的,其它都是打紅X不可用的,想想就知道為什么了吧(^_^)

            沒有想出來,接下來看看吧
          右鍵JDBC ODBC Bridge,在彈出的菜單中點擊Change the selected Driver菜單

            可以在彈出的修改驅動程序中看到如下信息,在Driver Class Name顯示的是
          sun.jdbc.odbc.JdbcOdbcDriver
          因為從JDK1.2開始,在JDK里自動帶有這個驅動程序了,所以顯示為可用了:)

            接下來我們開始配置MySQL和Oracle的驅動程序:
          右鍵MMMySQL Driver,在彈出的菜單中點擊Change the selected Driver菜單

            在彈出的修改驅動程序中看到,在Driver Class Name顯示的是org.gjt.mm.mysql.Driver
          點擊Extra Class Path => Add => 選擇你的MySQL所在的路徑,加入它

            加入驅動程序如下所示:

            單擊List Drivers按鈕,在Driver Class Name的右下框中可以看到三個驅動類名,選擇你需要的一個,OK之即可。

            可以看到這下MMMySQL Driver也為打勾可以使用的狀態了。

            以同樣的方法配置Oracle Thin Driver驅動程序

            默認驅動名稱,添加驅動程序:

            可以看到兩個驅動程序的名稱

            配置好驅動程序后,可以開始創建連接了,切換到Aliases別名視圖
          點擊創建圖標,如下:

            選擇MMMySQL Driver

            填入別名的名稱、JDBC連接串URL、用戶名、密碼

            確定后,在Aliases別名視圖里出現剛建立的連接

            右鍵剛建立的數據庫連接別名,在彈出的菜單選擇Open…打開之。

            會彈出一個連接的確認框,你可以更改用戶名與密碼,也可以設置是否自動提交。

            確定后,會自動切換到Database Structure View視圖上,MySQL數據庫,則可以看到Database

            再打開它,可以看到數據庫名,Table表及表的個數與名稱了。

            選中其中的表userpwd,這個表是自己建立的,可以看到以下顯示列、索引、主鍵、外鍵、結果集預覽、行數共六個信息內容。

            以下顯示表的列信息

            以下顯示索引信息

            以下顯示主鍵信息

              以下顯示外鍵信息

            以下顯示結果集預覽的內容

            以下顯示的是記錄行數信息

            切換到Connection Info連接信息的視圖,可以看到連接數據庫時的相關信息,
          如,數據庫產品名稱MySQL、版本4.1.0a-nt
          JDBC驅動程序的名稱MySQL-AB JDBC Driver、版本mysql-connector-java-3.0.16-ga
          用戶名test@localhost、連接串jdbc:mysql://localhost:3306/test、自動提交模式為是等等。

            顯示默認的事務狀態

            切換到Connnections視圖,顯示當前數據庫活動的連接情況,有一個活動的連接。

            右上角,可以打開Open New Connection圖標來打開一個新的連接,比如連接到相同的數據庫,但是卻是不同的用戶

            右上角,單擊New SQL Editor圖標,創建一個新的SQL編輯器,來寫你的SQL語句

            在打開的SQL編輯器中,你可以開始寫SQL語句了,如下:


          按Ctrl + F9 或者點擊Exceute SQL圖標,執行所輸入的語句

          這樣可以在SQL Results視圖中看到如下執行的結果信息

              切換到SQL History 執行SQL的歷史記錄的視圖,可以看到你執行過的語句列表

            再寫一個不同的語句,演示結果集與SQL歷史記錄


          執行后,記錄是顯示在最后的執行結果是在后面,依次遞增的,即1、2、3、最后一個是你最后執行的結果信息內容顯示的地方,不要弄錯了。

            這樣在SQL History里就再增加上了一條執行語句的記錄了

            同樣增加一個Oracle的連接測試

            Oracle數據庫,在Database Structure View視圖里顯示有Database、Monitor、Security、Instance四項內容


          在SQL編輯器中,選擇Oracle的鏈接,再輸入查詢語句測試一下

            可以在結果集里得到如果內容,在第4個標簽欄里了


          再更改一下SQL語句

            得到如下內容,在第4個標簽欄里了

            SQL歷史記錄里可以看到執行過的四條信息了

            這個插件的使用應當不是很容易的,其它的應用技巧與方法繼續中。

          posted @ 2007-07-19 18:24 和田雨 閱讀(2269) | 評論 (0)編輯 收藏

          方法一
          使用phpmyadmin,這是最簡單的了,修改mysql庫的user表,不過別忘了使用PASSWORD函數。

          方法二
          使用mysqladmin,這是前面聲明的一個特例。
          mysqladmin -u root -p password mypasswd
          輸入這個命令后,需要輸入root的原密碼,然后root的密碼將改為mypasswd。
          把命令里的root改為你的用戶名,你就可以改你自己的密碼了。
          當然如果你的mysqladmin連接不上mysql server,或者你沒有辦法執行mysqladmin,那么這種方法就是無效的,而且mysqladmin無法把密碼清空。

          下面的方法都在mysql提示符下使用,且必須有mysql的root權限:
          方法三
          mysql> Insert INTO mysql.user (Host,User,Password)
          VALUES('%','jeffrey',PASSWORD('biscuit'));
          mysql> FLUSH PRIVILEGES
          確切地說這是在增加一個用戶,用戶名為jeffrey,密碼為biscuit。
          在《mysql中文參考手冊》里有這個例子,所以我也就寫出來了。
          注意要使用PASSWORD函數,然后還要使用FLUSH PRIVILEGES。

          方法四
          和方法三一樣,只是使用了REPLACE語句
          mysql> REPLACE INTO mysql.user (Host,User,Password)
          VALUES('%','jeffrey',PASSWORD('biscuit'));
          mysql> FLUSH PRIVILEGES

          方法五
          使用SET PASSWORD語句,
          mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
          擬也必須使用PASSWORD()函數,但是不需要使用FLUSH PRIVILEGES。


          方法六
          使用GRANT ... IDENTIFIED BY語句
          mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
          這里PASSWORD()函數是不必要的,也不需要使用FLUSH PRIVILEGES。


          注意: PASSWORD() [不是]以在Unix口令加密的同樣方法施行口令加密。
          MySQL 忘記口令的解決辦法
          如果 MySQL 正在運行,首先殺之: killall -TERM mysqld。
          啟動 MySQL :bin/safe_mysqld --skip-grant-tables &
          就可以不需要密碼就進入 MySQL 了。
          然后就是
          >use mysql
          >update user set password=password("new_pass") where user="root";
          >flush privileges;
          重新殺 MySQL ,用正常方法啟動 MySQL 。


          mysql密碼清空
          Windows:
          1.用系統管理員登陸系統。
          2.停止MySQL的服務。
          3.進入命令窗口,然后進入MySQL的安裝目錄,比如我的安裝目錄是c:\mysql,進入C:\mysql\bin
          4.跳過權限檢查啟動MySQL,
          c:\mysql\bin>mysqld-nt --skip-grant-tables
          5.重新打開一個窗口,進入c:\mysql\bin目錄,設置root的新密碼
          c:\mysql\bin>mysqladmin -u root flush-privileges password "newpassword"
          c:\mysql\bin>mysqladmin -u root -p shutdown
          將newpassword替換為你要用的root的密碼,第二個命令會提示你輸入新密碼,重復第一個命令輸入的密碼。
          6.停止MySQL Server,用正常模式啟動Mysql
          7.你可以用新的密碼鏈接到Mysql了。

          Unix&Linux:
          1.用root或者運行mysqld的用戶登錄系統;
          2.利用kill命令結束掉mysqld的進程;
          3.使用--skip-grant-tables參數啟動MySQL Server
          shell>mysqld_safe --skip-grant-tables &
          4.為root@localhost設置新密碼
          shell>mysqladmin -u root flush-privileges password "newpassword"
          5.重啟MySQL Server


          mysql修改密碼
            mysql修改,可在mysql命令行執行如下:
            mysql -u root mysql
            mysql> Update user SET password=PASSWORD("new password") Where user='name';
            mysql> FLUSH PRIVILEGES;
            mysql> QUIT

           

          教你如何將MySQL數據庫的密碼恢復

          因為MySQL密碼存儲于數據庫mysql中的user表中,所以只需要將我windows 2003下的MySQL中的user表拷貝過來覆蓋掉就行了。

          在c:\mysql\data\mysql\(linux 則一般在/var/lib/mysql/mysql/)目錄下有三個user表相關文件user.frm、user.MYD、user.MYI

          user.frm //user表樣式文件

          user.MYD //user表數據文件

          user.MYI //user表索引文件

          為保險起見,三個都拷貝過來,不過其實如果之前在要恢復的那個MySQL上沒有更改過表結構的話,只要拷貝user.MYD就行了

          然后


          #. /etc/rc.d/init.d/mysql stop
          #. /etc/rc.d/init.d/mysql start
          #mysql -u root -p XXXXXX


          好了,可以用windows 2003下mysql密碼登陸了


          mysql>use mysql
          mysql>update user set Password=PASSWORD('xxxxxx') where User='root';


          這時候會出錯,提示user表只有讀權限

          我分析了一下原因,只這樣的,因為user.*文件的權限分配是windows 2003下的,在windows 2003下我ls -l一看權限是666

          在linux下我一看,拷過來后權限變成了600(其實正常情況下600就行了,只不過這里的文件屬主不是mysql,拷過來后的屬主變為了 root,所以會出現權限不夠,這時候如果你改成權限666則可以了,當然這樣不好,沒有解決問題的實質),在 /var/lib/mysql/mysql/下ls -l看了一下


          #chown -R mysql:mysql user.*
          #chmod 600 user.*


          //OK,DONE

          重起一下MYSQL

          重新連接


          mysql>use mysql
          mysql>update user set Password=PASSWORD('xxxxxx') where User='root';
          mysql>FLUSH PRIVILEGES;


          有一點值得注意:如果你windows 下mysql如果是默認配置的話,注意要還要執行


          mysql>delete from user where User='';
          mysql>delete from user where Host='%';
          mysql>FLUSH PRIVILEGES;


          好了,到這里恢復密碼過程就完成了

          這個方法么就是有點局限性,你必須也具備另外的user表文件

          其他還有幾種方法

          其它方法一(這個是網上流傳較廣的方法,mysql中文參考手冊上的)

          1. 向mysqld server 發送kill命令關掉mysqld server(不是 kill -9),存放進程ID的文件通常在MYSQL的數據庫所在的目錄中。


          killall -TERM mysqld


          你必須是UNIX的root用戶或者是你所運行的SERVER上的同等用戶,才能執行這個操作。

          2. 使用`--skip-grant-tables' 參數來啟動 mysqld。 LINUX下:


          /usr/bin/safe_mysqld --skip-grant-tables , windows下c:\mysql\bin\mysqld --skip-grant-tables


          3. 然后無密碼登錄到mysqld server ,


          >use mysql
          >update user set password=password("new_pass") where user="root";
          >flush privileges;


          。你也可以這樣做:


          `
          mysqladmin -h hostname -u user password 'new password''


          4. 載入權限表:


          `
          mysqladmin -h hostname flush-privileges'


          或者使用 SQL 命令


          `FLUSH PRIVILEGES'


          5.

          killall -TERM mysqld


          6.用新密碼登陸

          其它方法二

          直接用十六進制編輯器編輯user.MYD文件

          不過這個里面我要說明一點,我這里編輯的時候發現個問題,加密的密碼串有些是連續存儲的,有些的最后兩位被切開了,后兩位存儲在后面其他地方.這一 點我還沒想明白.還有注意一點就是編輯的是加密過的密碼串,也就是說你還是需要另外有user表文件。這種方法和我最上面介紹的方法的區別在于,這種方法 直接編輯linux下的user表文件,就不需要重新改文件屬主和權限了 

          修正一下:我在Windows下的實際操作如下

          1.關閉正在運行的MySQL。

          2.打開DOS窗口,轉到mysql\bin目錄。

          3.輸入


          mysqld-nt --skip-grant-tables


          回車。如果沒有出現提示信息,那就對了。

          4.再開一個DOS窗口(因為剛才那個DOS窗口已經不能動了),轉到mysql\bin目錄。

          5.輸入mysql回車,如果成功,將出現MySQL提示符 >

          6. 連接權限數據庫


          >use mysql;
          (>是本來就有的提示符,別忘了最后的分號)


          6.改密碼:


          > update user set password=password("123456") where user="root"; (別忘了最后的分號)


          7.刷新權限(必須的步驟)


          >flush privileges;


          8.退出


          > \q


          9.注銷系統,再進入,開MySQL,使用用戶名root和剛才設置的新密碼123456登陸。

          據說可以用直接修改user表文件的方法:

          關閉MySQL,Windows下打開Mysql\data\mysql,有三個文件user.frm,user.MYD,user.MYI找個知道密碼的MySQL,替換相應的這三個文件,如果user表結構沒改過,一般也沒人去改,替換user.MYD就可以了。

          也可以直接編輯user.MYD,找個十六進制編輯器,UltraEdit就有這個功能。關閉MySQL,打開user.MYD。將用戶名root 后面的八個字符改為565491d704013245,新密碼就是123456。或者將它們對應的十六進制數字,(左邊那里,一個字符對應兩個數字),改 為 00 02 02 02 02 02 02 02,這就是空密碼,在編輯器右邊看到的都是星號*,看起來很象小數點。重開MySQL,輸入root和你的新密碼。

          posted @ 2007-07-19 15:43 和田雨 閱讀(240) | 評論 (0)編輯 收藏

          MySQL是一個真正的多用戶、多線程SQL數據庫服務器。MySQL是以一個客戶機/服務器結構的實現,它由一個服務器守護程序mysqld和很多不同的客戶程序和庫組成。由于其源碼的開放性及穩定性,且與網站流行編徎語言PHP的完美結合,現在很多站點都利用其當作后端數據庫,使其獲得了廣泛應用。處于安全方面的考慮,需要為每一用戶賦于對不同數據庫的訪問限制,以滿足不同用戶的要求。下面就分別討論,供大家參考。

          一、MySQL修改密碼方法總結
          首先要說明一點的是:一般情況下,修改MySQL密碼是需要有mysql里的root權限的,這樣一般用戶是無法更改密碼的,除非請求管理員幫助修改。

          方法一

          使用phpMyAdmin (圖形化管理MySql數據庫的工具),這是最簡單的,直接用SQL語句修改mysql數據庫庫的user表,不過別忘了使用PASSWORD函數,插入用戶用Insert命令,修改用戶用Update命令,刪除用Delete命令。在本節后面有數據表user字段的詳細介紹。

          方法二

          使用mysqladmin。輸入

          mysqladmin -u root -p oldpassword newpasswd

          執行這個命令后,需要輸入root的原密碼,這樣root的密碼將改為newpasswd。同樣,把命令里的root改為你的用戶名,你就可以改你自己的密碼了。 當然如果你的mysqladmin連接不上mysql server,或者你沒有辦法執行mysqladmin,那么這種方法就是無效的,而且mysqladmin無法把密碼清空。

          下面的方法都在mysql提示符下使用,且必須有mysql的root權限:

          方法三

          mysql> INSERT INTO mysql.user (Host,User,Password) VALUES ('%','system', PASSWORD('manager'));
          mysql> FLUSH PRIVILEGES

          確切地說這是在增加一個用戶,用戶名為system,密碼為manager。注意要使用PASSWORD函數,然后還要使用FLUSH PRIVILEGES來執行確認。

          方法四

          和方法三一樣,只是使用了REPLACE語句

          mysql> REPLACE INTO mysql.user (Host,User,Password)
          VALUES('%','system',PASSWORD('manager'));
          mysql> FLUSH PRIVILEGES

          方法五

          使用SET PASSWORD語句

          mysql> SET PASSWORD FOR system@"%" = PASSWORD('manager');

          你也必須使用PASSWORD()函數,但是不需要使用FLUSH PRIVILEGES來執行確認。

          方法六

          使用GRANT ... IDENTIFIED BY語句,來進行授權。

          mysql> GRANT USAGE ON *.* TO system@"%" IDENTIFIED BY 'manager';

          這里PASSWORD()函數是不必要的,也不需要使用FLUSH PRIVILEGES來執行確認。

          注:PASSWORD()函數作用是為口令字加密,在程序中MySql自動解釋。

          二、MySql中訪問限制的設置方法
          我們采用兩種方法來設置用戶。

          進入到Mysql執行目錄下(通常是c:\mysql\bin)。輸入mysqld-shareware.exe,輸入mysql --user=root mysql ,不然不能添加新用戶。進入到mysql>提示符下進行操作。

          假設我們要建立一個超級用戶,用戶名為system,用戶口令為manager。

          方法一

          用Grant 命令授權,輸入的代碼如下:

          mysql>GRANT ALL PRIVILEGES ON *.* TO system@localhost IDENTIFIED BY 'manager' WITH GRANT OPTION;

          應顯示:Query OK, 0 rows affected (0.38 sec)

          方法二

          對用戶的每一項權限進行設置:

          mysql>INSERT INTO user VALUES('localhost','system',PASSWORD('manager'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');

          對于3.22.34版本的MySQL,這里共14個"Y",其相應的權限如下(按字段順序排列):
           

          權限 表列名稱 相應解釋 使用范圍 
          select Select_priv 只有在真正從一個表中檢索時才需要select權限 表 
          insert Insert_priv 允許您把新行插入到一個存在的表中 表 
          update Update_priv 允許你用新值更新現存表中行的列 表 
          delete Delete_priv 允許你刪除滿足條件的行 表 
          create Create_priv 允許你創建新的數據庫和表 數據庫、表或索引 
          drop Drop_priv 拋棄(刪除)現存的數據庫和表 數據庫或表 
          reload Reload_priv 允許您告訴服務器再讀入授權表 服務器管理 
          shutdown Shutdown_priv 可能被濫用(通過終止服務器拒絕為其他用戶服務) 服務器管理 
          process Process_priv 允許您察看當前執行的查詢的普通文本,包括設定或改變口令查詢 服務器管理 
          file File_priv 權限可以被濫用在服務器上讀取任何可讀的文件到數據庫表 服務器上的文件存取 
          grant Grant_priv 允許你把你自己擁有的那些權限授給其他的用戶 數據庫或表 
          references References_priv 允許你打開和關閉記錄文件 數據庫或表 
          index Index_priv 允許你創建或拋棄(刪除)索引 表 
          alter Alter_priv 允許您改變表格,可以用于通過重新命名表來推翻權限系統 表 

          如果創建用戶時只有select、insert、update和delete權限,則允許用戶只能在一個數據庫現有的表上實施操作.

          下面就可以創建我們要用到的數據庫了,我們直接輸入. 例如:我們要創建數據庫名為XinXiKu,可用如下代碼:

          mysql>create database XinXiKu;

          應顯示:Query OK, 1 row affected (0.00 sec)
          posted @ 2007-07-17 17:35 和田雨 閱讀(468) | 評論 (0)編輯 收藏

          一、在linux中
          如果 MySQL 正在運行,首先殺之: killall -TERM mysqld
          啟動 MySQL :/usr/bin/safe_mysqld --skip-grant-tables
          就可以不需要密碼就進入 MySQL 了。 
          然后就是 
          >use mysql 
          >update user set password=password("new_pass") where user="root"; 
          >flush privileges; 
          重新殺 MySQL ,用正常方法啟動 MySQL 。 
          二、Windows: 
          1.用系統管理員登陸系統。 
          2.停止MySQL的服務。 
          3.進入命令窗口,然后進入MySQL的安裝目錄,比如我的安裝目錄是c:\mysql,進入C:\mysql\bin 
          4.跳過權限檢查啟動MySQL, 
          c:\mysql\bin>;mysqld-nt --skip-grant-tables 
          5.重新打開一個窗口,進入c:\mysql\bin目錄,設置root的新密碼 
          c:\mysql\bin>;mysqladmin -u root flush-privileges password "newpassword" 
          c:\mysql\bin>;mysqladmin -u root -p shutdown 
          將newpassword替換為你要用的root的密碼,第二個命令會提示你輸入新密碼,重復第一個命令輸入的密碼。 
          6.停止MySQL Server,用正常模式啟動Mysql 
          7.你可以用新的密碼鏈接到Mysql了。 
          這種事情很少會碰到,不過如果碰到的話,不妨試試。
          posted @ 2007-07-17 17:32 和田雨 閱讀(1811) | 評論 (0)編輯 收藏

          Introduction to XML Schema
          [XML Schema
          介紹]

          翻譯:linqingfeng
          英語原文: http://www.w3schools.com/schema/default.asp


          XML Schema is an XML based alternative to DTD.
          [XML Schema
          是一種XML文件類型定義的基本方法]

          An XML schema describes the structure of an XML document.
          [
          每個XML Schema描述XML文檔的結構]

          The XML Schema language is also referred to as XML Schema Definition (XSD).
          [XML Schema
          也稱為XML模式定義(XSD)]


          What You Should Already Know
          [
          在學習之前你應該知道什么]

          Before you study the XML Schema Language, you should have a basic understanding of XML and XML Namespaces. It will also help to have some basic understanding of DTD.
          [
          在你開始學習XML Schema語言之前,你應該對XMLXML的命名空間有基本的了解。那樣會幫助你了解DTDDocument Type Definition文件類型定義)].


          What is an XML Schema?
          [XML Schema
          是什么?]

          The purpose of an XML Schema is to define the legal building blocks of an XML document, just like a DTD.
          [XML Schema
          目標是定義合法的XML文檔,就像DTD那樣]

          An XML Schema:
          [
          任一個XML Schema]

          • defines elements that can appear in a document
            [
            定義在文檔中的元素]
          • defines attributes that can appear in a document
            [
            定義在文檔中的屬性]
          • defines which elements are child elements
            [
            定義哪些元素為子元素]
          • defines the order of child elements
            [
            定義子元素的階]
          • defines the number of child elements
            [
            定義子元素的數]
          • defines whether an element is empty or can include text
            [
            定義元素是否為空]
          • defines data types for elements and attributes
            [
            定義元素和屬性的數據類型]
          • defines default and fixed values for elements and attributes
            [
            定義元素和屬性的默認值和固定值]

          XML Schemas are the Successors of DTDs
          [XML Schemas
          DTD的替代者]

          We think that very soon XML Schemas will be used in most Web applications as a replacement for DTDs. Here are some reasons:
          [
          我們認為很快XML Schemas就會替代DTD而大量應用于Web應用。原因有如下幾個:]

          • XML Schemas are extensible to future additions
            [XML Schemas
            易于未來的擴展]
          • XML Schemas are richer and more useful than DTDs
            [XML Schemas
            DTD更有用處]
          • XML Schemas are written in XML
            [XML Schemas
            本身就是XML]
          • XML Schemas support data types
            [XML Schemas
            支持數據類型]
          • XML Schemas support namespaces
            [XML Schemas
            支持命名空間]

          XML Schema is a W3C Recommendation
          [XML Schemas
          W3C推薦使用的]

          XML Schema was originally proposed by Microsoft, but became an official W3C recommendation in May 2001.
          [XML Schemas
          最初由微軟提出,并在2001年五月成為W3C的官方指定標準]

          The specification is now stable and has been reviewed by the W3C Membership.
          [
          其規格文檔現已穩定并加入到W3C標準中]

          XML Schemas - Why?
          [
          為什么選用XML Schemas]

           


          There are a number of reasons why XML Schema is better than DTD.
          [XML Schemas
          有趣多方面優于DTD]


          XML Schema has Support for Data Types
          [XML Schemas
          支持數據類型]

          One of the greatest strengths of XML Schemas is the support for data types.
          [XML Schemas
          其中最好的方面之一就是支持數據類型]

          With the support for data types:
          [
          對數據類型提供的支持有:]

          • It is easier to describe permissible document content
            [
            易于描述文檔內容是否允許]
          • It is easier to validate the correctness of data
            [
            易于驗證數據的正確性]
          • It is easier to work with data from a database
            [
            易于復合數據庫操作數據]
          • It is easier to define data facets (restrictions on data)
            [
            易于定義數據約束]
          • It is easier to define data patterns (data formats)
            [
            易于格式化數據]
          • It is easier to convert data between different data types
            [
            易于數據在不同的數據類型中轉換]

          XML Schemas use XML Syntax
          [XML Schemas
          是用XML的語法]

          Another great strength about XML Schemas is that they are written in XML.
          [
          另一個最大的優點是XML Schemas是用XML書寫的]

          Because XML Schemas are written in XML:
          [XML Schemas
          XML書寫的好處有:]

          • You don't have to learn another language
            [
            不用學習另一種新的語言]
          • You can use your XML editor to edit your Schema files
            [
            能在XML的編輯器中編寫XML Schemas文件]
          • You can use your XML parser to parse your Schema files
            [
            能用XML解釋器去解釋XML Schemas文件]
          • You can manipulate your Schema with the XML DOM
            [
            能用XML DOM(Document Object Model,文檔物件模型)操作XML Schemas文件]
          • You can transform your Schema with XSLT
            [
            能用XSLT來轉換XML Schemas文件]

          XML Schemas Secure Data Communication
          [XML Schemas
          數據通信更安全]

          When data is sent from a sender to a receiver it is essential that both parts have the same "expectations" about the content.
          [
          當數據從發送方傳遞給接受方時, XML Schemas會讓顯示的內容達到你的期望”]

          With XML Schemas, the sender can describe the data in a way that the receiver will understand.
          [XML Schemas
          文件能讓發送方的數據被接受方所解釋]

          A date like this: "03-11-2004" will, in some countries, be interpreted as 3. November and in other countries as 11. March, but an XML element with a data type like this:
          [
          例如一個日期的表述” 03-11-2004”,在某些國家會被解釋為113,而在另一些國家卻被解釋成311],而相同的數據在XML上表述成:

          <date type="date">2004-03-11</date>

          ensures a mutual understanding of the content because the XML data type date requires the format YYYY-MM-DD.
          [
          由于XML數據類型定義了他的格式是YYYY-MM-DD,從而使能正確的表述其內容的含義]


          XML Schemas are Extensible
          [XML Schemas
          是可擴展的]

          XML Schemas are extensible, just like XML, because they are written in XML.
          [XML Schemas
          是可擴展的,就像普通的XML一樣,因為他本身就是一個XML]

          With an extensible Schema definition you can:
          [
          可擴展性的定義帶來的好處有:]

          • Reuse your Schema in other Schemas
            [
            可從用你的規則與其他規則]
          • Create your own data types derived from standard types
            [
            從其他的標準的數據類型中創建自定義的數據類型]
          • Reference multiple schemas from the same document
            [
            同一個文檔可以引用多個規則]

          Well-Formed is not Enough
          [
          良好格式還并不足夠]

          A well-formed XML document is a document that conforms to the XML syntax rules:
          [
          一個具有良好格式的XML文檔是完全符合XML的語法規則的:]

          • must begin with the XML declaration
            [
            必須由XML聲明開始]
          • must have one unique root element
            [
            必須有且僅有一個根節點]
          • all start tags must match end-tags
            [
            所有標簽都必須有相對的結束標簽]
          • XML tags are case sensitive
            [XML
            的標簽是區分大小寫的]
          • all elements must be closed
            [
            所有的元素都必須是閉合的]
          • all elements must be properly nested
            [
            所有元素都必須合理的嵌套(元素不可以交叉)]
          • all attribute values must be quoted
            [
            所有的屬性都必須被引用]
          • XML entities must be used for special characters
            [
            所有的XML實體都必須用特殊的字符來做]

          Even if documents are Well-Formed they can still contain errors, and those errors can have serious consequences. Think of this situation: you order 5 gross of laser printers, instead of 5 laser printers. With XML Schemas, most of these errors can be caught by your validating software.
          [
          即使文檔完全符合格式也會包含錯誤,而且有些錯誤會有嚴重的邏輯問題.想一想這樣的情況:你訂購五臺激光打印機是為了來替代五臺激光打印機.配合XML Schemas,大部分的錯誤都可以由你的軟件校驗出來的.]

          XSD How To
          [XSD
          如何]


          XML documents can have a reference to a DTD or an XML Schema.
          [XML
          文檔能和一個DTD或者一個XML Schema相關]


          A Simple XML Document
          [
          一個簡單的XML文檔]

          Look at this simple XML document called "note.xml":
          [
          看看這個名為"note.xml"XML文檔]

          <?xml version="1.0"?>

          <note>

          <to>Tove</to>

          <from>Jani</from>

          <heading>Reminder</heading>

          <body>Don't forget me this weekend!</body>

          </note>

           


          A Simple DTD
          [
          一個簡單的DTD]

          This is a simple DTD file called "note.dtd" that defines the elements of the XML document above ("note.xml"):
          [
          這個簡單的DTD"note.dtd"定義了"note.xml"中的元素:]

          <!ELEMENT note (to, from, heading, body)>

          <!ELEMENT to (#PCDATA)>

          <!ELEMENT from (#PCDATA)>

          <!ELEMENT heading (#PCDATA)>

          <!ELEMENT body (#PCDATA)>

          Line 1 defines the note element to have four elements: "to, from, heading, body". Line 2-5 defines the to element to be of the type "#PCDATA", the from element to be of the type "#PCDATA", and so on...
          [
          第一行定義了note元素有四個子元素: "to, from, heading, body".而第二行到第五行分別定義了tofrom等元素為"#PCDATA"]


          A Simple XML Schema
          [
          一個簡單的XML Schema]

          This is a simple XML Schema file called "note.xsd" that defines the elements of the XML document above ("note.xml"):
          [
          這個簡單的XML Schema文件"note.xsd"同樣定義了"note.xml"中的元素:]

          <?xml version="1.0"?>

          <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

          targetNamespace="http://www.w3schools.com"

          xmlns="http://www.w3schools.com"

          elementFormDefault="qualified">

          <xs:element name="note">

              <xs:complexType>

                <xs:sequence>

                  <xs:element name="to" type="xs:string"/>

                  <xs:element name="from" type="xs:string"/>

                  <xs:element name="heading" type="xs:string"/>

                  <xs:element name="body" type="xs:string"/>

                </xs:sequence>

              </xs:complexType>

          </xs:element>

          </xs:schema>

          The note element is said to be of a complex type because it contains other elements. The other elements (to, from, heading, body) are said to be simple types because they do not contain other elements. You will learn more about simple and complex types in the following chapters.
          [
          那個note元素由于包含有其他的子元素而被定義為complex type(復合類型). 其他包含在它里面的元素(to, from, heading, body)都被定義為simple types(簡單類型). 你將會在以后的章節里面學到更多關于復合類型和簡單類型的知識.]


          A Reference to a DTD
          [DTD
          的引用]

          This XML document has a reference to a DTD:
          [
          這個XML文檔引用自一個DTD:]

          <?xml version="1.0"?>

          <!DOCTYPE note SYSTEM

          "http://www.w3schools.com/dtd/note.dtd">

          <note>

          <to>Tove</to>

          <from>Jani</from>

          <heading>Reminder</heading>

          <body>Don't forget me this weekend!</body>

          </note>

           


          A Reference to an XML Schema
          [XML Schema
          的引用]

          This XML document has a reference to an XML Schema:
          [
          這個XML文檔引用自一個XML Schema文檔:]

          <?xml version="1.0"?>

          <note

          xmlns="http://www.w3schools.com"

          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://www.w3schools.com note.xsd">

           

          <to>Tove</to>

          <from>Jani</from>

          <heading>Reminder</heading>

          <body>Don't forget me this weekend!</body>

          </note>

           

          XSD - The <schema> Element
          [XSD
          中的<schema>元素]


          The <schema> element is the root element of every XML Schema!
          [<schema>
          元素是每一個XML Schema文件的根元素!]


          The <schema> Element
          [<schema>
          元素]

          The <schema> element is the root element of every XML Schema:
          [[<schema>
          元素是每一個XML Schema文件的根元素:]

          <?xml version="1.0"?>

          <xs:schema>

          ...

          ...

          </xs:schema>

          The <schema> element may contain some attributes. A schema declaration often looks something like this:
          [[<schema>
          元素包含一些屬性.一般聲明如下:]

          <?xml version="1.0"?>

          <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

          targetNamespace="http://www.w3schools.com"

          xmlns="http://www.w3schools.com"

          elementFormDefault="qualified">

          ...

          ...

          </xs:schema>

          The following fragment:
          [
          以下片段:]

          xmlns:xs="http://www.w3.org/2001/XMLSchema"

          indicates that the elements and data types used in the schema (schema, element, complexType, sequence, string, boolean, etc.) come from the "http://www.w3.org/2001/XMLSchema" namespace. It also specifies that the elements and data types that come from the "http://www.w3.org/2001/XMLSchema" namespace should be prefixed with xs:
          [
          說明元素和數據類型的使用模式(schema, element, complexType, sequence, string, Boolean等等)來自于"命名空間.同時也可用xs:作為前綴]

          This fragment:
          [
          如下片段:]

          targetNamespace="http://www.w3schools.com"

          indicates that the elements defined by this schema (note, to, from, heading, body.) come from the "http://www.w3schools.com" namespace.
          [
          說明元素(note, to, from, heading, body.)的使用模式來自于命名空間"http://www.w3schools.com"]

          This fragment:
          [
          如下片段:]

          xmlns="http://www.w3schools.com"

          indicates that the default namespace is "http://www.w3schools.com".
          [
          說明默認的命名空間是"http://www.w3schools.com".]

          This fragment:
          [
          如下片段:]

          elementFormDefault="qualified"

          indicates that any elements used by the XML instance document which were declared in this schema must be namespace qualified.
          [
          說明所有全局元素的子元素將被以缺省方式放到目標命名空間,連同全局元素或者類型一起]


          Referencing a Schema in an XML Document
          [
          XML文件中引用Schema]

          This XML document has a reference to an XML Schema:
          [
          如下XML文檔有一個XML Schema的引用:]

          <?xml version="1.0"?>

          <note xmlns="http://www.w3schools.com"

          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://www.w3schools.com note.xsd">

          <to>Tove</to>

          <from>Jani</from>

          <heading>Reminder</heading>

          <body>Don't forget me this weekend!</body>

          </note>

          The following fragment:
          [
          下面片段:]

          xmlns="http://www.w3schools.com"

          specifies the default namespace declaration. This declaration tells the schema-validator that all the elements used in this XML document are declared in the "http://www.w3schools.com" namespace.
          [
          聲明默認的命名空間.此聲明告知模式校驗器讓所有XML元素都在命名空間"http://www.w3schools.com"]

          Once you have the XML Schema Instance namespace available:
          [
          有時你可以用到XML模式實例命名空間:]

          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          you can use the schemaLocation attribute. This attribute has two values. The first value is the namespace to use. The second value is the location of the XML schema to use for that namespace:
          [
          你能用上schemaLocation這個屬性.這個屬性有兩個含義.第一個含義是這個命名空間被使用.第二個含義是定位XML schema用到的命名空間:]

          xsi:schemaLocation="http://www.w3schools.com note.xsd"



          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=705007

          posted @ 2007-07-14 00:38 和田雨 閱讀(401) | 評論 (0)編輯 收藏

          RSS

          內容目錄

          RSS Introduction [RSS介紹]
          An introduction to what RSS is and how it can be used.
          介紹什么是RSS,它的應用。

          RSS History [RSS歷史]
          How RSS started and how it has been developed and changed
          RSS是怎么誕生的,它是怎樣發展和變化的.

          RSS Syntax [RSS語法]
          A brief introduction how to make RSS.
          制作RSS的簡單介紹

          RSS Channel [RSS頻道]
          How to make and what can be included in the <channel> element.
          怎么完成<channel>元素里的內容

          RSS Item [RSS內容]- How to make and what can be included in the <item> element.
          怎樣的<item>元素才算合理的

          RSS Publishing [RSS 發布]- How to publish your RSS.
          怎樣發布的你的RSS

          RSS Readers [RSS閱讀器]- How to read other site's RSS.
          怎樣閱讀其他網站的RSS


          RSS介紹
          翻譯:Linyupark / 2006-04-24

          RSS was designed to share data like headlines, links and short descriptions of these.
          RSS 將數據分成像標題,連接和簡單描述的形式。(濃縮過的信息)

          RSS allows fast browsing for news and updates.
          RSS能快速瀏覽新聞和更新內容。


          What You Should Already Know
          哪些是你應該已經知道的

          Before you continue you should have a basic understanding of the following:
          在繼續學習前你應該有下面這些知識點的基礎:

          • HTML / XHTML
          • XML / XML 命名空間

          What is RSS?
          什么是RSS?

          • RSS stands for Really Simple Syndication
            RSS就是 Really Simple Syndication (真正的簡單聚合)
          • RSS allows you to syndicate your site content
            RSS可以聚合你網站上的內容
          • RSS is a selected list of defined items on a site
            RSS是一站點上被選中的內容清單
          • RSS defines an easy way to share and view headlines and content
            RSS是一種更便捷的方法去查看標題和內容
          • RSS files can be automatically updated
            RSS文件可以自動的更新
          • RSS allows personalized views for different sites
            RSS允許更具人性化(個性化)的查看不同的站點
          • RSS is written in XML
            RSS是用XML來書寫的

          Why Use RSS?
          為什么使用RSS?

          RSS was designed to show selected data.
          RSS 能展示被選擇的數據(針對性)

          Without RSS, users will have to check your site daily to check for new updates. This may be too time-consuming for many users. With an RSS feed (RSS is often called a News Feed or RSS Feed) they can check your site faster using an RSS aggregator (a site or program that gathers and sorts out several RSS feeds).
          沒有RSS的話,用戶將必須每天到你的站上看看有沒更新內容。這對于一些用戶來說是很浪費時間的。通過一個RSS feed他們可以使用RSS閱讀器更快的查看你的站是否有更新。

          Since RSS data is small and fast-loading, it can easily be used with services like cell phones or PDA's.
          因為RSS數據很小而且加載速度很快,它可以容易的在手機或PDA服務上使用。

          Web-rings with similar information can easily share data on their sites to make them better and more useful.
          Wb-rings通過相似的信息可以方便的共享他們站點的信息。


          Who Should Use RSS?
          哪些人應該使用RSS?

          Webmasters who seldom update their sites do not need RSS.
          站長如不是經常更新站帶內信息的話可以不使用RSS

          RSS can be useful for Web sites that are updated frequently, like:
          RSS對于那些經常更新的站點來說是和有幫助的,像:

          • News sites - Lists news with title, date and descriptions
            新聞站
          • Site changes - Lists changed pages or new pages
            站點改動信息版塊
          • Companies - Lists news and new products
            公司站 - 新聞 和 新產品
          • Calendars - Lists upcoming events and important days
            日歷

          The Future of RSS
          展望RSS

          RSS is going to be everywhere.
          RSS將遍及每個角落

          Thousands of sites use RSS and more people understand its usefulness every day.
          數千站使用著RSS并且每天有越來越多的人明白了它的有用之處。

          By using RSS, information on the Web becomes easier to find and web developers can spread their information more easily to special interest groups.
          有了RSS,在WEB上的信息變的容易找到并且WEB開發者能夠容易的將信息傳播給興趣小組。

          Hopefully, future RSS versions will include additional fields that will make it even easier to categorize and share.
          未來的RSS版本可能包含額外的領域來使分類和分享信息來的更容易。


          RSS的歷史
          翻譯:Linyupark / 2006-04-24

          RSS has been released in many different versions.
          RSS發布過一些不同的版本


          The History of RSS
          RSS的歷史

          Here is the history of RSS according to Dave Winer (key developer of most of the RSS formats):
          依據Dave Winer(RSS開發的關鍵人物)的描述,RSS有這樣的歷史:

          • Dec. 1997 - Dave Winer developed scriptingNews
            1997年12月 Dave Winer 開發了新聞腳本
             
          • Mar. 1999 - RSS 0.90 was developed by Netscape, which supported the scriptingNews format. This was simply XML with a RDF Header
             1999年三月 - RSS 0.90 由網景公司開發,支持格式化新聞腳本.
          • Jun. 1999 - scriptingNews 2.0b1 was developed by Dave Winer at UserLand. This included Netscape's RSS 0.90 features
            新聞腳本2.0b1于 1999年6月由Dave Winer開發,包含了網景RSS 0.90的特點
             
          • Jul. 1999 - RSS 0.91 was an attempt by Netscape to move towards a more standard format and included most features from scriptingNews 2.0b1 but they removed the RDF header
            1999年7月 - RSS0.91 網景試圖移入更多的標準格式并包含更多來自scriptingNews2.0b1的特性但是他們卻刪除了RDF頭  
          • Jul. 1999 - UserLand uses RSS 0.91 and gets rid of scriptingNews
            1999年7月 - UserLand利用了沒有scriptNews的RSS0.91
             
          • Netscape discontinues their RSS development
             網景中斷了他們對RSS的開發
          • Jun. 2000 - Official RSS 0.91 specification release from UserLand
             UserLand公開了規范文檔
          • Aug. 2000 - RSS 1.0 developed by a group lead by Rael Dornfest at O'Reilly. This format uses RDF and namespaces. Because of its name it is often confused as being a new version of 0.91, but this is a completely new format with no ties to RSS 0.91
             
          • Dec. 2000 - RSS 0.92 developed by Dave Winer at UserLand and includes optional elements
             
          • Sep. 2002 - RSS 2.0 is designed by Dave Winer after leaving Userland
             
          • Jul. 2003 - RSS 2.0 specification released through Harvard under a Creative Commons license

          What Are The differences?
          有什么區別?

          Unlike the other RSS formats, RSS 1.0 was developed using the W3C RDF (Resource Description Framework) standard.
          不像其他RSS的規格,RSS1.0使用W3C的DRF標準開發.


          What RSS Version Should I Use?
          我該用哪個版本的RSS?

          RSS 0.91 and RSS 2.0 are easiest to understand. RSS 1.0 is more complex to learn and takes more time and bandwidth to process.
          RSS0.91和RSS2.0是最容易理解的版本。1.0學起來比較復雜而且需要花更多的帶寬來運作。

          Our tutorial is based on RSS 2.0.
          我們的教程是基于RSS2.0的


          Is There an RSS Web Standard?
          有RSS WEB標準嗎?

          There is no official standard for RSS. But about 50 % of all RSS feeds use the RSS 0.91 format. About 25 % use the RSS 1.0 format and the last 25 % is split between the other RSS 0.9x versions and RSS 2.0.
          沒有正式的RSS標準。但在所有的RSS feeds中大約有50% 使用RSS 0.91規格. 25%使用RSS1.0規格并且至少有25%使用 RSS 0.9x 和 RSS 2.0之間的版本。


          RSS語法
          翻譯:Linyupark / 2006-04-24

          The syntax rules of RSS 2.0 are very simple and very strict.
          RSS2.0的語法規則非常簡單并十分的嚴格。

          This tutorial teaches how to create your own RSS feed and maintain it.
          這個教程會教你如何建立你自己的RSS feed并維護它。


          An Example RSS document
          一個RSS文檔的例子

          RSS documents use a self-describing and simple syntax.
          RSS文檔使用了簡單的自描述語法。

          <?xml version="1.0" encoding="ISO-8859-1" ?>

          <rss version="2.0">
          <channel>

          <title>W3Schools</title>
          <link>http://www.w3schools.com</link>
          <description>W3Schools Web Tutorials </description>
          <item>
          <title>RSS Tutorial</title>

          <link>http://www.w3schools.com/rss</link>
          <description>Check out the RSS tutorial
          on W3Schools.com</description>
          </item>
          </channel>
          </rss>

          The first line in the document - the XML declaration - defines the XML version and the character encoding used in the document. In this case the document conforms to the 1.0 specification of XML and uses the ISO-8859-1 (Latin-1/West European) character set.
          文檔內的第一行為XML聲明-定義了XML的版本和文檔使用的字符編碼。這個例子里文檔使用的是XML1.0版本,編碼為 ISO-8859-1.

          The next line describes the RSS element of the document (like it was saying: "this is an RSS document - version 2.0"):
          下面的一行描述RSS文檔元素(這個就像在說:"這是一份RSS2.0版本的文檔")

          <rss version="2.0">

          The next line describes the <channel> element of the document:
          再下面的一行描述了文檔的<channel>元素:

          <channel>

          The next three lines describe three child elements of the <channel> element (<title>, <link> and <description>):
          接下來的三行描述了<channel>的三個子元素(<title>,<link>,<description>)

          <title>W3Schools</title>
          <link>http://www.w3schools.com</link>

          <description>W3Schools Web Tutorials</description>

          Then there is an <item> element. The <item> element contains the information you would like your RSS feed to show (<title>, <link> and <description>). You can add multiple <item> elements:
          然后就是<item>元素,<item>元素包含了RSS展示的一些信息(<title>, <link> 和 <description>)你可以添加數個<item>元素:

          <item>
          <title>RSS Tutorial</title>
          <link>http://www.w3schools.com/rss</link>
          <description>Check out the RSS tutorial
          on W3Schools.com</description>
          </item>

          Finally, the two last lines close the <channel> and <rss> elements:
          最后的兩行關閉<channel> 和 <rss> 元素:

          </channel>
          </rss>

          Did you understand that this was an RSS feed from W3Schools? Don't you agree that RSS is pretty self-descriptive?
          你明白這是個來自W3S的RSSfeed了不?難道你不認為這是個很好的RSS自我描述?


          RSS is an XML Dialect
          RSS 是一種XML的方言

          Because RSS is XML, there are a couple of things you must remember.
          因為RSS是XML,有一些事你必須了解

          • All XML elements must have a closing tag
            所有XML元素必須有關閉標簽
          • XML tags are case sensitive
            XML標簽區分大小寫
          • All XML elements must be properly nested
            所有XML元素必須合理嵌套
          • Attribute values must always be quoted
            屬性值必須在引號內

          Comments in RSS
          RSS注釋

          The syntax for writing comments in RSS is similar to that of HTML:
          書寫RSS注釋的語法和HTML十分相似:

          <!-- This is a comment -->


          RSS channel元素
          翻譯:Linyupark / 2006-04-24

          The <channel> element is where you describe your RSS feed.
          <channel>元素內是描述RSS feed的地方

          With RSS 2.0 there are a lot of different options for the channel element.
          對于channel元素來說RSS2.0有很多不同的選擇(指內部可選擇的元素有很多種)


          The <channel> Element
          <channel>元素

          The RSS <channel> element is where items are displayed. It is like an RSS headline. Channel elements normally do not change very often.
          RSS的<channel>元素是項目內容顯示的地方。它就像RSS的標題。一般來講它不會頻繁的改動。

          There are three required elements inside the <channel> element: <title>, <link>, and <description>.
          有三個內部元素是必須有的:<title>, <link>, 和 <description>.

          The <title> element should contain a short description of your site and your RSS feed:
          <title>元素里應該包含你的站和你的RSS feed簡短的說明:

          <title>W3Schools News Update</title>

          The <link> element should define the link to your site's main page:
          <link>元素應該定義你網站主頁的鏈界:

          <link>http://www.w3schools.com</link>

          The final required element is <description>. This element should describe your RSS feed.
          最后必須有的元素就是 <description>,這個元素應該描述你的RSS feed.

          <description>W3Schools Web Tutorials</description>


          Optional Elements in <channel>
          <channel>內的可選元素

          Element 元素 Description 描述
          <category> Defines one or more categories the channel belongs to
          定義一個或多個頻道分類
          <cloud> Allows notification of updates.
          允許更新通告
          <copyright> Notifies about copyrighted material
          提醒有關版權
          <docs> An URL to documentation on the RSS version the channel is using
          頻道所使用的RSS版本文檔URL
          <generator> If the channel is created using an automatic generator, this is defined here
          如果頻道是自動生成器產生的,就在這里定義
          <image> Inserts a picture to the channel.
          給頻道加圖片
          <language> Describes what language the channel uses. By using this tag it is possible for RSS aggregators to group sites based on language.
          描述了頻道所使用的語言。
          <lastBuildDate> Defines the last date the channel was modified
          定義頻道最新一次改動的時間
          <managingEditor> Defines an e-mail address for the editor of the site
          定義編輯站點人員的E-mail地址
          <pubDate> Defines the last publication date for the channel
          定義頻帶最新的發布時間
          <rating> Parental control rating of the page
          頁面評估
          <skipDays> Defines days where it is unnecessary for RSS aggregators to update the feed
          <skipHours> Defines hours where it is unnecessary for RSS aggregators to update the feed
          <textInput> Creates a text input for the channel
          <ttl> (ttl = time to live) Defines how many minutes the channel can stay cached before refreshing
          存活的有效時間
          <webMaster> Defines an e-mail address for the webmaster of the site
          定義站張的郵件地址

          RSS item 元素
          翻譯:Linyupark / 2006-04-24

          The <item> element is where you link to and describe the update on your site.
          <item>元素內是你網站連接和描述更新內容的地方。

          With RSS 2.0 there are a lot of different options for the item element.
          在RSS 2.0 item元素里有很多不同的可選內容


          The <item> Element
          <item>元素

          The RSS <item> is where updates are displayed. It is kind of like a headline for an article. <item> elements are created every time there is an update on your site that you would like displayed in your RSS feed.
          <item>是顯示RSS更新內容的地方。它像是文章的標題。當你的站點有更新時RSSfeed中的<item>元素就會被建立起來。

          There are several optional <item> elements, but either the <title> or the <description> are required.
          <item>元素里有幾個可選的元素,但<title> 或是<description>是必須有的。

          A RSS <item> should include the <title>, <link> and <description> elements.
          一個RSS的<item>應該包括 <title>, <link> 和 <description>元素

          The first element is your news item's title. This should be a very short description of your site and your RSS feed:
          第一個元素是項目的題目。應該用十分簡短的描述:

          <title>W3Schools New RSS Tutorial</title>

          The next element is the link to the part of your site the item is referring to:
          接下來的元素項目所關聯的連接:

          <link>http://www.w3schools.com/rss</link>

          The next line is the RSS feed description. This should describe your RSS feed item.
          再下面的一行就是RSS feed的描述部分,這應該是描述你的RSS feed項目的。

          <description>W3Schools RSS Tutorial</description>


          Optional Elements in <item>
          可選的<item>元素

          Tag Description
          <author> Defines the author of the item.
          定義作者
          <category> Places the item in one or more of the channel categories.
          類別
          <comments> An URL to a comment's page for the item.
          針對項目的評論頁URL
          <enclosure> Describes a media object related to the item
          描述一個與項目有關的媒體對象
          <guid> GUID = Globally Unique Identifier. Defines a unique identifier to the item.針對項目定義獨特的標志
          <pubDate> The publication date for the item.
          項目發布時間
          <source> Is used to define a third party source.
          轉載地址(源地址)

          RSS發布
          翻譯:Linyupark / 2006-04-24

          Having a RSS feed is no good unless other people can see it.
          光有RSS feed還是不夠的,應該讓別人能看到它


          Publish Your RSS Feed
          發布你的RSS feed

          Publishing and getting people to notice your RSS feed is as important as making one.
          發布并讓人們注意到的你RSS就和你制作它一樣重要

          First, put your rss.xml file on the internet. You can place it on the same server as your site.
          首先,將你的RSS.xml文件放到你的站點服務器上。

          Next, let people know you have a RSS feed. Register your feed with an aggregator.
          然后,讓人們知道你有一個RSSfeed.到相關的目錄站上注冊你的RSS(下面是一些國外知名的RSS發布站)

          • Syndic8: The largest RSS directory. Syndicate has over 300,000 feeds listed. Register your feed here.
          • Daypop: A large news oriented RSS aggregator. Over 50,000 news oriented feeds. Register your feed here.
          • Newsisfree: A news oriented RSS aggregator. Over 18,000 feeds. Register your feed here.

          Then, place this RSS Logo and this XML Logo with URL's to a page that explains briefly how other people can view your RSS feed.
          接著, 將這兩個含有連接到你RSS地址的圖片放到你站點的頁面上,人們就可以看到你的RSS feed了


          Can I Manage my RSS Feed Myself?
          我可以自行管理RSS feed嗎?

          The best way to be sure your RSS feed includes the things you want, and works the way you want, is to manage it yourself. But this can be very time consuming, especially for pages with a lot of updates.
          如你想讓RSS里包括一些你想要的東西或是想按你的想法來做,最好的辦法就是你自己來管理它,但是這將是非常煩瑣的,因為很多頁有不同的東西要更新。

          Your other alternative is to use a third party automated RSS.
          還有種選擇就是使用第三方的RSS自動生成器


          Automated RSS
          RSS自動生成

          If you don't want to update your RSS feed yourself, there are tools and services you can use to automate it.
          如果你不想自己來更新RSS,這有些工具可以為你服務。
          ===== 以下是幾個工具的官方地址=====

          One such service is MyRSSCreator (featured in "RSS for dummies"), who can offer an automated, reliable RSS service in just 10 minutes.

          There are also free services such as FeedFire, who offers free creation and distribution of RSS feeds.

          For users who just need an easy RSS feed for their personal website, some of the most popular blog (Web Log) managers (like Blogger and Radio) offers built in automated RSS services.


          Validate
          校驗

          You can validate your RSS feed here[校驗地址]. This validator supports all RSS versions.


           

          RSS閱讀器
          翻譯:Linyupark / 2006-04-24

          A RSS reader gathers your news for you.
          一個RSS閱讀器可以為你收集新聞

          RSS readers are available for many different devices and OS.
          RSS閱讀器可以在很多不同的設備和操作系統上運作


          RSS Readers
          [下面是國外的幾款閱讀器]

          There are a lot of different RSS readers. Some work as web services, and some are limited to windows (or Mac, PDA or UNIX). Here are a few I have tried and liked:

          • NewsGator Online - An free online based RSS aggregator. NewsGator Online also includes synchronization with Outlook Edition, viewing content on TV with Media Center Edition, as well as the publication of blogs and headlines.
             
          • RssReader - A free Windows based RSS aggregator. RssReader supports RSS versions 0.9x, 1.0 and 2.0 as well as Atom 0.1, 0.2 and 0.3.
             
          • FeedDemon - A great Windows based RSS aggregator. This is very easy to use and has a very orderly interface. But this is not freeware.
             
          • blogbot - A RSS aggregator plugin for your Outlook or Internet Explorer. The lite version for Internet Explorer is free.

          There are a lot of other RSS readers out there. http://www.ourpla.net/cgi-bin/pikie.cgi?RssReaders has a big list of RSS readers, you can even add your own readers to this page or comment on the existing ones.



          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=704849

          posted @ 2007-07-14 00:37 和田雨 閱讀(569) | 評論 (0)編輯 收藏

          使用遠程桌面鏈接登錄到終端服務器時經常會遇到“終端服務器超出最大允許鏈接數”諸如此類錯誤導致無法正常登錄終端服務器,引起該問題的原因在于終端服務的缺省鏈接數為2個鏈接,并且當登錄遠程桌面后如果不是采用注銷方式退出,而是直接關閉遠程桌面窗口,那么實際上會話并沒有釋放掉,而是繼續保留在服務器端,這樣就會占用總的鏈接數,當這個數量達到最大允許值時就會出現上面的提示。
            解決方式:
            一、用注銷來退出遠程桌面而不是直接關閉窗口
            二、限制已斷開鏈接的會話存在時間
            三、增加最多鏈接數,即設置可連接的數量多些

          第三可采用如下幾種方式來修改:

          1.從終端服務配置中修改:
          打開管理工具里的終端服務配置,再單擊連接,雙擊右邊的RDP-Tcp,彈出RDP-Tcp屬性,選擇網卡,可設置最多連接數,或者設置為無限制的連接數。當然這個值不也能太大,否則會占用較多的系統資源。不過這里修改的值好像不起作用,設置成無限制時照樣還是會出現本文所說的情況。

          修改會話存在時間:運行-Tscc.msc-連接-雙擊RDP-Tcp或右擊-屬性-會話-選中第一個的替代用戶設置(O)-結束已斷開的會話[將默認值“從不”改為一個適當的時間,比如30分鐘]
            
          2.打開“控制面板”,雙擊“添加刪除程序”,單擊“添加刪除Windows組件”*“組件”
          ,在Windows組件向導對話框中選中“終端服務” * “下一步” * “應用服務器” * “下
          一步”,然后按照提示即可改變終端服務的模式。 
          不過聽說用此法,改了應用需要許可證,90天后過期:(

          3.win2003的話可以從組策略修改:
            組策略級別要高于終端服務配置,當啟用組策略后終端服務配置中的相應選項會變成灰色不可修改
            運行-gpedit.msc-計算機配置-管理模板-Windows組件-終端服務
            雙擊右邊的”限制連接數量“-選擇”已啟用“-填入允許的最大連接數

          posted @ 2007-07-12 15:16 和田雨 閱讀(334) | 評論 (0)編輯 收藏

          J2EE可以說指Java在數據庫信息系統上實現,數據庫信息系統從早期的dBase、到Delphi/VBC/S結構,發展到B/SBrowser瀏覽器/Server服務器)結構,而J2EE主要是指B/S結構的實現。

          J2EE又是一種框架和標準,框架類似API、庫的概念,但是要超出它們。

          J2EE是一個虛的大的概念,J2EE標準主要有三種子技術標準:WEB技術、EJB技術和JMS,談到J2EE應該說最終要落實到這三個子概念上。

          這三種技術的每個技術在應用時都涉及兩個部分:容器部分和應用部分,Web容器也是指Jsp/Servlet容器,你如果要開發一個Web應用,無論是編譯或運行,都必須要有Jsp/Servlet庫或API支持(除了JDK/J2SE以外)。

          Web技術中除了Jsp/Servlet技術外,還需要JavaBeansJava Class實現一些功能或者包裝攜帶數據,所以Web技術最初簡稱為Jsp/Servlet+JavaBeans系統。

          談到JavaBeans技術,就涉及到組件構件技術(component),這是Java的核心基礎部分,很多軟件設計概念(設計模式)都是通過JavaBeans實現的。

          JavaBeans不屬于J2EE概念范疇中,如果一個JavaBeans對象被Web技術(也就是Jsp/Servlet)調用,那么JavaBeans就運行在J2EEWeb容器中;如果它被EJB調用,它就運行在EJB容器中。

          EJB(企業JavaBeans)是普通JavaBeans的一種提升和規范,因為企業信息系統開發中需要一個可伸縮的性能和事務、安全機制,這樣能保證企業系統平滑發展,而不是發展到一種規模重新更換一套軟件系統。

          J2EE集群原理: http://www.jdon.com/jive/article.jsp?forum=121&thread=22282

          至此,JavaBeans組件發展到EJB后,并不是說以前的那種JavaBeans形式就消失了,這就自然形成了兩種JavaBeans技術:EJBPOJOPOJO完全不同于EJB概念,指的是普通JavaBeans,而且這個JavaBeans不依附某種框架,或者干脆可以說:這個JavaBeans是你為這個應用程序單獨開發創建的。

          J2EE應用系統開發工具有很多:如JBuilderEclipse等,這些IDE首先是Java開發工具,也就是說,它們首要基本功能是可以開發出JavaBeansJava class,但是如果要開發出J2EE系統,就要落實到要么是Web技術或EJB技術,那么就有可能要一些專門模塊功能,最重要的是,因為J2EE系統區分為容器和應用兩個部分,所以,在任何開發工具中開發J2EE都需要指定J2EE容器。

          J2EE容器分為WEB容器和EJB容器,Tomcat/ResinWeb容器;JBossEJB容器+Web容器等,其中Web容器直接使用Tomcat實現的。所以你開發的Web應用程序可以在上面兩種容器運行,而你開發的Web+EJB應用則只可以在JBoss服務器上運行,商業產品Websphere/Weblogic等和JBoss屬于同一種性質。

          J2EE容器也稱為J2EE服務器,大部分時它們概念是一致的。

          如果你的J2EE應用系統的數據庫連接是通過JNDI獲得,也就是說是從容器中獲得,那么你的J2EE應用系統基本與數據庫無關,如果你在你的J2EE應用系統耦合了數據庫JDBC驅動的配置,那么你的J2EE應用系統就有數據庫概念色彩,作為一個成熟需要推廣的J2EE應用系統,不推薦和具體數據庫耦合,當然這其中如何保證J2EE應用系統運行性能又是體現你的設計水平了。

          高質量的Java企業系統

          衡量J2EE應用系統設計開發水平高低的標準就是:解耦性;你的應用系統各個功能是否能夠徹底脫離?是否不相互依賴,也只有這樣,才能體現可維護性、可拓展性的軟件設計目標。

          為了達到這個目的,誕生各種框架概念,J2EE框架標準將一個系統劃分為WEBEJB主要部分,當然我們有時不是以這個具體技術區分,而是從設計上抽象為表現層、服務層和持久層,這三個層次從一個高度將J2EE分離開來,實現解耦目的。

          因此,我們實際編程中,也要將自己的功能向這三個層次上靠,做到大方向清楚,涇渭分明,但是沒有技術上約束限制要做到這點是很不容易的,因此我們還是必須借助J2EE具體技術來實現,這時,你可以使用EJB規范實現服務層和持久層,Web技術實現表現層;

          EJB為什么能將服務層從Jsp/Servlet手中分離出來,因為它對JavaBeans編碼有強制的約束,現在有一種對JavaBeans弱約束,使用Ioc模式實現的(當然EJB 3.0也采取這種方式),在Ioc模式誕生前,一般都是通過工廠模式來對JavaBeans約束,形成一個服務層,這也是是Jive這樣開源論壇設計原理之一。

          由此,將服務層從表現層中分離出來目前有兩種可選架構選擇:管理普通JavaBeansPOJO)框架(SpringJdonFramework)以及管理EJBEJB框架,因為EJB不只是框架,還是標準,而標準可以擴展發展,所以,這兩種區別將來是可能模糊,被納入同一個標準了。

          但是,通常標準制定是為某個目的服務的,總要犧牲一些換取另外一些,所以,這兩種架構會長時間并存。

          前面談了服務層框架,使用服務層框架可以將JavaBeansJsp/Servlet中分離出來,而使用表現層框架則可以將Jsp中剩余的JavaBeans完全分離,這部分JavaBeans主要負責顯示相關,一般是通過標簽庫(taglib)實現,不同框架有不同自己的標簽庫,Struts是應用比較廣泛的一種表現層框架。

          這樣,表現層和服務層的分離是通過兩種框架達到目的,剩余的就是持久層框架了,通過持久層的框架將數據庫存儲從服務層中分離出來是其目的,持久層框架有兩種方向:直接自己編寫JDBCSQL語句(如iBatis);使用O/R Mapping技術實現的HibernateJDO技術;當然還有EJB中的實體Bean技術。

          持久層框架目前呈現百花齊放,各有優缺點的現狀,所以正如表現層框架一樣,目前沒有一個框架被指定為標準框架,當然,表現層框架現在又出來了一個JSF,它代表的頁面組件概念是一個新的發展方向,但是復雜的實現讓人有些忘而卻步。

          最后,你的J2EE應用系統如果采取上面提到的表現層、服務層和持久層的框架實現,基本可以在無需深刻掌握設計模式的情況下開發出一個高質量的應用系統了。

          還要注意的是: 開發出一個高質量的J2EE系統還需要正確的業務需求理解,那么域建模提供了一種比較切實可行的正確理解業務需求的方法,相關詳細知識可從UML角度結合理解。

          當然,如果你想設計自己的行業框架,那么第一步從設計模式開始吧,因為設計模式提供你一個實現JavaBeans或類之間解耦參考實現方法,當你學會了系統基本單元JavaBeans或類之間解耦時,那么系統模塊之間的解耦你就可能掌握,進而你就可以實現行業框架的提煉了,這又是另外一個發展方向了。

          以上理念可以總結為一句話:

          J2EE開發三件寶: Domain Model(域建模)、patterns(模式)和framework(框架)。

          posted @ 2007-07-12 13:28 和田雨 閱讀(424) | 評論 (2)編輯 收藏

          By Benny.luo@Sun.com, 6/19/07  
          SUN中國軟件技術中心 羅浩/Benny Luo
           簡介:
          JDK 5.0, 代號老虎,在以往的Java傳統上加入了許多新的設計,給Java語言帶來了一些較大的變化,比如泛型,元數據,可變個數參數,靜態導入類,新線程架構,自動裝箱/拆箱等等新的以往沒有的新特性。同時,在調試程序和解決性能各種問題方面,JDK5.0同樣加入了多個分析工具來讓開發者更加方便地調試他們自己的程序,它們包括了命令行調試工具,圖形界面調試工具等等.
           
          JDK5.0包括的調試工具:
          我們在這里對JDK5.0的調試工具做大致的概念性的介紹,然后希望通過介紹我自己在實際工作中使用這些工具解決問題的實例來讓大家對這些工具有更深入的了解。
           
          JDK5.0里面加入了jstack, jconsole, jinfo, jmap, jdb, jstat, jps, 下面對這些工具做簡單介紹:
          • jstack -- 如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 如果現在運行的java程序呈現hung的狀態,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。
          • jconsole – jconsole是基于Java Management Extensions (JMX)的實時圖形化監測工具,這個工具利用了內建到JVM里面的JMX指令來提供實時的性能和資源的監控,包括了Java程序的內存使用,Heap size, 線程的狀態,類的分配狀態和空間使用等等。
          • jinfo – jinfo可以從core文件里面知道崩潰的Java應用程序的配置信息,目前只有在Solaris和Linux的JDK版本里面才有。
          • jmap – jmap 可以從core文件或進程中獲得內存的具體匹配情況,包括Heap size, Perm size等等,目前只有在Solaris和Linux的JDK版本里面才有。< /li>
          • jdb – jdb 用來對core文件和正在運行的Java進程進行實時地調試,里面包含了豐富的命令幫助您進行調試,它的功能和Sun studio里面所帶的dbx非常相似,但 jdb是專門用來針對Java應用程序的。
          • jstat – jstat利用了JVM內建的指令對Java應用程序的資源和性能進行實時的命令行的監控,包括了對Heap size和垃圾回收狀況的監控等等。
          • jps – jps是用來查看JVM里面所有進程的具體狀態, 包括進程ID,進程啟動的路徑等等。

          另外,還有些其他附帶的工具在這里沒有列出,比如Heap Analysis Tool, kill -3 方法等等,這些在JDK5.0之前就有,同樣也是非常有用的性能調優工具,大家可以參照相應的文檔資料來學習,在文章后面也會推薦一些相應的文檔給大家作為參考。

           好,說了這么多,讓我們來看看JDK5.0自帶的這些工具在現實工作能給我們帶來什么幫助,下面是我和ISV一起共同工作的實際例子,在這里把它們簡單闡述出來,希望對大家有所幫助。

          jconsole和jstack使用實例:

          在做過的項目中,曾經有幾個是使用jstack和jconsole來解決問題的。在下面的例子中,由于部分代碼涉及到公司名字,我使用了xxx來代替。

          1. 其中的一個是Web2.0的客戶,由于目前Sun Microsystem公司推出的Niagara服務器系列非常適合網絡方面的多線程應用,并且已經在業界非常出名,所以他們決定使用T2000服務器來測試一下如果應用到他們自己的應用是否能夠獲得出眾的性能。
          整個應用的架構如下:
          Apache 2.0.59 + Resin EE 2.1.17 + Jdk 1.5.0.07 + Oracle 9
          運行的操作系統:
          Solaris 10 Update 3 (11/06), EIS patches包.
          測試工具:
          Apache benchmark tool.
          在客戶的測試環境中,我們分別做了Apache, Resin, Solaris的相應調整,其中包括了Apache使用Prefork模式,并且調整了httpd.conf文件里面相應的ServerLimit, ListenBacklog,Maxclient等等值,Resin服務器調整Jvm heap size, 并行回收new generation和old generation, 最大線程數,oracle連接數等等參數,Solaris操作系統做了網絡和系統的相應調整,最終把整套系統搬進了生產環境,一切順利進行,但當進入其中的一個論壇系統時卻發現系統響應時間非常緩慢,用Apache Benchmark Tool加少量壓力得到結果如下,由于是在生產環境下所以不敢使用大的壓力:

          This is ApacheBench, Version 2.0.41-dev <$Revision: 1.121.2.12 $> apache-2.0
          Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
          Copyright (c) 2006 The Apache Software Foundation, http://www.apache.org/
          Benchmarking free.xxx.com (be patient).....done
          Server Software: Resin/2.1.17
          Server Hostname: free.xxx.com
          Server Port: 8080
          Document Path: /forum/bbsMessageList.act?bbsThreadId=1580107
          Document Length: 27012 bytes
          Concurrency Level: 10
          Time taken for tests: 92.148883 seconds
          Complete requests: 100
          Failed requests: 0
          Write errors: 0
          Keep-Alive requests: 0
          Total transferred: 2722500 bytes
          HTML transferred: 2701200 bytes
          Requests per second: 1.09 [#/sec] (mean)
          Time per request: 9214.888 [ms] (mean)
          Time per request: 921.489 [ms] (mean, across all concurrent requests)
          Transfer rate: 28.84 [Kbytes/sec] received
          Connection Times (ms)
          min mean[+/-sd] median max
          Connect: 0 0 0.0 0 0
          Processing: 9089 9187 139.4 9140 9789
          Waiting: 3067 3163 138.3 3117 3766
          Total: 9089 9187 139.4 9140 9789
          Percentage of the requests served within a certain time (ms)
          50% 9140
          66% 9178
          75% 9189
          80% 9201
          90% 9281
          95% 9560
          98% 9739
          99% 9789
          100% 9789 (longest request)

          每一個請求的響應時間大概去到8-9秒時間,這個是客戶所不能接受的。
           
          這時我們決定采用JDK5.0自帶的jstack來進行trouble-shoot,首先重新做加壓測試,并行請求為10個,總共100個請求,這時對Resin服務器所起的Java進程間隔10秒用jstack做一次采集工作。為什么要間隔10秒?主要是想看看在這三十秒內Java進程是否都阻塞在同一個地方。結果如下:
           
          大部分的線程都阻塞在同一個java stack上面:

          Thread t@38: (state = BLOCKED)
          - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
          - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
          - com._xxx.vportal.common.rpc.session.RemoteServiceGroupFactory.getMaxBalanceFactoryEntry() @bci=165,
          line=180 (Interpreted frame)
          - com._xxx.vportal.common.rpc.session.RemoteServiceGroupFactory.getService() @bci=80, line=195 (Interpreted
          frame)
          - com._xxx.vportal.common.rpc.session.RemoteServiceFactory.getSynSender() @bci=1, line=331 (Interpreted
          frame)
          - com._xxx.vportal.common.rpc.session.RemoteServiceSupport.synRequestHardTask(java.lang.String,
          java.lang.Object) @bci=6, line=35 (Interpreted frame)
          - com._xxx.vportal.amus.user.client.UserClientRpcImpl.getIconSigner(int, int) @bci=36, line=90 (Interpreted frame)
          - net._xxx.forum.model.user.UserInfo.getLogoPath() @bci=109, line=546 (Interpreted frame)
          - sun.reflect.GeneratedMethodAccessor13.invoke(java.lang.Object, java.lang.Object[]) @bci=36 (Interpreted frame)
          - sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=25
          (Compiled frame)
          - org.apache.velocity.runtime.parser.node.ASTReference.execute(java.lang.Object,
          org.apache.velocity.context.InternalContextAdapter) @bci=40, line=207 (Compiled frame)
          - org.apache.velocity.runtime.parser.node.ASTBlock.render(org.apache.velocity.context.InternalContextAdapter,
          java.io.Writer) @bci=18, line=94 (Compiled frame)
          - org.apache.velocity.runtime.parser.node.SimpleNode.render(org.apache.velocity.context.InternalContextAdapter,
          java.io.Writer) @bci=18, line=271 (Interpreted frame)
          -
          org.apache.velocity.runtime.parser.node.ASTIfStatement.render(org.apache.velocity.context.InternalContextAdapter,
          java.io.Writer) @bci=63, line=128 (Interpreted frame)
          - org.apache.velocity.runtime.parser.node.ASTBlock.render(org.apache.velocity.context.InternalContextAdapter,
          java.io.Writer) @bci=18, line=94 (Compiled frame)
          - org.apache.velocity.runtime.directive.Foreach.render(org.apache.velocity.context.InternalContextAdapter,
          java.io.Writer, org.apache.velocity.runtime.parser.node.Node) @bci=95, line=344 (Interpreted frame)
          - org.apache.velocity.runtime.parser.node.ASTDirective.render(org.apache.velocity.context.InternalContextAdapter,
          java.io.Writer) @bci=14, line=153 (Interpreted frame)
          - org.apache.velocity.runtime.parser.node.SimpleNode.render(org.apache.velocity.context.InternalContextAdapter,
          java.io.Writer) @bci=18, line=271 (Interpreted frame)
          - org.apache.velocity.app.Velocity.evaluate(org.apache.velocity.context.Context, java.io.Writer, java.lang.String,
          java.io.Reader) @bci=102, line=359 (Interpreted frame)
          - org.apache.velocity.app.Velocity.evaluate(org.apache.velocity.context.Context, java.io.Writer,
          java.lang.String, java.lang.String) @bci=18, line=253 (Interpreted frame)
          - net._xxx.forum.util.velocity.VelocityUtil.getVelocityEvaluate(java.util.Map, java.io.Writer,
          java.lang.String) @bci=14, line=35 (Interpreted frame)
          - net._xxx.forum.action.forum.BbsMessageListAction.go() @bci=1284, line=268 (Interpreted
          frame)

          net._xxx.forum.action.AbstractAction.execute() @bci=1, line=39 (

          ..............

           和應用的開發人員交流后,發現這些有問題的程序,都是和論壇系統中Socket調用有關,當用戶打開一個頁面是,頁面中的用戶信息需要同過Socket的方式調用相冊那邊的數據,這個操作存在bug,經過用戶的重新同步更新程序,問題解決。
           
          解決后的實測的數據如下, 效果非常理想:
          This is ApacheBench, Version 2.0.41-dev <$Revision: 1.121.2.12 $> apache-2.0
          Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
          Copyright (c) 2006 The Apache Software Foundation, http://www.apache.org/
          Benchmarking free.xxx.com (be patient)
          Completed 5000 requests
          Completed 10000 requests
          Completed 15000 requests
          Completed 20000 requests
          Completed 25000 requests
          Completed 30000 requests
          Completed 35000 requests
          Completed 40000 requests
          Completed 45000 requests
          Finished 50000 requests
          Server Software: Apache/2.0.59
          Server Hostname: free.xxx.com
          Server Port: 80
          Document Path: /forum/bbsMessageList.act?bbsThreadId=1581280
          Document Length: 27508 bytes
          Concurrency Level: 30
          Time taken for tests: 252.583749 seconds
          Complete requests: 50000
          Failed requests: 0
          Write errors: 0
          Total transferred: 1384158363 bytes
          HTML transferred: 1375408188 bytes
          Requests per second: 197.95 [#/sec] (mean)
          Time per request: 151.550 [ms] (mean)
          Time per request: 5.052 [ms] (mean, across all concurrent requests)
          Transfer rate: 5351.56 [Kbytes/sec] received
          Connection Times (ms)
          min mean[+/-sd] median max
          Connect: 0 0 0.4 0 11
          Processing: 45 150 154.1 117 4349
          Waiting: 41 145 153.7 112 4346
          Total: 45 150 154.1 117 4349
          Percentage of the requests served within a certain time (ms)
          50% 117
          66% 142
          75% 163
          80% 180
          90% 241
          95% 321
          98% 478
          99% 764
          100% 4349 (longest re
          2. 另外的一個是最近做的,我們有個教育行業方面的ISV上來實驗室做T2000的Benchmark實驗,我們花了一天的時間部署整個架構,包括安裝Solaris操作系統,應用服務器,數據庫。& amp; amp; lt; /div>
          整個應用的架構如下:
          Tomcat + Jdk 1.5 + Oracle 10g
          運行的操作系統:
          Solaris 10 Update 3 (11/06), EIS patches包.
          測試工具:
          LoadRunner 8.1
          在實驗的初段,Tomcat, Oracle 10g服務器都是架設在T2000上,我們在對T2000服務器的OS,網絡,應用服務器做了必要的調整后,發現其表現還是不盡如人意。& #160;
           
          我們使用Loadrunner做測試,用戶上到了100個同時并發10個迭代時已經出現問題,有許多的請求都被阻塞住,不能正常地進行。
           
          這時我們決定使用jconsole和jstack來看看系統出現了什么問題。
          A. 首先我們需要在Tomcat的啟動腳本catalina.sh里面加入JVM選項:
               Dcom.sun.management.jmxremote
               把tomcat服務器java進程置于JDK5.0的性能監控范圍之內。
           
          B. 然后我們用jconsole連接到tomcat服務器的java進程,發現基本上Heap size, 垃圾回收都比較正常,但發現tomcat服務器的大部分線程有問題,都處于被Block的狀態。
               觀察每條線程的stack trace, 發現它們基本上都被堵塞在uk.org.primrose.pool.core.Pool.put和uk.org.primrose.pool.core.Pool.get()的SyncHack同步機制上,我們嘗試了改大數據連接池的大小,發現結果是一樣的。
          jdk5_1
          C.這個結論在jstack的結果中同樣得到了驗證,使用jstack連接到tomcat服務器java進程,并觀察結果。
          jdk5_2

          D. 最后我們決定用tomcat服務器的連接池配置來代替Primrose數據庫連接池,更改以后,發現結果比較理想。

          E. 后來,我們把Oracle數據庫建立在另外的一臺服務器X4200上,而Tomcat應用服務器依然放在T2000上,使用千兆網絡交換機,同樣地,使用Tomcat服務器自己的連接池配置表現較為理想。
          以上兩個是我對JDK5.0工具的一些實際操作的例子,在這里和大家分享一下,希望對大家有所幫助。而Sun Microsystem公司也在不斷地完善JDK,在新的JDK版本里面加入越來越多的實用的方便開發者開發和調試的新特性,比如在最新的JDK6.0里面就內嵌了Dtrace里面許多關于Java程序中內存,方法,線程等等新的探針,通過這些探針和Dtrace,我們可以更加方便地調試Java程序。
          文檔資料:
          posted @ 2007-07-10 00:04 和田雨 閱讀(463) | 評論 (0)編輯 收藏

          Eclipse(Eclipse 3.2)的最新版本帶有Callisto,一套豐富的針對Eclipse 3.2的可選插件。Callisto包括一個功能強大的分析工具,此工具稱為Eclipse測試與性能工具平臺,簡稱TPTP。TPTP提供了一套功能全面的開源性能-測試和分析工具,包括集成的應用程序監控、測試、跟蹤和分析功能,以及靜態代碼分析工具。對于在各類Java應用程序中找出和識別性能問題,分析工具的價值是不可估計的。在本文中,我們將探討如何使用TPTP來保證獲得高質量和高性能的代碼(甚至是在單元和集成測試中)。

          安裝TPTP

            安裝TPTP最容易的方式是使用Remote Update站點(參見圖1)。打開Remote Update窗口(Help -> Software Updates -> Find and Install),然后選擇Callisto Discovery Site。Eclipse將建議安裝Callisto插件集。TPTP工具列在“Testing and Performance”下面。最容易也是最耗時的選擇,就是安裝所有建議的插件。即使不安裝整個Callisto工具集,您仍然需要安裝一些其他TPTP需要的組件,例如"Charting and Reporting"、"Enabling Features"和"Data Tool Performance"。

          使用Eclipse Callisto分析應用程序圖-1

             圖 1.從遠程站點安裝TPTP

          分析Java應用程序

            測試與性能工具平臺基本上是一套分析工具。分析應用程序通常涉及到觀察應用程序在壓力之下的處理方式。這樣做的一種常見方式是對已部署的應用程序運行一組負載測試,然后使用分析工具來記錄應用程序的行為。接著,可以對結果進行研究來調查任何性能問題。這些事情通常是在項目結束時進行的,因為此時應用程序幾乎已經準備好進入生產階段了。

            TPTP非常適合這類任務。一個典型的用例是使用像JMeter這樣的工具來運行負載測試,然后使用TPTP歸納工具記錄和分析性能統計數據。

            然而,這并非使用TPTP分析應用程序的唯一方式。通常,越早進行測試,后面遇到的問題就越少。借助TPTP,您可以在很多上下文中分析代碼,包括JUnit測試用例、Java 應用程序和web應用程序。而且它很好地集成到了Eclipse IDE中。所以,沒有理由不在早期開始初步性能測試和分析工作。

            TPTP讓您可以測試應用程序行為的幾個方面,包括內存使用(創建了多少對象,這些對象的大小如何)、執行統計數據(應用程序在哪些地方所花的時間較多)和測試覆蓋(測試期間執行代碼的確切數量)。每個方面均可提供有關應用程序性能的獨立信息。

            不管怎么說,內存泄漏可能而且的確存在于Java中。創建(并保存)不必要的對象會增加對內存的需求,并加重垃圾收集器的工作負擔,這都會損害應用程序的性能。而且,如果運行應用程序的服務器的持續正常運行時間很長,累積下來的內存泄漏可能最終導致應用程序崩潰或服務器停止運行。這些都是留心應用程序內存泄漏情況的充分理由。

            根據80-20經驗法則,80%的性能問題出現在20%的代碼中。或者,換句話說,只要把精力集中在應用程序中執行最經常的部分上,就可以花費相對較少的氣力使性能有實質性的提高。在這種情況下,執行統計數據就可以派上用場了。

            除此以外,TPTP還提供一些基本的測試覆蓋數據。盡管這些統計數據不如Cobertura或Clover這樣的專用工具提供的完整,您仍然可以通過它們快速了解性能測試正在有效地測試哪些方法。

            在本文中,我討論的測試種類同樣是沒有經過優化的。優化涉及到使用像緩沖這樣的技術對應用程序性能進行微調。這是一項對技術要求很高的操作,最好留到項目的最后完成。

            這里所討論的這種初步性能測試和分析僅僅包括,確保應用程序從一開始就正確執行,以及沒有編碼錯誤或糟糕的編碼實踐會在后面的階段中對性能產生不利的影響。事實上,修復內存泄漏和避免不必要的對象創建并不是優化——這只不過是調試,而且同樣應該盡可能早地完成。

            讓我們通過使用一些單元測試來分析一個類的方式開始。可以分析常規的單元或集成測試,或者編寫針對性更強的面向性能的測試。通常,您應該嘗試分析與生產代碼最接近的代碼。許多人使用模擬對象來代替DAO對象進行單元測試,使用這項功能強大的技術可以加速開發生命周期。如果使用這類方法,一定要使用這些測試來運行分析工具,它可以揭示有關內存使用和測試覆蓋的有用信息。然而,性能測試的價值是有限的,因為對于與數據庫相關的應用程序來說,其性能往往是由數據庫的性能所決定的,所以在這個上下文中,應該進行所有重要的性能測試。簡而言之,不要忘了分析基于實際數據庫而運行的集成測試。

            出于本文的需要,我們將對以下類進行測試,這個類代表了一個到庫目錄的簡單接口。

          interface Catalog {
          List<Book> findBooksByAuthor(String name);
          List<Book> findAllBooks();
          }
          

            基本的單元測試如下:

          public class CatalogTest extends TestCase {
          ...
          public Catalog getCatalog() {
          ...
          }
          public void testFindBooksByAuthor() {
          List<Book> books = getCatalog().findBooksByAuthor("Lewis");
          }
          public void testLoadFindBooksByAuthor() {
          for(int i = 0; i < 10; i++) {
          List<Book> books
          = getCatalog().findBooksByAuthor("Lewis");
          }
          }
          public void testFindAll() {
          List<Book> books = getCatalog().findAllBooks();
          }
          }
          

            您需要做的第一件事情就是建立一個分析。在Eclipse主菜單中選擇"Run -> Profile",這將打開一個向導,您可以在其中配置不同種類的測試分析,如圖2所示。

          使用Eclipse Callisto分析應用程序圖-2

            圖 2. 創建一個TPTP分析

            在這個例子中,我們感興趣的是JUnit測試分析。雙擊這一項;向導應該為每個單元測試類創建新的項。TPTP相當靈活,您可以在此屏幕中配置各個選項。例如,在Test選項卡上,可以單獨分析單元測試類,也可以按照項目或軟件包對它們進行分組。在Arguments選項卡上,可以指定運行時參數,而在Environment選項卡上可以定義環境變量。在Destination選項卡中,可以指定一個外部文件,用于保存分析數據以供以后使用。但是,最有用的是Monitor選項卡(參見圖3),可以在上面指定要記錄和研究的性能相關數據:

          • Basic Memory Analysis(基本內存分析):這個選項用于記錄內存使用的統計數據,包括對象實例的數量和已經使用的全部內存。
          • Execution Time Analysis(執行時間分析):這個選項用于記錄性能數據——即應用程序分別在每個方法上所花的時間長短。
          • Method Code Coverage(方法代碼覆蓋):這個選項用于通知在測試期間執行了哪些類和方法。

          使用Eclipse Callisto分析應用程序圖-3

             圖 3: 在Monitor選項卡上定義要記錄數據的類型。

            您可以直接從這個窗口運行分析工具,也可以使用位于要分析的測試類上的上下文菜單,方法是選擇Profile As菜單項(參見圖4)。

          使用Eclipse Callisto分析應用程序圖-4

            圖 4:可以使用上下文菜單運行TPTP分析工具。

            運行分析工具可能要花上一段時間,這取決于測試用例的大小。完成之后,Eclipse將顯示一個Profiling Monitor視圖,可以在其中顯示每種類型分析的結果的詳細信息(參見圖5)。

            

          使用Eclipse Callisto分析應用程序圖-5

            圖 5: 分析結果

            Memory Statistics視圖顯示了應用程序創建的對象的數量。結果可以按照軟件包來組織(以樹視圖的形式),或者顯示為類或實例的一個列表。這些數據可以讓您了解每種類型創建了多少個對象;應該對創建的對象(特別是高級對象,例如域對象)不正常的高數量持懷疑態度。

            用于檢測內存泄漏的另一個有用工具是Object References視圖。為了獲得這些數據,您需要激活引用收集。啟動分析之后,點擊monitoring項,然后在上下文菜單中選擇Collect Object References(參見圖6)。接下來,通過上下文菜單(Open with -> Object References)打開Object References視圖。您將獲得一個類的列表,它帶有對每個類的引用的次數。這可以為可能的內存泄漏提供一些線索。

          使用Eclipse Callisto分析應用程序圖-6

            圖 6: 激活引用收集

            如圖7所示,從Execution Statistics視圖可以清楚地了解到應用程序執行到了哪里。"organization by"軟件包可以幫助您找出執行時間最長的類和方法。點擊一個方法將打開Method Invocation Details視圖,它將顯示有關方法被調用次數、調用地點以及它本身調用了哪些其他方法的更詳細信息。盡管與一些可以向下發掘到源代碼本身的商業工具相比,這個視圖與源代碼視圖的集成度沒有那么高,但是它還是可以給出一些重要線索,幫助您找出執行錯誤的方法。

          使用Eclipse Callisto分析應用程序圖-7

            圖 7: Execution Statistics視圖

            Coverage Statistics視圖(參見圖8)提供的信息是關于,您剛剛運行的測試用例使用了(因此至少在某種程度上測試了)哪些方法。覆蓋統計數據是一項優秀的功能,盡管它們提供的信息的詳細程度還無法與像Cobertura、Clover和jcoverage這樣的專業覆蓋工具相提并論(它們可以提供行精度的覆蓋數據,以及行和分支覆蓋的統計數據)。盡管如此,它也有自身的優點,那就是可以提供實時的覆蓋結果,而目前,只有商業的代碼覆蓋工具,例如Clover和jcoverage,才能提供行級別的覆蓋報告和完整的IDE集成。

          使用Eclipse Callisto分析應用程序圖-8

            圖 8: Coverage Statistics視圖

          靜態分析工具

            在TPTP工具箱中,另一件有趣的工具就是靜態分析工具。Java靜態分析工具,例如PMD,允許通過基于一組代碼預定義規則和最佳實踐檢查來檢查代碼,從而自動驗證代碼質量。現在,TPTP也包含一個靜態分析工具。除了提供它自己的一組靜態分析規則之外,這個工具還可以提供一個一致的接口,其他工具廠商可以在這個接口中集成他們自己的規則。

            要對代碼進行靜態分析,需要創建分析配置。在Java視圖或Analysis圖標中,使用上下文菜單打開Analysis窗口,它現在應該出現在工具欄上(參見圖9)。分析配置決定了要分析的代碼(Scope)和應該遵循的規則(Rules)。有71條規則可供選擇,例如"Avoid casting primitive types to lower precision"和"Always provide a break at the end of every case statement"。您還可以使用預定義的規則,例如"Java Quick Code Review"(在這里,71條規則中只有19條適用)。

          使用Eclipse Callisto分析應用程序圖-9

            圖 9:建立靜態分析規則

            要分析代碼,使用工具欄中的Analysis圖標。分析不是實時完成的,就像一些其他的類似工具一樣,例如Checkstyle。然而,給出的結果很清晰(參見圖10):錯誤在源代碼視圖中標出,并且按照錯誤類型,以樹視圖的形式在Analysis Results視圖中列出。"Quick Fix"是一項優雅的特性,它出現在錯誤類型的上下文菜單中,而且如果可能,它可以自動為您糾正問題。

          使用Eclipse Callisto分析應用程序圖-10

            圖 10: 靜態代碼分析結果

          結束語

            Eclipse測試與性能工具平臺是Eclipse IDE工具箱中極具價值的部分。它支持的性能測試的范圍很寬,這有助于從第一個單元測試開始,就確保獲得高質量和高性能的代碼。

            TPTP無疑還比不上一些可用的商業工具,例如OptimizeIt和JProbe,后者的報告和分析功能要更加完善,而且表示通常更加精練。然而,商業的分析工具往往非常昂貴,而且很難在最嚴峻的環境中來驗證它們的使用情況。盡管TPTP還相對較為不成熟,它仍然可算作一款功能強大的產品,毋庸置疑,它可以提供對于許多項目來說不可或缺的有價值的分析數據

          參考資料

           作者簡介
          John Ferguson Smart 從1991年起涉足IT行業,從1999年起開始參與J2EE開發。
          posted @ 2007-07-09 17:56 和田雨 閱讀(289) | 評論 (0)編輯 收藏

          僅列出標題
          共9頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 
          主站蜘蛛池模板: 霍州市| 浙江省| 塔河县| 同仁县| 息烽县| 菏泽市| 呼和浩特市| 讷河市| 浮山县| 西畴县| 卢氏县| 宕昌县| 图们市| 普宁市| 徐水县| 兴安盟| 芜湖市| 姜堰市| 尚志市| 朔州市| 西乌| 鄯善县| 石渠县| 十堰市| 怀宁县| 临潭县| 周口市| 宁城县| 泾川县| 福州市| 舟曲县| 兴城市| 宝兴县| 中阳县| 米易县| 玛沁县| 门源| 阿拉善左旗| 镇平县| 兴山县| 荆州市|