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

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

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

    #

    MySql管理的一點心得

    MySql數據庫是中小型網站后臺數據庫的首選,因為它對非商業應用是免費的.網站開發者可以搭建一個"Linux+Apache+PHP+MySql" 平臺,這是一個最省錢的高效平臺.在使用MySql進行開發時,MySql自帶的文檔對于新手來說是份很好的參考資料.本文是我在使用MySql中的小小 心得。
    當前一般用戶的開發環境多是Windows或Linux,用戶可以到http://www.mysql.com下 載相關版本進行安裝,在 windows中MySql以服務形式存在,在使用前應確保此服務已經啟動,未啟動可用net start mysql命令啟動。而Linux中啟動時可用“/etc/rc.d/init.d/mysqld start"命令,注意啟動者應具有管理員權限。
    剛安裝好的MySql包含一個含空密碼的root帳戶和一個匿名帳戶,這是很大的安全隱患,對于一些重要的應用我們應將安全性盡可能提高,在這里應把匿名帳戶刪除、 root帳戶設置密碼,可用如下命令進行:
    use mysql;
    delete from User where User="";
    update User set Password=PASSWORD('newpassword') where User='root';
    如果要對用戶所用的登錄終端進行限制,可以更新User表中相應用戶的Host字段,在進行了以上更改后應重新啟動數據庫服務,此時登錄時可用如下類似命令:
    mysql -uroot -p;
    mysql -uroot -pnewpassword;
    mysql mydb -uroot -p;
    mysql mydb -uroot -pnewpassword;
    上面命令參數是常用參數的一部分,詳細情況可參考文檔。此處的mydb是要登錄的數據庫的名稱。
    在 進行開發和實際應用中,用戶不應該只用root用戶進行連接數據庫,雖然使用root用戶進行測試時很方便,但會給系統帶來重大安全隱患,也不利于管理技 術的提高。我們給一個應用中使用的用戶賦予最恰當的數據庫權限。如一個只進行數據插入的用戶不應賦予其刪除數據的權限。MySql的用戶管理是通過 User表來實現的,添加新用戶常用的方法有兩個,一是在User表插入相應的數據行,同時設置相應的權限;二是通過GRANT命令創建具有某種權限的用 戶。其中GRANT的常用用法如下:
    grant all on mydb.* to NewUserName@HostName identified by "password" ;
    grant usage on *.* to NewUserName@HostName identified by "password";
    grant select,insert,update on mydb.* to NewUserName@HostName identified by "password";
    grant update,delete on mydb.TestTable to NewUserName@HostName identified by "password";
    若 要給此用戶賦予他在相應對象上的權限的管理能力,可在GRANT后面添加WITH GRANT OPTION選項。而對于用插入User表添加的用戶,Password字段應用PASSWORD 函數進行更新加密,以防不軌之人竊看密碼。對于那些已經不用的用戶應給予清除,權限過界的用戶應及時回收權限,回收權限可以通過更新User表相應字段, 也可以使用REVOKE操作。
    下面給出本人從其它資料(www.cn-java.com)獲得的對常用權限的解釋:
    全局管理權限:
    FILE: 在MySQL服務器上讀寫文件。
    PROCESS: 顯示或殺死屬于其它用戶的服務線程。
    RELOAD: 重載訪問控制表,刷新日志等。
    SHUTDOWN: 關閉MySQL服務。
    數據庫/數據表/數據列權限:
    ALTER: 修改已存在的數據表(例如增加/刪除列)和索引。
    CREATE: 建立新的數據庫或數據表。
    DELETE: 刪除表的記錄。
    DROP: 刪除數據表或數據庫。
    INDEX: 建立或刪除索引。
    INSERT: 增加表的記錄。
    SELECT: 顯示/搜索表的記錄。
    UPDATE: 修改表中已存在的記錄。
    特別的權限:
    ALL: 允許做任何事(和root一樣)。
    USAGE: 只允許登錄--其它什么也不允許做。
    最后給出本人在RedHat9.0下的MySql操作演示:
    選用數據庫的root用戶登錄
    [weiwen@weiwenlinux]$mysql -uroot -p
    Enter password:MyPassword
    mysql>create database mydb;
    Query OK, 1 row affected (0.02 sec)
    mysql>use mydb;
    Database changed
    mysql>create table TestTable(Id int aut_increment primary key,
    UserName varchar(16) not null,
    Address varchar(255));
    Query OK, 0 rows affected (0.02 sec)
    mysql>grant all on mydb.* to test@localhost identified by "test";
    Query OK, 0 rows affected (0.01 sec)
    mysql>quit
    Bye
    [weiwen@weiwenlinux]$mysql mydb -utest -ptest
    其中test.sql是用vi編輯好的SQL腳本,其內容為:
    Insert into TestTable(UserName,Address)values('Tom','shanghai');
    Insert into TestTable(UserName,Address)values('John','beijing');
    select * from TestTable;
    運行已經編輯好的SQL腳本可以用source filename 或 . filename。
    以上只是對新手的簡單練習,要成為一個數據庫好手,當以孜孜不倦地追求知識,不斷地思考、嘗試、再思考。

    posted @ 2008-04-13 01:53 金家寶 閱讀(248) | 評論 (0)編輯 收藏

    mysql命令行常用命令(非常基礎的幾個命令)

    ? 第一招、mysql服務的啟動和停止

      net stop mysql

      net start mysql

      第二招、登陸mysql

      語法如下: mysql -u用戶名 -p用戶密碼

      鍵入命令mysql -uroot -p, 回車后提示你輸入密碼,輸入12345,然后回車即可進入到mysql中了,mysql的提示符是:

      mysql>

      注意,如果是連接到另外的機器上,則需要加入一個參數-h機器IP

      第三招、增加新用戶

      格式:grant 權限 on 數據庫.* to 用戶名@登錄主機 identified by "密碼"

      如,增加一個用戶user1密碼為password1,讓其可以在本機上登錄, 并對所有數據庫有查詢、插入、修改、刪除的權限。首先用以root用戶連入mysql,然后鍵入以下命令:

      grant select,insert,update,delete on *.* to user1@localhost Identified by "password1";

      如果希望該用戶能夠在任何機器上登陸mysql,則將localhost改為"%"。

      如果你不想user1有密碼,可以再打一個命令將密碼去掉。

      grant select,insert,update,delete on mydb.* to user1@localhost identified by "";

      第四招: 操作數據庫

      登錄到mysql中,然后在mysql的提示符下運行下列命令,每個命令以分號結束。

      1、 顯示數據庫列表。

      show databases;

      缺省有兩個數據庫:mysql和test。 mysql庫存放著mysql的系統和用戶權限信息,我們改密碼和新增用戶,實際上就是對這個庫進行操作。

      2、 顯示庫中的數據表:

      use mysql;

      show tables;

      3、 顯示數據表的結構:

      describe 表名;

      4、 建庫與刪庫:

      create database 庫名;

      drop database 庫名;

      5、 建表:

      use 庫名;

      create table 表名(字段列表);

      drop table 表名;

      6、 清空表中記錄:

      delete from 表名;

      7、 顯示表中的記錄:

      select * from 表名;

      第五招、導出和導入數據

      1. 導出數據:

      mysqldump --opt test > mysql.test

      即將數據庫test數據庫導出到mysql.test文件,后者是一個文本文件

      如:mysqldump -u root -p123456 --databases dbname > mysql.dbname

      就是把數據庫dbname導出到文件mysql.dbname中。

      2. 導入數據:

      mysqlimport -u root -p123456 < mysql.dbname。

      不用解釋了吧。

      3. 將文本數據導入數據庫:

      文本數據的字段數據之間用tab鍵隔開。

      use test;

      load data local infile "文件名" into table 表名;

    posted @ 2008-04-13 01:20 金家寶 閱讀(266) | 評論 (0)編輯 收藏

    MYSQL基本常識·~

    MySQL名字的來歷
    MySQL最初的開發者的意圖是用mSQL和他們自己的快速低級例程(ISAM)去連接表格。不管怎樣,在經過一些測試后,開發者得出結論:mSQL并沒有他們需要的那么快和靈活。這導致了一個使用幾乎和mSQL一樣的API接口的用于他們的數據庫的新的SQL接口的產生,這樣,這個API被設計成允許為用于mSQL而寫的第三方代碼更容易移植到MySQL。
    MySQL這個名字是怎么來的已經不清楚了。基本指南和大量的庫和工具帶有前綴“my”已經有10年以上,而且不管怎樣,MySQL AB創始人之一的Monty Widenius的女兒也叫My。這兩個到底是哪一個給出了MySQL這個名字至今依然是個密,包括開發者在內也不知道。
    MySQL的海豚標志的名字叫“sakila”,它是由MySQL AB的創始人從用戶在“海豚命名”的競賽中建議的大量的名字表中選出的。獲勝的名字是由來自非洲斯威士蘭的開源軟件開發者Ambrose Twebaze提供。根據Ambrose所說,Sakila來自一種叫SiSwati的斯威士蘭方言,也是在Ambrose的家鄉烏干達附近的坦桑尼亞的Arusha的一個小鎮的名字。

    MySQL的概述
    MySQL是一個小型關系型數據庫管理系統,開發者為瑞典MySQL AB公司。目前MySQL被廣泛地應用在Internet上的中小型網站中。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網站為了降低網站總體擁有成本而選擇了MySQL作為網站數據庫。

    MySQL的特性
    1.使用C和C++編寫,并使用了多種編譯器進行測試,保證源代碼的可移植性
    2.支持AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種操作系統
    3.為多種編程語言提供了API。這些編程語言包括C、C++、Eiffel、Java、PerlPHP、Python、Ruby和Tcl等。
    4.支持多線程,充分利用CPU資源
    5.優化的SQL查詢算法,有效地提高查詢速度
    6.既能夠作為一個單獨的應用程序應用在客戶端服務器網絡環境中,也能夠作為一個庫而嵌入到其他的軟件中提供多語言支持,常見的編碼如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作數據表名和數據列名
    7.提供TCP/IP、ODBC和JDBC等多種數據庫連接途徑
    8.提供用于管理、檢查、優化數據庫操作的管理工具
    9.可以處理擁有上千萬條記錄的大型數據庫

    MySQL的應用

    與其他的大型數據庫例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之處,如規模小、功能有限(MySQL不支持視圖(已經被列入5.1版的開發計劃)、事件等)等,但是這絲毫也沒有減少它受歡迎的程度。對于一般的個人使用者和中小型企業來說,MySQL提供的功能已經綽綽有余,而且由于MySQL是開放源碼軟件,因此可以大大降低總體擁有成本。

    目前Internet上流行的網站構架方式是LAMP(Linux+Apache+MySQL+PHP),即使用Linux作為操作系統,Apache作為Web服務器,MySQL作為數據庫,PHP作為服務器端腳本解釋器。由于這四個軟件都是遵循GPL的開放源碼軟件,因此使用這種方式不用花一分錢就可以建立起一個穩定、免費的網站系統。

    MySQL管理

    可以使用命令行工具管理MySQL數據庫(命令mysql 和 mysqladmin),也可以從MySQL的網站下載圖形管理工具MySQL Administrator和MySQL Query Browser。

    phpMyAdmin是由php寫成的MySQL資料庫系統管理程式,讓管理者可用Web介面管理MySQL資料庫。

    phpMyBackupPro也是由PHP寫成的,可以透過Web介面創建和管理數據庫。它可以創建偽cronjobs,可以用來自動在某個時間或周期備份MySQL 數據庫。


    Mysql存儲引擎

    MyISAM? ?? ?Mysql的默認數據庫,最為常用。擁有較高的插入,查詢速度,但不支持事務
    InnoDB? ?? ?事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定
    BDB? ?? ?? ?源自Berkeley DB,事務型數據庫的另一種選擇,支持COMMIT和ROLLBACK等其他事務特性
    Memory? ?? ?所有數據置于內存的存儲引擎,擁有極高的插入,更新和查詢效率。但是會占用和數據量成正比的內存空間。并且其內容會在Mysql重新啟動時丟失
    Merge? ?? ? 將一定數量的MyISAM表聯合而成一個整體,在超大規模數據存儲時很有用
    Archive? ???非常適合存儲大量的獨立的,作為歷史記錄的數據。因為它們不經常被讀取。Archive擁有高效的插入速度,但其對查詢的支持相對較差
    Federated? ?將不同的Mysql服務器聯合起來,邏輯上組成一個完整的數據庫。非常適合分布式應用
    Cluster/NDB 高冗余的存儲引擎,用多臺數據機器聯合提供服務以提高整體性能和安全性。適合數據量大,安全和性能要求高的應用
    CSV? ?? ?? ?邏輯上由逗號分割數據的存儲引擎
    BlackHole? ?黑洞引擎,寫入的任何數據都會消失

    另外,Mysql的存儲引擎接口定義良好。有興趣的開發者通過閱讀文檔編寫自己的存儲引擎。

    Mysql最常見的應用架構
    單點(Single),適合小規模應用
    復制(Replication),適合中小規模應用
    集群(Cluster),適合大規模應用


    Mysql中文視頻教學

    左光華的mysql網絡數據庫開發教學視頻http://www.tudou.com/playlist/mysql/
    Mysql6.0的alpha版于2007年初發布,新版增加了對falcon存儲引擎的支持。Falcon是Mysql社區自主開發的引擎,支持ACID特性事務,支持行鎖,擁有高性能的并發性。Mysql AB公司想用Falcon替代已經非常流行的InnoDB引擎,因為擁有后者技術的InnoBase已經被競爭對手Oracle所收購。

    2008年1月16日,Sun Microsystems宣布收購MySQL AB,出價約10億美元現金外加期權。 http://www.mysql.com/news-and-events/sun-to-acquire-mysql.html

    posted @ 2008-04-12 12:37 金家寶 閱讀(283) | 評論 (0)編輯 收藏

    MySQL數據備份(包含一些常用處理工具名稱)

    ?

      在數據庫表丟失或損壞的情況下,備份你的數據庫是很重要的。如果發生系統崩潰,你肯定想能夠將你的表盡可能丟失最少的數據恢復到崩潰發生時的狀態。有時,正是 MySQL 管理員造成破壞。管理員已經知道表已破壞,用諸如 vi 或 Emacs 等編輯器試圖直接編輯它們,這對表絕對不是件好事!

      備份數據庫兩個主要方法是用 mysqldump 程序或直接拷貝數據庫文件(如用 cp、cpio 或 tar 等)。每種方法都有其優缺點:

      mysqldump 與 MySQL 服務器協同操作。直接拷貝方法在服務器外部進行,并且你必須采取措施保證沒有客戶正在修改你將拷貝的表。如果你想用文件系統備份來備份數據庫,也會發生同樣的問題:如果數據庫表在文件系統備份過程中被修改,進入備份的表文件主語不一致的狀態,而對以后的恢復表將失去意義。文件系統備份與直接拷貝文件的區別是對后者你完全控制了備份過程,這樣你能采取措施確保服務器讓表不受干擾。

      mysqldump 比直接拷貝要慢些。

      mysqldump 生成能夠移植到其它機器的文本文件,甚至那些有不同硬件結構的機器上。直接拷貝文件不能移植到其它機器上,除非你正在拷貝的表使用 MyISAM 存儲格式。ISAM 表只能在相似的硬件結構的機器上拷貝。在 MySQL 3.23 中引入的 MyISAM 表存儲格式解決了該問題,因為該格式是機器無關的,所以直接拷貝文件可以移植到具有不同硬件結構的機器上。只要滿足兩個條件:另一臺機器必須也運行 MySQL 3.23 或以后版本,而且文件必須以 MyISAM 格式表示,而不是 ISAM 格式。

      不管你使用哪種備份方法,如果你需要恢復數據庫,有幾個原則應該遵守,以確保最好的結果:

      定期實施備份。建立一個計劃并嚴格遵守。

      讓服務器執行更新日志。當你在崩潰后需要恢復數據時,更新日志將幫助你。在你用備份文件恢復數據到備份時的狀態后,你可以通過運行更新日志中的查詢再次運用備份后面的修改,這將數據庫中的表恢復到崩潰發生時的狀態。

      以文件系統備份的術語講,數據庫備份文件代表完全傾倒(full dump),而更新日志代表漸進傾倒(incremental dump)。

      使用一種統一的和易理解的備份文件命名機制。象 backup1、buckup2 等不是特別有意義。當實施你的恢復時,你將浪費時間找出文件里是什么東西。你可能發覺用數據庫名和日期構成備份文件名會很有用。例如:

      %mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02

      %mysqldump menagerie >/usr/archives/mysql/menagerie.1999-10-02

      你可能想在生成備份后壓縮它們。備份一般都很大!你也需要讓你的備份文件有過期期限以避免它們填滿你的磁盤,就象你讓你的日志文件過期那樣。

      用文件系統備份備份你的備份文件。如果遇上了一個徹底崩潰,不僅清除了你的數據目錄,也清除了包含你的數據庫備份的磁盤驅動器,你將真正遇上了麻煩。

      也要備份你的更新日志。

      將你的備份文件放在不同于用于你的數據庫的文件系統上。這將降低由于生成備份而填滿包含數據目錄的文件系統的可能性。

      用于創建備份的技術同樣對拷貝數據庫到另一臺機器有用。最常見地,一個數據庫被轉移到了運行在另一臺主機上的服務器,但是你也可以將數據轉移到同一臺主機上的另一個服務器。

      1 使用 mysqldump 備份和拷貝數據庫

      當你使用 mysqldumo 程序產生數據庫備份文件時,缺省地,文件內容包含創建正在傾倒的表的 CREATE 語句和包含表中行數據的 INSERT 語句。換句話說,mysqldump 產生的輸出可在以后用作 mysql 的輸入來重建數據庫。

      你可以將整個數據庫傾倒進一個單獨的文本文件中,如下:

      %mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02

      輸出文件的開頭看起來象這樣:

      # MySQL Dump 6.0# # Host: localhost Database: samp_db#-------------

      --------------------------# Server version 3.23.2-alpha-log## Table st

      ructure for table absence#CREATE TABLE absence( student_id int(10)

      unsigned DEFAULT 0 NOT NULL, date date DEFAULT 0000-00-00 NOT NUL

      L, PRIMARY KEY (student_id,date));## Dumping data for table absence

      #INSERT INTO absence valueS (3,1999-09-03);INSERT INTO absence value

      S (5,1999-09-03);INSERT INTO absence valueS (10,1999-09-08);......

      文件剩下的部分有更多的INSERT和CREATE TABLE語句組成。如果你想壓縮備份,使用類似如下的命令:

      %mysqldump samp_db | gzip >/usr/archives/mysql/samp_db.1999-10-02.gz

      如果你要一個龐大的數據庫,輸出文件也將很龐大,可能難于管理。如果你愿意,你可以在 mysqldump 命令行的數據庫名后列出單獨的表名來傾到它們的內容,這將傾倒文件分成較小、更易于管理的文件。下例顯示如何將 samp_db 數據庫的一些表傾到進分開的文件中:

      %mysqldump samp_db student score event absence >grapbook.sql

      %mysqldump samp_db member president >hist-league.sql

      如果你生成準備用于定期刷新另一個數據庫內容的備份文件,你可能想用 --add- drop-table 選項。這告訴服務器將 DROP TABLE IF EXISTS 語句寫入備份文件,然后,當你取出備份文件并把它裝載進第二個數據庫時,如果表已經存在,你不會得到一個錯誤。

      如果你倒出一個數據庫以便能把數據庫轉移到另一個服務器,你甚至不必創建備份文件。要保證數據庫存在于另一臺主機,然后用管道傾倒數據庫,這樣 mysql 能直接讀取 mysqldump 的輸出。例如:你想從主機 pit- viper.snake.net 拷貝數據庫 samp_db 到 boa.snake.net,可以這樣很容易做到:

      %mysqladmin -h boa.snake.net create samp_db

      %mysqldump samp_db | mysql -h boa.snake.net samp_db

      以后,如果你想再次刷新 boa.snake.net 上的數據庫,跳過 mysqladmin 命令,但要對 mysqldump 加上--add-drop-table 以避免的得到表已存在的錯誤:

      %mysqldump --add-drop-table samp_db | mysql -h boa.snake.net samp_db

      mysqldump 其它有用的選項包括:

      --flush-logs 和 --lock-tables 組合將對你的數據庫檢查點有幫助。--lock-tables 鎖定你正在傾倒的所有表,而 --flush-logs 關閉并重新打開更新日志文件,新的更新日志將只包括從備份點起的修改數據庫的查詢。這將設置你的更新日志檢查點位備份時間。(然而如果你有需要執行個更新的客戶,鎖定所有表對備份期間的客戶訪問不是件好事。)

      如果你使用 --flush-logs 設置檢查點到備份時,有可能最好是傾倒整個數據庫。

      如果你傾倒單獨的文件,較難將更新日志檢查點與備份文件同步。在恢復期間,你通常按數據庫為基礎提取更新日志內容,對單個表沒有提取更新的選擇,所以你必須自己提取它們。

      缺省地,mysqldump 在寫入前將一個表的整個內容讀進內存。這通常確實不必要,并且實際上如果你有一個大表,幾乎是失敗的。你可用 --quick 選項告訴 mysqldump 只要它檢索出一行就寫出每一行。為了進一步優化傾倒過程,使用 --opt 而不是 --quick。--opt 選項打開其它選項,加速數據的傾倒和把它們讀回。

      用 --opt 實施備份可能是最常用的方法,因為備份速度上的優勢。然而,要警告你,--opt 選項確實有代價,--opt 優化的是你的備份過程,不是其他客戶對數據庫的訪問。--opt 選項通過一次鎖定所有表阻止任何人更新你正在傾倒的任何表。你可在一般數據庫訪問上很容易看到其效果。當你的數據庫一般非常頻繁地使用,只是一天一次地調節備份。

      一個具有 --opt 的相反效果的選項是 --dedayed。該選項使得 mysqldump 寫出 INSERT DELAYED 語句而不是 INSERT 語句。如果你將數據文件裝入另一個數據庫并且你想是這個操作對可能出現在該數據庫中的查詢的影響最小,--delayed 對此很有幫助。

      --compress 選項在你拷貝數據庫到另一臺機器上時很有幫助,因為它減少網絡傳輸字節的數量。下面有一個例子,注意到 --compress 對與遠端主機上的服務器通信的程序才給出,而不是對與本地主機連接的程序:

      %mysqldump --opt samp_db | mysql --compress -h boa.snake.net samp_db

      2 使用直接拷貝數據庫的備份和拷貝方法

      另一種不涉及 mysqldump 備份數據庫和表的方式是直接拷貝數據庫表文件。典型地,這用諸如 cp、tar 或 cpio 實用程序。本文的例子使用 cp。

      當你使用一種直接備份方法時,你必須保證表不在被使用。如果服務器在你則正在拷貝一個表時改變它,拷貝就失去意義。

      保證你的拷貝完整性的最好方法是關閉服務器,拷貝文件,然后重啟服務器。如果你不想關閉服務器,要在執行表檢查的同時鎖定服務器。如果服務器在運行,相同的制約也適用于拷貝文件,而且你應該使用相同的鎖定協議讓服務器“安靜下來”。

      假設服務器關閉或你已經鎖定了你想拷貝的表,下列顯示如何將整個 samp_db 數據庫備份到一個備份目錄(DATADIR 表示服務器的數據目錄):

      %cd DATADIR%cp -r samp_db /usr/archive/mysql

      單個表可以如下備份:

      %cd DATADIR/samp_db%cp member.* /usr/archive/mysql/samp_db%cp score.*

      /usr/archive/mysql/samp_db ....

      當你完成了備份時,你可以重啟服務器(如果關閉了它)或釋放加在表上的鎖定(如果你讓服務器運行)。

      要用直接拷貝文件把一個數據庫從一臺機器拷貝到另一臺機器上,只是將文件拷貝到另一臺服務器主機的適當數據目錄下即可。要確保文件是 MyIASM 格式或兩臺機器有相同的硬件結構,否則你的數據庫在另一臺主機上有奇怪的內容。你也應該保證在另一臺機器上的服務器在你正在安裝數據庫表時不訪問它們。

      3 復制數據庫(Replicating Database)

      復制(Replication)類似于拷貝數據庫到另一臺服務器上,但它的確切含義是實時地保證兩個數據庫的完全同步。這個功能將在 3.23 版中出現,而且還不很成熟,因此本文不作詳細介紹。

      4 用備份恢復數據

      數據庫損壞的發生有很多原因,程度也不同。如果你走運,你可能僅損壞一兩個表(如掉電),如果你倒霉,你可能必須替換整個數據目錄(如磁盤損壞)。在某些情況下也需要恢復,比如用戶錯誤地刪除了數據庫或表。不管這些倒霉事件的原因,你將需要實施某種恢復。

      如果表損壞但沒丟失,嘗試用 myisamchk 或 isamchk 修復它們,如果這樣的損壞可有修復程序修復,你可能根本不需要使用備份文件。

      恢復過程涉及兩種信息源:你的備份文件和個更新日志。備份文件將表恢復到實施備份時的狀態,然而一般表在備份與發生問題之間的時間內已經被修改,更新日志包含了用于進行這些修改的查詢。你可以使用日志文件作為 mysql 的輸入來重復查詢。這已正是為什么要啟用更新日志的原因。

      恢復過程視你必須恢復的信息多少而不同。實際上,恢復整個數據庫比單個表跟容易,因為對于數據庫運用更新日志比單個表容易。

      4.1 恢復整個數據庫

      首先,如果你想恢復的數據庫是包含授權表的 mysql 數據庫,你需要用 --skip -grant-table 選項運行服務器。否則,它會抱怨不能找到授權表。在你已經恢復表后,執行 mysqladmin flush-privileges 告訴服務器裝載授權標并使用它們。

      將數據庫目錄內容拷貝到其它某個地方,如果你在以后需要它們。

      用最新的備份文件重裝數據庫。如果你用 mysqldump 產生的文件,將它作為 mysql 的輸入。如果你用直接從數據庫拷貝來的文件,將它們直接拷回數據庫目錄,然而,此時你需要在拷貝文件之前關閉數據庫,然后重啟它。

      使用更新日志重復做備份以后的修改數據庫表的查詢。對于任何可適用的更新日志,將它們作為 mysql 的輸入。指定 --one-database 選項使得 mysql 只執行你有興趣恢復的數據庫的查詢。如果你知道你需要運用所有更新日志文件,你可以在包含日志的目錄下使用這條命令:

      % ls -t -r -1 update.[0-9]* | xargs cat | mysql --one-database db_name

      ls 命令生成更新日志文件的一個單列列表,根據服務器產生它們的次序排序(主意:如果你修改任何一個文件,你將改變排序次序,這導致更新日志一錯誤的次序被運用。)

      很可能你會是運用某幾個更新日志。例如,自從你備份以來產生的更新日志被命名為 update.392、update.393 等等,你可以這樣重新運行:

      %mysql --one-database db_name < update.392

      %mysql --one-database db_name < update.393

      .....

      如果你正在實施恢復且使用更新日志恢復由于一個錯誤建議的 DROP DATABASE、DROP TABLE 或 DELETE 語句造成丟失的信息,在運用更新日志之前,要保證從其中刪除這些語句。

      4.2 恢復單個表

      恢復單個表較為復雜。如果你用一個由 mysqldump 生成的備份文件,并且它不包含你感興趣的表的數據,你需要從相關行中提取它們并將它們用作 mysql 的輸入。這是容易的部分。難的部分是從只運用于該表的更新日志中拉出片斷。你會發覺 mysql_find_rows 實用程序對此很有幫助,它從更新日志中提取多行查詢。

      另一個可能性是使用另一臺服務器恢復整個數據庫,然后拷貝你想要的表文件到原數據庫中。這可能真的很容易!當你將文件拷回數據庫目錄時,要確保原數據庫的服務器關閉。

    posted @ 2008-04-12 11:35 金家寶 閱讀(410) | 評論 (0)編輯 收藏

    關于JAVA的分頁查詢操作技術

      Servlet版性能測試

      主要考慮的Servlet版運行方式有:

      一:Servlet在Web容器中的運行機制

      1. 單獨一個無狀態的Servlet實例運行

      即Web容器里的多個線程調用一個Servlet實例的運行方式

      2. 多個Servlet實例

      在Web容器中有多個Servlet實例的對象池,并有多個Web容器線程來分別調用執行

      二:Servlet 連接數據庫的方式

      1. 一對一

      即可每個Servlet實例都有直接的數據庫連接。

      具體方式有:

      1> 在Servlet實例的每個處理方法中每次都調用數據庫連接,然后用此連接進行數據庫的查詢等操作,最后關閉并釋放此連接。

      2> 在Servlet實例的初始化操作時就連接一個“長”的數據庫連接,直到Servlet實例在destroy時關閉并釋放此數據庫連接。

      因為現在的數據庫操作主要是查詢,沒有對數據庫的增加、修改等操作,多用戶業務查詢、Web容器多線程同時對一個Servlet的同一個數據庫連接進行操作應該會沒有數據操作同步等問題。

      2. 使用Web容器的數據源

      這里主要是使用Web容器的數據源-數據庫連接池。

      在理論上這種方式能提供最佳的性能。這是也是測試各種Web容器產品在數據庫連接池上實現的性能情況。

      這里主要看Web容器的在各種應用情況下的最優化配置。

      Servlet與數據源連接的實現方式:

      Servlet直接從Web容器配置中取得數據源及其連接對象,然后通過此連接對象來操作數據庫。對于數據庫連接對象的管理由Web容器來管理。

      三:要考慮的問題:

      1. 大數據量傳輸問題

      大數據量通過Servlet實例從數據庫中取得并整理后,如何有效的傳輸到客戶端IE,并且Servlet實例如何有效在Web容器中處理這些大數據量。

      2. 對各種JDBC版本的測試

      即不同的數據庫使用其自己專用的JDBC來連接,在性能上應該要好一些。

      這里也可比較Weblogic Server中實現JDBC與各種數據庫(MSSQL、Oracle)專用的差別,從測試的結果看出Weblogic Server的技術實例以及是否真正做到了數據庫連接等處理的優化了嗎。

      3. Weblogic Server的優化配置

      3.1 對象池配置

      包括應用邏輯處理對象的對象池化以及使用數據源時的數據庫連接對象池在各種具體應用環境下的優化配置。

      3.2 線程池配置

      以上兩個方面涉及到對象池化和串行化處理的策略。

      3.3 Weblogic Server 的配置的各種參數的相應情況下的配置

      1> JAVA VM (JAVA 虛擬機)參數在各種應用情況下的配置。

      2> Weblogic Server 本身的各種參數配置。

      鑒于以上的考慮對Servlet版的測試規劃為以下幾種測試用例:

      序號 部署包名(*.JAR *.WAR *.EAR 等) 數據源配置 Weblogic Server

      的配置 預期結果 說明 可能出現的問題和現象

      1 ServletQueryForPerConn.war 在每此業務處理時創建數據庫連接,操作完畢后關閉并釋放。

      通過Web.xml配置文件來配置JDBC的驅動類型和連接。 直接部署ServletQueryForPerConn.jar部署包。

      Web容器中只有一個Serverlet實例。

      建議配置較多的線程數量。

      性能差。

      在每此業務處理時創建數據庫連接,操作完畢后關閉并釋放。

      此包中沒有設計到線程同步的有關代碼。 數據庫很忙(因為數據庫要接收頻繁的數據庫連接)。

      可能瓶頸在數據庫對頻繁的連接處理。

      數據庫事務方面:由于是在每次處理時就調用數據庫連接并查詢,因此數據庫的事務處理應該是單獨在一個獨立的處理過程中,與并行的其他線程的處理沒有關系。

      2 ServletQueryForOnceConn.war Servlet對象只是的初始化時連接與數據庫的一個連接,在以后的操作中式中使用這個連接。

      通過Web.xml配置文件來配置JDBC的驅動類型和連接。 直接部署ServletQueryForOnceConn.jar包;

      Web容器只有一個Servlet實例。

      建議配置較多的線程數量。

      性能較差。

      Servlet對象只是的初始化時連接與數據庫的一個連接,在以后的操作中式中使用這個連接。

      此包中沒有設計到線程同步的有關代碼。 數據庫連接只有一個。

      可能瓶頸在Web容器的多個線程對同一個數據庫連接對象的同步等處理(這些同步處理是Web容器自己管理的)。

      可能出現查詢的數據在多個客戶請求中打亂(因為同時使用同一個數據庫通信通道);

      并且多個線程(單獨的處理單元)可能會在同一個處理事務中,可能各個處理單元會串行操作數據庫(這要看數據庫的具體實現了)。

      3 ServletQueryForConnPool.war 直接使用Web容器的數據源和數據庫連接池。 配置數據源及數據庫連接池。

      建議根據實際情況優化配置數據源和連接池。如可建立多個連接池等配置。 性能好。 Servlet實例不管數據庫連接,而是直接從Web容器中取得數據庫連接。數據庫的連接對象有Web容器全權管理。

      此包中沒有設計到線程同步的有關代碼。 對Web容器的數據庫連接池的配置可能要根據具體情況進行有效的調整(如數據庫連接對象個數和Web容器配額的線程個數的關系等)。如果配置不佳可能是性能瓶頸在Web容器或者在數據庫方。

      4 ServletQueryForConnPool.war

      (同測試3) 同測試3 Web容器的數據源重新配置為數據庫產品專用的JDBC驅動器。 性能好。 測試目的是比較各種不同的JDBC數據連接驅動器的性能,以便得出根據不同的數據庫產品選擇最佳的JDBC驅動器。

      只測試數據庫產品提供的專用JDBC驅動器。

      (說明:因為測試3在理論上性能是最好,因此選用測試3。測試方法和測試3一樣,這樣才有可比性。) 同測試3。

      5 servletQueryDS_Cache.war 同測試3 同測試3 性能一般

      使用一變量來緩存查詢的數據,用戶以后的分頁查詢查詢操作是直接從此緩存中取得的。

      這種方式對Web容器的內存要求高,效果不是很好,對數據量查詢小的效果可能會好些。 優點:

      減少的了對數據庫訪問的次數。

      缺點:

      需要較大的內存。對Weblogic容器的內存要求高,對于有大量用戶的查詢操作,并且查詢的結果集較大時,可能對整個系統的性能是個很大的瓶頸。

      

      對大量數據的分頁處理

      問題描述:

      背景1:一客戶通過IE請求Web服務器查詢數據,而查詢結果是上千條甚至是上萬條記錄,要求查詢結果傳送到IE客戶端并分頁顯示。

      背景2:一客戶通過IE或者其他方式請求Web服務器查詢數據,而查詢結果是上千條甚至是上萬條記錄,并要求查詢結果把包傳送到客戶的E-mail中。

      問:對于這樣的有大量數據的結果集,在Web服務器端如何有效的處理?

      可能涉及到的問題:

      1. 內存占用

      大量數據的結果集,可能要

      2. 傳輸速度及策略

      具體的分頁處理技術

      

      序號 名稱 處理方法 針對的數據庫 例子說明 備注

      1 游標查詢 直接使用ResultSet來處理。ResultSet是直接在數據庫上建立游標,然后通過ResultSet的行位置定位接口來獲得指定行位置的記錄。

      當用戶第一請求數據查詢時,就執行SQL語句查詢,獲得的ResultSet對象及其要使用的連接對象都保存到其對應的會話對象中。

      以后的分頁查詢都通過第一次執行SQL獲得的ResultSet對象定位取得指定行位置的記錄。

      最后在用戶不再進行分頁查詢時或會話關閉時,釋放數據庫連接和ResultSet對象等數據庫訪問資源。

      說明:在用例分頁查詢的整個會話期間,一個用戶的分頁查詢就要占用一個數據庫連接對象和結果集的游標,這種方式對數據庫的訪問資源占用比較大,并且其利用率不是很高。 所有的數據庫產品。 優點:

      減少了數據庫連接對象的多次分配獲取,減少了對數據庫的SQL查詢執行。

      缺點:

      占用數據庫訪問資源-數據庫連接對象,并占用了數據庫上的資源-游標。而這些資源都是十分寶貴的有限制的。

      結論:

      這種的數據庫查詢分頁處理方式不是最佳的。一般不適用這種方式。

      2 定位行集SQL查詢 主要是直接使用數據庫產品的提供的對查詢的結果集可定位行范圍的SQL接口技術。

      在用戶的分頁面查詢請求中,每次可取得查詢請求的行范圍的參數,然后使用這些參數生產取得指定行范圍的的SQL查詢語句,然后每次請求獲得一個數據庫連接對象并執行SQL查詢,把查詢的結果返回給用戶,最后釋放說有的數據庫訪問資源。

      說明:這種方式需要每次請求時都要執行數據庫的SQL查詢語句;對數據庫的訪問資源是使用完就立即釋放,不白白占用數據庫訪問資源。 對特定(提供了對查詢結果集可定位功能的)的數據庫產品。

      如:Oracle,DB2, PostgreSQL,mySQL等。(MS SQL Server 沒有提供此技術。) 如:

      1. Oracle數據庫使用關鍵字:rowid或rownum

      2. DB2:

      rowid或rownum ()

      3. PostgreSQL 使用LIMIT 和 OFFSET

      4. MySQL 使用Limit 優點:

      這種技術是直接使用數據庫產品自己提供的可對查詢結果集定位行范圍過濾的功能,因此直接利用了數據庫的性能對此分頁查詢的優化功能。

      對數據庫的訪問資源(數據庫連接對象,數據庫游標等)沒有浪費,這些資源的充分重復的利用。

      對查詢的結果對Web容器沒有什么特別要求。

      缺點:

      要執行多次數據庫SQL查詢操作。對每次的分頁面操作請求都要指定相應范圍的結果集來執行SQL語句的數據庫查詢操作,這對數據庫有一定的影響。

      對每次分頁面查詢請求要頻繁的從Web容器中獲得數據庫訪問資源(數據庫連接對象和數據庫游標)。

      要依賴于具體的數據庫產品。因為對沒有實現沒有提供此技術的數據庫產品不能使用此方式。

      結論:

      由于每次對數據庫的SQL查詢操作相對而言耗用的數據資源比較少,并且在實際用戶的操作中,有可能用戶對查詢的所有結果集只是需要查看其中的部分頁面。

      因此這種方式是最佳的。

      3 特別處理的定位行集SQL查詢 這種方式是在方式2的基礎上針對不提供對查詢結果集行范圍定位的數據庫產品。

      其在Web容器端的操作邏輯大致和方式2相同。

      只是先要對要查詢的數據庫表要有一字段的數據能區別每條不同的數據記錄。第一次查詢時,獲得用來可唯一標識不同記錄的字段的所有結果集,并緩存起來以備后面的分頁面查詢指定要查詢的結果集的行范圍。 主要是針對不同對查詢行集可定位范圍獲得的數據庫產品,如MS SQL Server等。 假設從A,B,C三個表中選取數據。且A有字段ID用來可唯一區別不同的記錄。

      那么第一次查詢的時候,會查詢兩次1. select A.id from A,B,C where condition.

      2. 把A的ID緩存到SESSION中?3.從Session中。現可按照次序來取得相應頁面范圍的ID來,并構造下一個查詢語句:select A.name, B.add from A,B,C where condition && (

      A.ID in 本頁面范圍的 ID )

      以后每次翻頁的時候,依次獲得對應頁的ID只要表中唯一的就可以了。無所謂大小,順序?這樣,SESSSION緩存的就只是一列而不是所有列了。當然,對于列數不多的,效果并不好。

      也可使用存儲過程實現,可參照:http://expert.csdn.net/Expert/topic

      /2365/2365596.xml?temp=.7529261

      優點:

      同方式2

      缺點:

      同方式2;

      還要在要查詢的數據庫表中建立一個相應的ID,用來唯一區別每條記錄。

      結論:

      同方式2。

      4 緩存一次SQL查詢的結果集 優點:

      缺點:

      既然我們要緩存結果,那么用戶就可能會看到過期的數據

      

      說明:對于實際情況的應用來說,一般結合實際情況,結合使用方式2(或方式3)和方式4。如:一個應用場景:對公司的產品的查詢是經常的,但是產品的種類不是很多,這時可使用緩存方式;但是對有些查詢結果集較大,數據庫和Web容器之間的網絡訪問由可能是遠程的,這時候可考慮使方式2(或者方式3)。

      測試用例代碼實現說明

      一:測試用例3-ServletQueryForConnPool 版本

      1.結構圖

      

      2.代碼實現結構

      3.運行時序圖

      4.測試運行情況說明

      4.1 數據庫連接和數據庫游標占用可能比較大

      由于數據庫的查詢及其分頁處理是直接使用JDBC的,并在分頁中是使用RseultSet的查詢結果集-游標形式實現的,并且每個客戶對應一個會話,每個會話對應一個數據庫連接和一個結果集(游標),數據庫連接和游標是在會話終止時才釋放的。因此在多個客戶的請求過程中,可能對數據庫的訪問資源(數據庫連接和用于數據操作的游標)占用比較大。

      因此數據庫訪問及其數據庫的處理可能是個瓶頸。

      4.2 資源沒有釋放的問題

      會話對應的數據庫連接和游標可能在會話終止時沒有釋放。

      為了更好的體現出使用Web容器數據庫連接池的優點,應該合理的設置連接池中連接對象的“非活動超時時間”,建議次值和Servlet對象的會話超時時間長度一直。

      5.此測試用例操作說明

      5.1 部署的包的位置:

      ServletQueryForConnPool.war

      5.2 部署

      1.通過Weblogic 的控制臺工具部署此包

      2.相關的參數請看ServletQueryForConnPool.war包中的配置文件web.xml中相應的servlet配置參數

      5.3 測試URL

      http://Server:port/WebAppName

      即:

      http://Web服務器名:端口/Servlet部署的應用程序名

      二:測試用例4 ServletQueryForConnPool_cache 版本

      1.結構圖

      和“一:測試用例3”相同

      2.代碼實現結構

      3.運行時序

      說明:使用第四種“緩存一次SQL查詢的結果集”的分頁面查詢技術,即一次SQL查詢,把從數據庫查詢出來的結果保存到會話中,以后的客戶分頁查詢操作都從此緩存中取得。

      4.測試運行情況說明

      由于使用的是緩存結果集的方式,對Web容器服務器的內存要求比較高,可能在測試過程中,Web容器服務器因內存問題而影響整個系統的響應性能。

      5.此測試用例操作說明

      5.1 部署的包的位置:

      ServletQueryForConnPool_cache.war

    posted @ 2008-04-11 16:47 金家寶 閱讀(312) | 評論 (0)編輯 收藏

    JAVA面試題(長)

    40、構造器Constructor是否可被override?構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。

    41、是否可以繼承String類?String類是final類故不可以繼承。

    42、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

    43、try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?會執行,在return前執行。

    44、編程題: 用最有效率的方法算出2乘以8等於幾? 2 << 3

    45、兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?不對,有相同的hash code。

    46、當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞? 是值傳遞。Java 編程語言只有值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。

    47、當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?
    不能,一個對象的一個synchronized方法只能由一個線程訪問。

    48、編程題: 寫一個Singleton出來。
    Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。一般Singleton模式通常有幾種種形式:第一種形式: 定義一個類,它的構造函數為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。public class Singleton {private Singleton(){} private static Singleton instance = new Singleton();???? public static Singleton getInstance() {???? return instance;   }???? }???? 第二種形式: public class Singleton {???? private static Singleton instance = null;???? public static synchronized Singleton getInstance() { if (instance==null) instance=new Singleton();
    return instance;   } }?????? 其他形式:???? 定義一個類,它的構造函數為private的,所有方法為static的。一般認為第一種形式要更加安全些

    49、Java的接口和C++的虛類的相同和不同處。
    由于Java不支持多繼承,而有可能某個類或對象要使用分別在幾個類或對象里面的方法或屬性,現有的單繼承機制就不能滿足要求。與繼承相比,接口有更高的靈活性,因為接口中沒有任何實現代碼。當一個類實現了接口以后,該類要實現接口里面所有的方法和屬性,并且接口里面的屬性在默認狀態下面都是public static,所有方法默認情況下是public.一個類可以實現多個接口。

    50、Java中的異常處理機制的簡單原理和應用。
    當JAVA程序違反了JAVA的語義規則時,JAVA虛擬機就會將發生的錯誤表示為一個異常。違反語義規則包括2種情況。一種是JAVA類庫內置的語義檢查。例如數組下標越界,會引發IndexOutOfBoundsException;訪問null的對象時會引發NullPointerException。另一種情況就是JAVA允許程序員擴展這種語義檢查,程序員可以創建自己的異常,并自由選擇在何時用throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。

    51、垃圾回收的優點和原理。并考慮2種回收機制。
    Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管理。由于有個垃圾回收機制,Java中的對象不再有“作用域”的概念,只有對象的引用才有“作用域”。垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收

    52、請說出你所知道的線程同步的方法。
    wait():使一個線程處于等待狀態,并且釋放所持有的對象的lock。sleep():使一個正在運行的線程處于睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。notify():喚醒一個處于等待狀態的線程,注意的是在調用此方法的時候,并不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先級。Allnotity():喚醒所有處入等待狀態的線程,注意并不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。

    53、你所知道的集合類都有哪些?主要方法?最常用的集合類是 List 和 Map。 List 的具體實現包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構建、存儲和操作任何類型對象的元素列表。 List 適用于按數值索引訪問元素的情形。 Map 提供了一個更通用的元素存儲方法。 Map 集合類用于存儲元素對(稱作“鍵”和“值”),其中每個鍵映射到一個值。

    54、描述一下JVM加載class文件的原理機制?JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。

    55、char型變量中能不能存貯一個中文漢字?為什么?
    能夠定義成為一個中文的,因為java中以unicode編碼,一個char占16個字節,所以放一個中文是沒問題的

    56、多線程有幾種實現方法,都是什么?同步有幾種實現方法,都是什么?
    多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口 ,同步的實現方面有兩種,分別是synchronized,wait與notify

    57、JSP的內置對象及方法。
    request表示HttpServletRequest對象。它包含了有關瀏覽器請求的信息,并且提供了幾個用于獲取cookie, header, 和session數據的有用的方法,response表示HttpServletResponse對象,并提供了幾個用于設置送回瀏覽器的響應的方法(如cookies,頭信息等)
    out對象是javax.jsp.JspWriter的一個實例,并提供了幾個方法使你能用于向瀏覽器回送輸出結果。 pageContext表示一個javax.servlet.jsp.PageContext對象。它是用于方便存取各種范圍的名字空間、servlet相關的對象的API,并且包裝了通用的servlet相關功能的方法。???? session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態信息???? applicaton 表示一個javax.servle.ServletContext對象。這有助于查找有關servlet引擎和servlet環境的信息???? config表示一個javax.servlet.ServletConfig對象。該對象用于存取servlet實例的初始化參數。???? page表示從該頁面產生的一個servlet實例

    58、線程的基本概念、線程的基本狀態以及狀態之間的關系線程指在程序執行過程中,能夠執行程序代碼的一個執行單位,每個程序至少都有一個線程,也就是程序本身。Java中的線程有四種狀態分別是:運行、就緒、掛起、結束。

    59、JSP的常用指令<%@page language=”java” contenType=”text/html;charset=gb2312” session=”true” buffer=”64kb” autoFlush=”true” isThreadSafe=”true” info=”text” errorPage=”error.jsp” isErrorPage=”true” isELIgnored=”true” pageEncoding=”gb2312” import=”java.sql.*”%>isErrorPage(是否能使用Exception對象),isELIgnored(是否忽略表達式) <%@include file=”filename”%><%@taglib prefix=”c”uri=”http://……”%>

    60、什么情況下調用doGet()和doPost()?Jsp頁面中的form標簽里的method屬性為get時調用doGet(),為post時調用doPost()。

    61、servlet的生命周期web容器加載servlet,生命周期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實現,根據請求的不同調用不同的do***()方法。結束服務,web容器調用servlet的destroy()方法。

    62、如何現實servlet的單線程模式?????? <%@ page isThreadSafe=”false”%>

    63、頁面間對象傳遞的方法?????? request,session,application,cookie等

    64、JSP和Servlet有哪些相同點和不同點,他們之間的聯系是什么?
    JSP是Servlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯后是"類servlet"。Servlet和JSP最主要的不同點在于,Servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。JSP側重于視圖,Servlet主要用于控制邏輯。

    65、四種會話跟蹤技術 cookie,url重寫,session,隱藏域

    65,jsp的四種范圍
    page否是代表與一個頁面相關的對象和屬性。一個頁面由一個編譯好的 Java servlet 類(可以帶有任何的 include 指令,但是沒有 include 動作)表示。這既包括 servlet 又包括被編譯成 servlet 的 JSP 頁面
    request是是代表與 Web 客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個 Web 組件(由于 forward 指令和 include 動作的關系)
    session是是代表與用于某個 Web 客戶機的一個用戶體驗相關的對象和屬性。一個 Web 會話可以也經常會跨越多個客戶機請求
    application是是代表與整個 Web 應用程序相關的對象和屬性。這實質上是跨越整個 Web 應用程序,包括多個頁面、請求和會話的一個全局作用域

    66、Request對象的主要方法:
    setAttribute(String name,Object):設置名字為name的request的參數值
    getAttribute(String name):返回由name指定的屬性值
    getAttributeNames():返回request對象所有屬性的名字集合,結果是一個枚舉的實例
    getCookies():返回客戶端的所有Cookie對象,結果是一個Cookie數組
    getCharacterEncoding():返回請求中的字符編碼方式
    getContentLength():返回請求的Body的長度
    getHeader(String name):獲得HTTP協議定義的文件頭信息
    getHeaders(String name):返回指定名字的request Header的所有值,結果是一個枚舉的實例
    getHeaderNames():返回所以request Header的名字,結果是一個枚舉的實例
    getInputStream():返回請求的輸入流,用于獲得請求中的數據
    getMethod():獲得客戶端向服務器端傳送數據的方法
    getParameter(String name):獲得客戶端傳送給服務器端的有name指定的參數值
    getParameterNames():獲得客戶端傳送給服務器端的所有參數的名字,結果是一個枚舉的實例
    getParameterValues(String name):獲得有name指定的參數的所有值
    getProtocol():獲取客戶端向服務器端傳送數據所依據的協議名稱
    getQueryString():獲得查詢字符串
    getRequestURI():獲取發出請求字符串的客戶端地址
    getRemoteAddr():獲取客戶端的IP地址
    getRemoteHost():獲取客戶端的名字
    getSession([Boolean create]):返回和請求相關Session
    getServerName():獲取服務器的名字
    getServletPath():獲取客戶端所請求的腳本文件的路徑
    getServerPort():獲取服務器的端口號
    removeAttribute(String name):刪除請求中的一個屬性

    67、J2EE是技術還是平臺還是框架?J2EE本身是一個標準,一個為企業分布式應用的開發提供的標準平臺。
    J2EE也是一個框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技術。

    68、我們在web應用開發過程中經常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個某種編碼的字符串?
    ????? Public String translate (String str) {?????? String tempStr = "";?????? try { tempStr = new String(str.getBytes("ISO-8859-1"), "GBK"); tempStr = tempStr.trim(); } catch (Exception e) {?????? System.err.println(e.getMessage());?????? } return tempStr;?????? }

    69、簡述邏輯操作(&,|,^)與條件操作(&&,||)的區別。區別主要答兩點:a.條件操作只能操作布爾型的,而邏輯操作不僅可以操作布爾型,而且可以操作數值型b.邏輯操作不會產生短路

    70、XML文檔定義有幾種形式?它們之間有何本質區別?解析XML文檔有哪幾種方式?
    a: 兩種形式 dtd?????? schema,b: 本質區別:schema本身是xml的,可以被XML解析器解析(這也是從DTD上發展schema的根本目的),c:有DOM,SAX,STAX等?????? DOM:處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結構所造成的,這種結構占用的內存較多,而且DOM必須在解析文件之前把整個文檔裝入內存,適合對XML的隨機訪問?????? SAX:不現于DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標簽開頭與標簽結束時,它會觸發一個事件,用戶通過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問 STAX:Streaming API for XML (StAX)
    71、簡述synchronized和java.util.concurrent.locks.Lock的異同?
    主要相同點:Lock能完成synchronized所實現的所有功能主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,并且必須在finally從句中釋放。

    72、EJB的角色和三個對象
    一個完整的基于EJB的分布式計算結構由六個角色組成,這六個角色可以由不同的開發商提供,每個角色所作的工作必須遵循Sun公司提供的EJB規范,以保證彼此之間的兼容性。這六個角色分別是EJB組件開發者(Enterprise Bean Provider) 、應用組合者(Application Assembler)、部署者(Deployer)、EJB 服務器提供者(EJB Server Provider)、EJB 容器提供者(EJB Container Provider)、系統管理員(System Administrator)三個對象是Remote(Local)接口、Home(LocalHome)接口,Bean類

    73、EJB容器提供的服務主要提供聲明周期管理、代碼產生、持續性管理、安全、事務管理、鎖和并發行管理等服務。

    74、EJB規范規定EJB中禁止的操作有哪些? 1.不能操作線程和線程API(線程API指非線程對象的方法如notify,wait等),2.不能操作awt,3.不能實現服務器功能,4.不能對靜態屬生存取,5.不能使用IO操作直接存取文件系統,6.不能加載本地庫.,7.不能將this作為變量和返回,8.不能循環調用。

    75、remote接口和home接口主要作用remote接口定義了業務方法,用于EJB客戶端調用業務方法。home接口是EJB工廠用于創建和移除查找EJB實例

    76、bean 實例的生命周期對于Stateless Session Bean、Entity Bean、Message Driven Bean一般存在緩沖池管理,而對于Entity Bean和Statefull Session Bean存在Cache管理,通常包含創建實例,設置上下文、創建EJB Object(create)、業務方法調用、remove等過程,對于存在緩沖池管理的Bean,在create之后實例并不從內存清除,而是采用緩沖池調度機制不斷重用實例,而對于存在Cache管理的Bean則通過激活和去激活機制保持Bean的狀態并限制內存中實例數量。

    77、EJB的激活機制 以Stateful Session Bean 為例:其Cache大小決定了內存中可以同時存在的Bean實例的數量,根據MRU或NRU算法,實例在激活和去激活狀態之間遷移,激活機制是當客戶端調用某個EJB實例業務方法時,如果對應EJB Object發現自己沒有綁定對應的Bean實例則從其去激活Bean存儲中(通過序列化機制存儲實例)回復(激活)此實例。狀態變遷前會調用對應的ejbActive和ejbPassivate方法。

    78、EJB的幾種類型會話(Session)Bean ,實體(Entity)Bean 消息驅動的(Message Driven)Bean?????? ;會話Bean又可分為有狀態(Stateful)和無狀態(Stateless)兩種;實體Bean可分為Bean管理的持續性(BMP)和容器管理的持續性(CMP)兩種

    79、客服端調用EJB對象的幾個基本步驟設置JNDI服務工廠以及JNDI服務地址系統屬性,查找Home接口,從Home接口調用Create方法創建Remote接口,通過Remote接口調用其業務方法。

    80、如何給weblogic指定大小的內存? 在啟動Weblogic的腳本中(位于所在Domian對應服務器目錄下的startServerName),增加set MEM_ARGS=-Xms32m -Xmx200m,可以調整最小內存為32M,最大200M

    81、如何設定的weblogic的熱啟動模式(開發模式)與產品發布模式?可以在管理控制臺中修改對應服務器的啟動模式為開發或產品模式之一。或者修改服務的啟動文件或者commenv文件,增加set PRODUCTION_MODE=true。

    82、如何啟動時不需輸入用戶名與密碼?修改服務啟動文件,增加 WLS_USER和WLS_PW項。也可以在boot.properties文件中增加加密過的用戶名和密碼.

    83、在weblogic管理制臺中對一個應用域(或者說是一個網站,Domain)進行jms及ejb或連接池等相關信息進行配置后,實際保存在什么文件中?保存在此Domain的config.xml文件中,它是服務器的核心配置文件。

    84、說說weblogic中一個Domain的缺省目錄結構?比如要將一個簡單的helloWorld.jsp放入何目錄下,然的在瀏覽器上就可打入http://主機:端口號//helloword.jsp就可以看到運行結果了? 又比如這其中用到了一個自己寫的javaBean該如何辦?
    Domain目錄\服務器目錄\applications,將應用目錄放在此目錄下將可以作為應用訪問,如果是Web應用,應用目錄需要滿足Web應用目錄要求,jsp文件可以直接放在應用目錄中,Javabean需要放在應用目錄的WEB-INF目錄的classes目錄中,設置服務器的缺省應用將可以實現在瀏覽器上無需輸入應用名。

    85、在weblogic中發布ejb需涉及到哪些配置文件不同類型的EJB涉及的配置文件不同,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP實體Bean一般還需要weblogic-cmp-rdbms-jar.xml

    86、如何在weblogic中進行ssl配置與客戶端的認證配置或說說j2ee(標準)進行ssl的配置缺省安裝中使用DemoIdentity.jks和DemoTrust.jks?????? KeyStore實現SSL,需要配置服務器使用Enable SSL,配置其端口,在產品模式下需要從CA獲取私有密鑰和數字證書,創建identity和trust keystore,裝載獲得的密鑰和數字證書。可以配置此SSL連接是單向還是雙向的。

    87、如何查看在weblogic中已經發布的EJB?可以使用管理控制臺,在它的Deployment中可以查看所有已發布的EJB

    88、CORBA是什么?用途是什么? CORBA 標準是公共對象請求代理結構(Common Object Request Broker Architecture),由對象管理組織 (Object Management Group,縮寫為 OMG)標準化。它的組成是接口定義語言(IDL), 語言綁定(binding:也譯為聯編)和允許應用程序間互操作的協議。其目的為:用不同的程序設計語言書寫在不同的進程中運行,為不同的操作系統開發。

    89、說說你所熟悉或聽說過的j2ee中的幾種常用模式?及對設計模式的一些看法
    ????? Session Facade Pattern:使用SessionBean訪問EntityBean;Message Facade Pattern:實現異步調用;EJB Command Pattern:使用Command JavaBeans取代SessionBean,實現輕量級訪問;Data Transfer Object Factory:通過DTO Factory簡化EntityBean數據提供特性;Generic Attribute Access:通過AttibuteAccess接口簡化EntityBean數據提供特性;Business Interface:通過遠程(本地)接口和Bean類實現相同接口規范業務邏輯一致性;EJB架構的設計好壞將直接影響系統的性能、可擴展性、可維護性、組件可重用性及開發效率。項目越復雜,項目隊伍越龐大則越能體現良好設計的重要性。

    90、說說在weblogic中開發消息Bean時的persistent與non-persisten的差別persistent方式的MDB可以保證消息傳遞的可靠性,也就是如果EJB容器出現問題而JMS服務器依然會將消息在此MDB可用的時候發送過來,而non-persistent方式的消息將被丟棄。

    91、Servlet執行時一般實現哪幾個方法?public void init(ServletConfig config);public ServletConfig getServletConfig();public String getServletInfo();public void service(ServletRequest request,ServletResponse response);public void destroy()

    92、常用的設計模式?說明工廠模式。 Java中的23種設計模式:Factory(工廠模式),Builder(建造模式), Factory Method(工廠方法模式),Prototype(原始模型模式),Singleton(單例模式), Facade(門面模式),Adapter(適配器模式), Bridge(橋梁模式), Composite(合成模式),Decorator(裝飾模式), Flyweight(享元模式), Proxy(代理模式),Command(命令模式), Interpreter(解釋器模式), Visitor(訪問者模式),Iterator(迭代子模式), Mediator(調停者模式), Memento(備忘錄模式),Observer(觀察者模式),State(狀態模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibleity(責任鏈模式)。工廠模式:工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的數據生成一組類中某一個類的實例,通常這一組類有一個公共的抽象父類并且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作。首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然后需要定義一個工廠類,工廠類可以根據條件生成不同的子類實例。當得到子類的實例后,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的實例。

    93、EJB需直接實現它的業務接口或Home接口嗎,請簡述理由。遠程接口和Home接口不需要直接實現,他們的實現代碼是由服務器產生的,程序運行中對應實現類會作為對應接口類型的實例被使用。

    94、排序都有哪幾種方法?請列舉。用JAVA實現一個快速排序。排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸并排序,分配排序(箱排序、基數排序)
    快速排序的偽代碼。/ /使用快速排序方法對a[ 0 :n- 1 ]排序,從a[ 0 :n- 1 ]中選擇一個元素作為m i d d l e,該元素為支點,
    把余下的元素分割為兩段left 和r i g h t,使得l e f t中的元素都小于等于支點,而right 中的元素都大于等于支點,遞歸地使用快速排序方法對left 進行排序,遞歸地使用快速排序方法對right 進行排序,所得結果為l e f t + m i d d l e + r i g h t。

    95、請對以下在J2EE中常用的名詞進行解釋(或簡單描述)web容器:給處于其中的應用程序組件(JSP,SERVLET)提供一個環境,使JSP,SERVLET直接更容器中的環境變量接口交互,不必關注其它系統問題。主要有WEB服務器來實現。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口嚴格遵守J2EE規范中的WEB APPLICATION 標準。我們把遵守以上標準的WEB服務器就叫做J2EE中的WEB容器。EJB容器:Enterprise java bean 容器。更具有行業領域特色。他提供給運行在其中的組件EJB各種管理功能。只要滿足J2EE規范的EJB放入該容器,馬上就會被容器進行高效率的管理。并且可以通過現成的接口來獲得系統級別的服務。例如郵件服務、事務管理。JNDI:(Java Naming & Directory Interface)JAVA命名目錄服務。主要提供的功能是:提供一個目錄系統,讓其它各地的應用程序在其上面留下自己的索引,從而滿足快速查找和定位分布式應用程序的功能。JMS:(Java Message Service)JAVA消息服務。主要實現各個應用程序之間的通訊。包括點對點和廣播。JTA:(Java Transaction API)JAVA事務服務。提供各種分布式事務服務。應用程序只需調用其提供的接口即可。JAF:(Java Action FrameWork)JAVA安全認證框架。提供一些安全控制方面的框架。讓開發者通過各種部署和自定義實現自己的個性安全控制策略。RMI/IIOP:(Remote Method Invocation /internet對象請求中介協議)他們主要用于通過遠程調用服務。例如,遠程有一臺計算機上運行一個程序,它提供股票分析服務,我們可以在本地計算機上實現對其直接調用。當然這是要通過一定的規范才能在異構的系統之間進行通信。RMI是JAVA特有的。

    96、JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什么意義?在try塊中可以拋出異常嗎?
    Java通過面向對象的方法進行異常處理,把各種不同的異常進行分類,并提供了良好的接口。在Java中,每個異常都是一個對象,它是Throwable類或其它子類的實例。當一個方法出現異常后便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法可以捕獲到這個異常并進行處理。Java的異常處理是通過5個關鍵詞來實現的:try、catch、throw、throws和finally。一般情況下是用try來執行一段程序,如果出現異常,系統會拋出(throws)一個異常,這時候你可以通過它的類型來捕捉(catch)它,或最后(finally)由缺省處理器來處理。用try來指定一塊預防所有“異常”的程序。緊跟在try程序后面,應包含一個catch子句來指定你想要捕捉的“異常”的類型。throw語句用來明確地拋出一個“異常”。throws用來標明一個成員函數可能拋出的各種“異常”。Finally為確保一段代碼不管發生什么“異常”都被執行一段代碼。可以在一個成員函數調用的外面寫一個try語句,在這個成員函數內部寫另一個try語句保護其他代碼。每當遇到一個try語句,“異常”的框架就放到堆棧上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種“異常”進行處理,堆棧就會展開,直到遇到有處理這種“異常”的try語句。

    97、一個“.java”源文件中是否可以包括多個類(不是內部類)?有什么限制?可以。必須只有一個類名與文件名相同。

    98、MVC的各個部分都有那些技術來實現?如何實現? MVC是Model-View-Controller的簡寫。"Model" 代表的是應用的業務邏輯(通過JavaBean,EJB組件實現), "View" 是應用的表示面(由JSP頁面產生),"Controller" 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。

    99、java中有幾種方法可以實現一個線程?用什么關鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?有兩種實現方法,分別是繼承Thread類與實現Runnable接口用synchronized關鍵字修飾同步方法反對使用stop(),是因為它不安全。它會解除由線程獲取的所有鎖定,而且如果對象處于一種不連貫狀態,那么其他線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被“掛起”的線程恢復運行。對任何線程來說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標志,指出線程應該活動還是掛起。若標志指出線程應該掛起,便用wait()命其進入等待狀態。若標志指出線程應當恢復,則用一個notify()重新啟動線程。

    100、java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
    字節流,字符流。字節流繼承于InputStream \ OutputStream,字符流繼承于InputStreamReader \ OutputStreamWriter。在java.io包中還有許多其他的流,主要是為了提高性能和使用方便。

    101、java中會存在內存泄漏嗎,請簡單描述。會。如:int i,i2;?????? return (i-i2);?????? //when i為足夠大的正數,i2為足夠大的負數。結果會造成溢位,導致錯誤。

    102、java中實現多態的機制是什么?方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。

    103、垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內存嗎?有什么辦法主動通知虛擬機進行垃圾回收?對于GC來說,當程序員創建對象時,GC就開始監控這個對象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。當GC確定一些對象為"不可達"時,GC就有責任回收這些內存空間。可以。程序員可以手動執行System.gc(),通知GC運行,但是Java語言規范并不保證GC一定會執行。

    104、靜態變量和實例變量的區別?static i = 10; //常量; class A a;?????? a.i =10;//可變

    105、什么是java序列化,如何實現java序列化?
    序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸于網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。序列化的實現:將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,implements Serializable只是為了標注該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數為obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。

    106、是否可以從一個static方法內部發出對非static方法的調用?不可以,如果其中包含對象的method();不能保證對象初始化.

    107、寫clone()方法時,通常都有一行代碼,是什么?Clone 有缺省行為,super.clone();他負責產生正確大小的空間,并逐位復制。

    108、在JAVA中,如何跳出當前的多重嵌套循環?用break; return 方法。

    109、List、Map、Set三個接口,存取元素時,各有什么特點?List 以特定次序來持有元素,可有重復元素。Set 無法擁有重復元素,內部排序。Map 保存key-value值,value可多值。

    110、J2EE是什么?J2EE是Sun公司提出的多層(multi-diered),分布式(distributed),基于組件(component-base)的企業級應用模型(enterpriese application model).在這樣的一個應用系統中,可按照功能劃分為不同的組件,這些組件又可在不同計算機上,并且處于相應的層次(tier)中。所屬層次包括客戶層(clietn tier)組件,web層和組件,Business層和組件,企業信息系統(EIS)層。

    111、UML方面標準建模語言UML。用例圖,靜態圖(包括類圖、對象圖和包圖),行為圖,交互圖(順序圖,合作圖),實現圖。

    112、說出一些常用的類,包,接口,請各舉5個常用的類:BufferedReader?????? BufferedWriter?????? FileReader?????? FileWirter?????? String?????? Integer;常用的包:java.lang?????? java.awt?????? java.io?????? java.util?????? java.sql;常用的接口:Remote?????? List?????? Map?????? Document?????? NodeList

    113、開發中都用到了那些設計模式?用在什么場合? 每個模式都描述了一個在我們的環境中不斷出現的問題,然后描述了該問題的解決方案的核心。通過這種方式,你可以無數次地使用那些已有的解決方案,無需在重復相同的工作。主要用到了MVC的設計模式。用來開發JSP/Servlet或者J2EE的相關應用。簡單工廠模式等。

    114、jsp有哪些動作?作用分別是什么? JSP共有以下6種基本動作 jsp:include:在頁面被請求的時候引入一個文件。 jsp:useBean:尋找或者實例化一個JavaBean。 jsp:setProperty:設置JavaBean的屬性。 jsp:getProperty:輸出某個JavaBean的屬性。 jsp:forward:把請求轉到一個新的頁面。 jsp:plugin:根據瀏覽器類型為Java插件生成OBJECT或EMBED標記。

    115、Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)? 可以繼承其他類或完成其他接口,在swing編程中常用此方式。

    116、應用服務器與WEB SERVER的區別?應用服務器:Weblogic、Tomcat、Jboss; WEB SERVER:IIS、 Apache

    117、BS與CS的聯系與區別。
    C/S是Client/Server的縮寫。服務器通常采用高性能的PC、工作站或小型機,并采用大型數據庫系統,如Oracle、Sybase、Informix或 SQL Server。客戶端需要安裝專用的客戶端軟件。
    B/S是Brower/Server的縮寫,客戶機上只要安裝一個瀏覽器(Browser),如Netscape Navigator或Internet Explorer,服務器安裝Oracle、Sybase、Informix或 SQL Server等數據庫。在這種結構下,用戶界面完全通過WWW瀏覽器實現,一部分事務邏輯在前端實現,但是主要事務邏輯在服務器端實現。瀏覽器通過Web Server 同數據庫進行數據交互。
    C/S 與 B/S 區別:
    1.硬件環境不同: C/S 一般建立在專用的網絡上, 小范圍里的網絡環境, 局域網之間再通過專門服務器提供連接和數據交換服務; B/S 建立在廣域網之上的, 不必是專門的網絡硬件環境,例與電話上網, 租用設備. 信息自己管理. 有比C/S更強的適應范圍, 一般只要有操作系統和瀏覽器就行
    2.對安全要求不同 :C/S 一般面向相對固定的用戶群, 對信息安全的控制能力很強. 一般高度機密的信息系統采用C/S 結構適宜. 可以通過B/S發布部分可公開信息.B/S 建立在廣域網之上, 對安全的控制能力相對弱, 可能面向不可知的用戶。
    3.對程序架構不同 : C/S 程序可以更加注重流程, 可以對權限多層次校驗, 對系統運行速度可以較少考慮. B/S 對安全以及訪問速度的多重的考慮, 建立在需要更加優化的基礎之上. 比C/S有更高的要求 B/S結構的程序架構是發展的趨勢, 從MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持網絡的構件搭建的系統. SUN 和IBM推的JavaBean 構件技術等,使 B/S更加成熟.
    4.軟件重用不同: C/S 程序可以不可避免的整體性考慮, 構件的重用性不如在B/S要求下的構件的重用性好. B/S 對的多重結構,要求構件相對獨立的功能. 能夠相對較好的重用.就入買來的餐桌可以再利用,而不是做在墻上的石頭桌子。
    5.系統維護不同?????? :C/S 程序由于整體性, 必須整體考察, 處理出現的問題以及系統升級. 升級難. 可能是再做一個全新的系統, B/S 構件組成,方面構件個別的更換,實現系統的無縫升級. 系統維護開銷減到最小.用戶從網上自己下載安裝就可以實現升級.
    6.處理問題不同 :C/S 程序可以處理用戶面固定, 并且在相同區域, 安全要求高需求, 與操作系統相關. 應該都是相同的系統,B/S 建立在廣域網上, 面向不同的用戶群, 分散地域, 這是C/S無法作到的. 與操作系統平臺關系最小.
    7.用戶接口不同: C/S 多是建立的Window平臺上,表現方法有限,對程序員普遍要求較高,B/S 建立在瀏覽器上, 有更加豐富和生動的表現方式與用戶交流. 并且大部分難度減低,減低開發成本.
    8.信息流不同 : C/S 程序一般是典型的中央集權的機械式處理, 交互性相對低,B/S 信息流向可變化, B-B B-C B-G等信息、流向的變化, 更像交易中心。
    ?

    ?

    ?

    JAVA編程題
    1.現在輸入n個數字,以逗號,分開;然后可選擇升或者降序排序;按提交鍵就在另一頁面顯示按什么排序,結果為,提供reset
    import java.util.*;
    public class bycomma{
    public static String[] splitStringByComma(String source){
    if(source==null||source.trim().equals(""))
    return null;
    StringTokenizer commaToker = new StringTokenizer(source,",");
    String[] result = new String[commaToker.countTokens()];
    int i=0;
    while(commaToker.hasMoreTokens()){
    result[i] = commaToker.nextToken();
    i++;
    }
    return result;
    }
    public static void main(String args[]){
    String[] s = splitStringByComma("5,8,7,4,3,9,1");
    int[] ii = new int[s.length];
    for(int i = 0;i<s.length;i++){
    ii[i] =Integer.parseInt(s[i]);
    }
    Arrays.sort(ii);
    //asc
    for(int i=0;i<s.length;i++){
    System.out.println(ii[i]);
    }
    //desc
    for(int i=(s.length-1);i>=0;i--){
    System.out.println(ii[i]);
    }
    }
    }
    2.金額轉換,阿拉伯數字的金額轉換成中國傳統的形式如:(¥1011)->(一千零一拾一元整)輸出。
    package test.format;
    import java.text.NumberFormat;
    import java.util.HashMap;
    public class SimpleMoneyFormat {
    public static final String EMPTY = "";
    public static final String ZERO = "零";
    public static final String ONE = "壹";
    public static final String TWO = "貳";
    public static final String THREE = "叁";
    public static final String FOUR = "肆";
    public static final String FIVE = "伍";
    public static final String SIX = "陸";
    public static final String SEVEN = "柒";
    public static final String EIGHT = "捌";
    public static final String NINE = "玖";
    public static final String TEN = "拾";
    public static final String HUNDRED = "佰";
    public static final String THOUSAND = "仟";
    public static final String TEN_THOUSAND = "萬";
    public static final String HUNDRED_MILLION = "億";
    public static final String YUAN = "元";
    public static final String JIAO = "角";
    public static final String FEN = "分";
    public static final String DOT = ".";

    private static SimpleMoneyFormat formatter = null;
    private HashMap chineseNumberMap = new HashMap();
    private HashMap chineseMoneyPattern = new HashMap();
    private NumberFormat numberFormat = NumberFormat.getInstance();

    private SimpleMoneyFormat() {
    numberFormat.setMaximumFractionDigits(4);
    numberFormat.setMinimumFractionDigits(2);
    numberFormat.setGroupingUsed(false);

    chineseNumberMap.put("0", ZERO);
    chineseNumberMap.put("1", ONE);
    chineseNumberMap.put("2", TWO);
    chineseNumberMap.put("3", THREE);
    chineseNumberMap.put("4", FOUR);
    chineseNumberMap.put("5", FIVE);
    chineseNumberMap.put("6", SIX);
    chineseNumberMap.put("7", SEVEN);
    chineseNumberMap.put("8", EIGHT);
    chineseNumberMap.put("9", NINE);
    chineseNumberMap.put(DOT, DOT);

    chineseMoneyPattern.put("1", TEN);
    chineseMoneyPattern.put("2", HUNDRED);
    chineseMoneyPattern.put("3", THOUSAND);
    chineseMoneyPattern.put("4", TEN_THOUSAND);
    chineseMoneyPattern.put("5", TEN);
    chineseMoneyPattern.put("6", HUNDRED);
    chineseMoneyPattern.put("7", THOUSAND);
    chineseMoneyPattern.put("8", HUNDRED_MILLION);
    }

    public static SimpleMoneyFormat getInstance() {
    if (formatter == null)
    formatter = new SimpleMoneyFormat();
    return formatter;
    }

    public String format(String moneyStr) {
    checkPrecision(moneyStr);
    String result;
    result = convertToChineseNumber(moneyStr);
    result = addUnitsToChineseMoneyString(result);
    return result;
    }

    public String format(double moneyDouble) {
    return format(numberFormat.format(moneyDouble));
    }

    public String format(int moneyInt) {
    return format(numberFormat.format(moneyInt));
    }

    public String format(long moneyLong) {
    return format(numberFormat.format(moneyLong));
    }

    public String format(Number moneyNum) {
    return format(numberFormat.format(moneyNum));
    }

    private String convertToChineseNumber(String moneyStr) {
    String result;
    StringBuffer cMoneyStringBuffer = new StringBuffer();
    for (int i = 0; i < moneyStr.length(); i++) {
    cMoneyStringBuffer.append(chineseNumberMap.get(moneyStr.substring(i, i + 1)));
    }
    //拾佰仟萬億等都是漢字里面才有的單位,加上它們
    int indexOfDot = cMoneyStringBuffer.indexOf(DOT);
    int moneyPatternCursor = 1;
    for (int i = indexOfDot - 1; i > 0; i--) {
    cMoneyStringBuffer.insert(i, chineseMoneyPattern.get(EMPTY + moneyPatternCursor));
    moneyPatternCursor = moneyPatternCursor == 8 ? 1 : moneyPatternCursor + 1;
    }

    String fractionPart = cMoneyStringBuffer.substring(cMoneyStringBuffer.indexOf("."));
    cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("."), cMoneyStringBuffer.length());
    while (cMoneyStringBuffer.indexOf("零拾") != -1) {
    cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零拾"), cMoneyStringBuffer.indexOf("零拾") + 2, ZERO);
    }
    while (cMoneyStringBuffer.indexOf("零佰") != -1) {
    cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零佰"), cMoneyStringBuffer.indexOf("零佰") + 2, ZERO);
    }
    while (cMoneyStringBuffer.indexOf("零仟") != -1) {
    cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零仟"), cMoneyStringBuffer.indexOf("零仟") + 2, ZERO);
    }
    while (cMoneyStringBuffer.indexOf("零萬") != -1) {
    cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零萬"), cMoneyStringBuffer.indexOf("零萬") + 2, TEN_THOUSAND);
    }
    while (cMoneyStringBuffer.indexOf("零億") != -1) {
    cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零億"), cMoneyStringBuffer.indexOf("零億") + 2, HUNDRED_MILLION);
    }
    while (cMoneyStringBuffer.indexOf("零零") != -1) {
    cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零零"), cMoneyStringBuffer.indexOf("零零") + 2, ZERO);
    }
    if (cMoneyStringBuffer.lastIndexOf(ZERO) == cMoneyStringBuffer.length() - 1)
    cMoneyStringBuffer.delete(cMoneyStringBuffer.length() - 1, cMoneyStringBuffer.length());
    cMoneyStringBuffer.append(fractionPart);

    result = cMoneyStringBuffer.toString();
    return result;
    }


    private String addUnitsToChineseMoneyString(String moneyStr) {
    String result;
    StringBuffer cMoneyStringBuffer = new StringBuffer(moneyStr);
    int indexOfDot = cMoneyStringBuffer.indexOf(DOT);
    cMoneyStringBuffer.replace(indexOfDot, indexOfDot + 1, YUAN);

    posted @ 2008-04-10 15:57 金家寶 閱讀(393) | 評論 (0)編輯 收藏

    幾句沒人會說最真實的話!!

    1、80后的重要任務就是制造08后
      2、事實證明在這個世界上,感情經得起風雨,卻經不起平淡;友情經得起平淡,卻經不起風雨
      3、人生沒有彩排,每天都是直播;不僅收視率低,而且工資不高
      4、能用錢解決的問題都不是問題,可問題是我是窮人
      5、春天到了,小樹發芽了,股市也跟著變綠了
      6、人家有的是背景兒,而我有的只有背影兒
      7、唯女人與英雄難過也,唯老婆與工作難找也
      8、不要整天抱怨生活,生活根本就不會知道你是誰,更別說它會聽你的抱怨
      9、是金子總要發光的,但是當滿地都是金子的時候,我自己也不知道自己是哪顆了
      10、在此呼吁大家,學會修自己的筆記本……嗯,學會修自己的筆記本是很重要的……從前有個人,他不會修自己的筆記本……后來的事情大家都知道了
      11、姐不是廣場上算卦的,嘮不出那么多你愛聽的嗑
      12、只知道剛的人,難免會被折斷;只有柔的人,到頭來終是懦夫
      13、找一個像EXCEL一樣的男朋友——想隱藏就隱藏,想篩選就篩選,想刪除就刪除,一個不高興,嘿,我還就不保存了
      14、見到我以后你會突然發現——啊,原來帥也可以這樣具體呀!
      15、不是故事的結局不夠好,而是我們對故事的要求過多
      16、鈔票不是萬能的,有的時候還需要信用卡
      17、愛情就像兩個拉著橡皮筋的人,受傷的總是不愿意放手的那個
      18、鮮花往往不屬于賞花的人,而屬于牛屎
      19、問一同事:"你買了中石油嗎?"同事說:"呸!你才買了中石油呢。你們全家都買了中石油,還買了中石化!"
      20、信念這玩意不是說出來的的,是做出來的。光榮在于平淡,艱巨在于漫長。
      21、中午在食堂叫了兩個菜。吃第一個我震撼了"世界上還有比這更難吃的菜嗎?"吃第二個我哭了"還真有啊"
      22、謊言與誓言的區別在于:一個是聽的人當真了,一個是說的人當真了
      23、單身并不難,難的是應付那些千方百計想讓你結束單身的人

    posted @ 2008-04-10 15:26 金家寶 閱讀(411) | 評論 (2)編輯 收藏

    淘寶風格特色導航!很不錯

    http://www.taobao.com/theme/mall/convenient_row.php?at_iframe=1&f=K2_s_k

    posted @ 2008-04-10 14:01 金家寶 閱讀(295) | 評論 (0)編輯 收藏

    DLookup函數

    ?

    DLookup 函數
    DLookup 函數用于從指定記錄集(一個域)獲取特定字段的值。可以在 Visual Basic、宏、查詢表達式、窗體或報表上的計算控件中使用 DLookup 函數。
    使用 Dlookup 函數可以顯示不在窗體或報表記錄源中的字段值。例如,假定有一個基于“訂單明細”表的窗體,顯示“訂單ID”、“產品ID”、“單價”、“數量”和“折扣”字段。而“產品名稱”字段位于另一個表 (“產品”表)中。通過在計算控件中使用 Dlookup 函數,可以在同一窗體上顯示“產品名稱”。

    DLookup(expr, domain, [criteria])

    DLookup 函數具有下列參數:

    參數 說明
    expr 一個表達式,用于標識需要返回其值的字段。它既可以是用于標識表或查詢中字段的字符串表達式,也可以是以該字段上的數據進行計算的表達式。在 expr 中,可以包括表中字段的名稱、窗體上的控件、常量或函數。如果 expr 包含函數,那么它可以是內置的,也可以是用戶定義的,但不能是另一個域聚合函數或 SQL 聚合函數。
    domain 字符串表達式,代表組成域的記錄集。可以是表名稱或不需要參數的查詢名稱。
    criteria 可選的字符串表達式,用于限制 DLookup 函數執行的數據范圍。例如,criteria 通常等價于 SQL 表達式中的 WHERE 子句,只是不含 WHERE 關鍵字。如果忽略 criteria,DLookup 函數將在整個域范圍內計算 expr。任何包含在 criteria 中的字段必須同時也是 domain 中的字段,否則 Dlookup 函數將返回 Null。


    說明
    DLookup 函數將基于 criteria 中指定的信息返回單個字段的值。雖然 criteria 是可選參數,但如果不給 criteria 提供值,Dlookup 函數將返回域中的一個隨機值。

    如果沒有記錄滿足 criteria,或者 domain 中沒有記錄,DLookup 函數將返回 Null。

    如果有多個字段滿足 criteria,DLookup 函數將返回第一個匹配字段。所以應該指定條件以確保 DLookup 函數返回的字段值是唯一的。可以在條件中使用主鍵值,在下例中,使用 [EmployeeID] 來確保 DLookup 函數返回唯一的值:

    Dim varX As VariantvarX = DLookup("[LastName]", "Employees", "[EmployeeID] = 1")
    無論是在宏、模塊、查詢表達式中,還是在計算控件中使用 DLookup 函數,都必須仔細地構造 criteria 參數,以確保能夠正確地進行計算。

    在查詢的“條件”行、查詢的計算字段表達式中或更新查詢的“更新到”行中均可以使用 DLookup 函數來指定條件。

    如果需要顯示的字段不在窗體或報表所基于的記錄源中,也可以在窗體或報表的計算控件表達式中使用 DLookup 函數。例如,假定有一個“Order Details”窗體基于“Order Details”表,并且含有一個顯示“ProductID”字段的名為“ProductID”的文本框,要從基于這個文本框值的“Products”表中查閱“ProductName”字段,可以創建另一個文本框,并將它的 ControlSource屬性設為如下表達式:

    =DLookup("[ProductName]", "Products", "[ProductID] =" _& Forms![Order Details]!ProductID)
    提示

    雖然可以使用 DLookup 函數顯示來自外部表字段中的值,但是通過創建包含兩表中所需字段的查詢,然后將窗體或報表建立在這個查詢的基礎上,效率將更高。
    也可以使用“查閱向導”來查找外部表中的值。
    注釋?? 使用此函數時,不包括對 domain 記錄未保存的更改。如果希望 DLookup 函數基于更改后的值,必須先保存更改。方法是:單擊“記錄”菜單上的“保存記錄”命令、將焦點移到另一個記錄上,或使用 Update 方法。

    示例
    下面的示例將從滿足 criteria 內容記錄的“CompanyName”字段中返回名稱信息。域為“Shippers”表。criteria 參數將結果記錄集限制為“ShipperID”等于 1 的記錄。

    Dim varX As VariantvarX = DLookup("[CompanyName]", "Shippers", "[ShipperID] = 1")
    下一個示例來自 Shippers 表,它使用窗體控件 ShipperID 來為 DLookup 函數提供條件。請注意,控件的兩側未加上用以表示字符串的引號,這樣可以確保每次調用 DLookup 函數時,Microsoft Access 都將從控件中獲取當前值。

    Dim varX As VariantvarX = DLookup("[CompanyName]", "Shippers", "[ShipperID] = " _& Forms!Shippers!ShipperID)
    下一個示例使用變量 intSearch 來獲取值。

    Dim intSearch As IntegerDim varX As VariantintSearch = 1varX = DLookup("[CompanyName]", "Shippers", _"[ShipperID] = " & intSearch)看書累的,要是看上不怎么樣的書就更累了,還是看系統幫助吧!(2007-01-25 14:58:06)??? 竹笛(56217686)Stemp = DLookup("[用戶編號]","系統用戶","[用戶編號]=''''''''''''''''''''''''''''''''"& Me![用戶編號] &"''''''''''''''''''''''''''''''''") 的意思是 找出 系統用戶 表中 用戶編號字段等于 x 的 用戶編號,不也就是x嘛 (2007-01-25 14:58:51)??? 竹笛(56217686)Stemp = DLookup("[用戶名]","系統用戶","[用戶編號]=''''''''''''''''''''''''''''''''"& Me![用戶編號] &"''''''''''''''''''''''''''''''''") 的意思是 找出 系統用戶 表中 用戶編號字段等于 x 的 用戶名 繼續學習......

    posted @ 2008-04-10 13:46 金家寶 閱讀(734) | 評論 (1)編輯 收藏

    唐僧勸悟空考研的信

    悟空:

    ?? 聽說你又要考研了,你總是一會兒一個想法.上次,在王母娘娘的蟠桃宴上,我碰到你的時候,你不是說你不考研嗎?還說考研這種惡俗的事情你不會做,弄得在場的幾個剛剛考上研的仙童很沒面子.看你又變卦了不是?

    ?? 不過,師父聽說你要考感想,還是很高興的,畢竟又上了一個檔次,對你的發展只有好處沒有壞處.你也看到了,現在西天這邊大家都在考研,你能認清形勢,師父替你高興.
    ??? 按理說,憑你在取經路上的貢獻,應該是能保的,都是你跟上面的關系處不好.當時,上面給我們取經小組一共兩個保研名額,我想就按貢獻大小給你和八戒.報上去后,上面對你的意見大得很,尤其是東海龍王意見最大,說你當年借了他的定海神針,現在還不還.光這一條我就沒有發言權。你說,現在取經結束都已有300年,你還拿那個棒子有什么用?就是有用需要續借,總得打個招呼嘛。你不打招呼,人家怎么知道你要用,給人家打個招呼,人家肯定會讓你續借的嘛。。。。。。有借有還,再借不難。
    ??? 好了,又扯遠了。還是說你保研的事,龍王后來上下活動了一下,最后,你的名額就給了白龍馬,雖然你沒保上有點遺憾,但給白龍馬也算是落到我們小組內,況且白龍馬沒有功勞也有苦勞,給了也就給了。

    再說八戒,人家上面關系處理得好,報上去后,基本沒怎么討論就通過了,面試也放得很松。八戒的導師也不錯,是文殊菩薩。現在,人間也重視教育,所以,文殊菩薩的香火很旺,經費也自然就多,今年報她那兒的人最多。你什么都好,就是在神際關系上處理不好,八戒這一點就比你強。

    你看,同是一個師父帶出來的,人家八戒現在都是研究生畢業,開始帶研究生(聽說今年第一年招生,可能比較好考,你要不就考八戒那里)。而你現在才準備考,唉!
    ??? 我也給你介紹一下我最近的研究情況吧。這也是我給你寫信的主要目的。其實,我就需要你這樣的學生,保過來的幾個動手能力太差,還不聽話,就知道月底向我要工錢。最近,我剛申請了博士點,從明年起就可以帶博士,你要是考這里,我給你一個直博的名額,省得你到時候再考博。最近,我主要研究的課題是“佛界是否應該順應人間宗教市場的崇拜趨勢”。你已經很久沒來西天,你不知道我這個課題還是很熱的,如來很重視,上次開會,如來還問我課題的進展情況。

    ??? 我不是剛才跟你說了,人間現在重視教育,你看文殊的身價上去了,重視經濟,道教的財神爺人氣就很旺,所以,現在伄界也對這個問題重視起來。形成了以觀音為首的“保守派”和以108羅漢為首的“革新派”之爭。“保守派”認為,佛界應該重修行參悟,不要盲從人間崇拜的大流,應該引導眾生慈悲向善,不是一味地迎合大眾的口味。“革新派”認為,佛界應該講市場規律,如果人們都不信佛,我們從哪里來供奉,從哪里來香火?所以,如來給我撥了些經費,讓我成立一個課題組,對這個問題進行調研。
    我是同意“革新派”的(聽口氣,如來也是向著革新派),時代不同了,佛界也要與時倶進嘛。最近,我也取得了一些研究成果,我認為應該設新四大菩薩——“吉托菩薩”(主管GR置、TOLLF考試)、“亨通菩薩”(司官運)、“濟財菩薩”(相當于財神爺)和“高就菩薩”(主管就業)。

    我又扯遠了,好了,悟空,廢話我也不多說了,還是希望你能考我這里。你聰明,又肯動,我這個課題還得多往人間跑,我覺得你合適,你要是愿意的話,過兩天來我這里,我給你畫畫重點,專業課的題是我出的。至于公共課,出題的幾個羅漢我都很熟,幫你打聽一下“重點”也可以,免得你報什么“沖刺班”,還不是他們幾個在那里講?好了,廢話我不多說了,你好好考慮一下吧。

    ??? 祝你考研成功!

    posted @ 2008-04-10 12:15 金家寶 閱讀(222) | 評論 (0)編輯 收藏

    僅列出標題
    共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
    主站蜘蛛池模板: 免费H网站在线观看的| 亚洲日韩乱码中文无码蜜桃臀| 免费国产黄网站在线观看动图| 亚洲成av人无码亚洲成av人| 国产产在线精品亚洲AAVV| 精品一区二区三区免费观看 | 一级毛片高清免费播放| 国产成人精品免费久久久久| 日本免费xxxx| 亚洲AV中文无码乱人伦在线视色| 黄a大片av永久免费| 午夜在线亚洲男人午在线| 久久久www成人免费毛片| 国产香蕉免费精品视频| 亚洲伊人成无码综合网| 久久亚洲AV成人无码国产最大| 中国好声音第二季免费播放| 亚洲成a人片在线观看中文动漫| 99无码人妻一区二区三区免费| 欧美日韩亚洲精品| 亚洲无人区一区二区三区| 最新黄色免费网站| 亚洲精品国自产拍在线观看| 免费在线看黄网站| 亚洲AV电影院在线观看| 性生交片免费无码看人| 特级做A爰片毛片免费看无码| 在线a人片天堂免费观看高清| 亚洲欧洲在线播放| 全黄a免费一级毛片人人爱| 亚洲国产精品一区二区久| 中文字幕免费视频| 亚洲黄色免费在线观看| 免费人妻无码不卡中文字幕系 | 亚洲人成www在线播放| 亚洲精品福利视频| 黄网站免费在线观看| 黄色毛片视频免费| 亚洲成AV人片天堂网无码| 免费人成在线观看网站品爱网日本| 欧美三级在线电影免费|