锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 琛ㄧ┖闂存槸閫昏緫瀛樻斁鎵鏈夋暟鎹殑鍦版柟錛岄粯璁ゆ儏鍐典笅浼氬叡浜竴涓〃絀洪棿——ibdata1錛屼絾濡傛灉鎶?/span>innodb_file_per_table=ON鍚庢瘡寮犺〃鍙互鍗曠嫭鏀懼埌涓涓〃絀洪棿鍐咃紝浣嗚繕鏄湁寰堝鏁版嵁淇濆瓨鍦ㄥ叡浜殑琛?/span>ibdata1涓紝濡?/span>undo淇℃伅絳夈?/span> 琛ㄧ┖闂寸敱鍚勭孌?/span>(segment)緇勬垚錛屽父瑙佺殑孌墊湁鏁版嵁孌點佺儲寮曟絳夈?/span>Innodb鏄儲寮曠粍緇囩殑錛屾暟鎹灝辨槸clustered index鐨勫彾緇撶偣銆傞渶瑕佹敞鎰忕殑鏄紝涓嶆槸姣忎釜瀵硅薄閮芥湁孌點?/span> 鍖?/span>(extend)鏄敱64涓繛緇殑欏電粍鎴愶紝姣忎釜欏碉紙page錛夊浐瀹氫負16KB錛屾墍浠ユ瘡涓尯鎬誨叡涓?/span>1M銆傞〉鏄?/span>innodb鏈灝忕殑紓佺洏綆$悊鍗曚綅銆?/span> Innodb鏄寜琛岃繘琛屽瓨鏀劇殑錛屾瘡涓尯鏈灝戝彲浠ヤ繚瀛?/span>2鏉¤褰曪紝鍚﹀垯灝辨垚閾懼紡緇撴瀯浜嗐傛瘡琛屾暟鎹櫎浜嗚嚜瀹氫箟鍒椾互澶栵紝榪樹細澧炲姞浜嬪姟id鍜屽洖婊氭寚閽堝垪銆傚鏋滄病鏈夊畾涔?/span>primary key涔熸病鏈?/span>not null鐨?/span>unique,鍒欎細澧炲姞6瀛楄妭鐨?/span>RowId鍒椾綔涓轟富閿?br /> 涓涓〃涓嶈兘鍖呭惈瓚呰繃1000鍒椼?/span> 鍐呴儴鏈澶ч敭闀垮害鏄?/span>3500瀛楄妭錛屼絾MySQL鑷繁闄愬埗榪欎釜鍒?/span>1024瀛楄妭銆?/span> 闄や簡VARCHAR, BLOB鍜?/span>TEXT鍒楋紝鏈澶ц闀垮害紼嶅井灝忎簬鏁版嵁搴撻〉鐨勪竴鍗娿傚嵆錛屾渶澶ц闀垮害澶х害8000瀛楄妭銆?/span>LONGBLOB鍜?/span>LONGTEXT鍒楀繀欏誨皬浜?/span>4GB, 鎬葷殑琛岄暱搴︼紝欏靛寘鎷?/span>BLOB鍜?/span>TEXT鍒楋紝蹇呴』灝忎簬4GB銆?/span>InnoDB鍦ㄨ涓瓨鍌?/span>VARCHAR錛?/span>BLOB鎴?/span>TEXT鍒楃殑鍓?/span>768瀛楄妭錛屼綑涓嬬殑瀛樺偍鐨勫垎鏁g殑欏典腑銆?/span> 铏界劧InnoDB鍐呴儴鍦版敮鎸佽灝哄澶т簬65535錛屼綘涓嶈兘瀹氫箟涓涓寘鍚?/span>VARCHAR鍒楃殑錛屽悎騫跺昂瀵稿ぇ浜?/span>65535鐨勮銆?/span> · mysql> CREATE TABLE t (a VARCHAR(8000), b VARCHAR(10000), · -> c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), · -> f VARCHAR(10000), g VARCHAR(10000)); · ERROR 1118 (42000): Row size too large. The maximum row size for the · used table type, not counting BLOBs, is 65535. You have to change some · columns to TEXT or BLOBs 鍦ㄤ竴浜涙洿鑰佺殑鎿嶄綔緋葷粺涓婏紝鏁版嵁鏂囦歡蹇呴』灝忎簬2GB銆?/span> InnoDB鏃ュ織鏂囦歡鐨勫悎騫跺昂瀵稿繀欏誨皬浜?/span>4GB銆?/span> 鏈灝忕殑琛ㄧ┖闂村昂瀵告槸10MB銆傛渶澶х殑琛ㄧ┖闂村昂瀵告槸4,000,000,000涓暟鎹簱欏碉紙64TB錛夈傝繖涔熸槸涓涓〃鐨勬渶澶у昂瀵搞?/span> InnoDB琛ㄤ笉鏀寔FULLTEXT绱㈠紩 榛樿鎯呭喌涓?/span>Memory浣跨敤瀛樺偍hash绱㈠紩錛屼絾涔熸敮鎸?/span>b+tree绱㈠紩銆?/span>Hash绱㈠紩鍙敤浜?/span>=鎴栬?/span><=>鐨勭瓑寮忔瘮杈冿紝涓嶈兘鐢ㄦ潵鍔犻?/span>order by鎿嶄綔錛屽彧鑳介氳繃鍏抽敭瀛楁潵鎼滅儲涓琛屻?/span>innodb鍙敮鎸?/span>b+鏍戠儲寮曪紝榪涗竴姝ュ垎涓?/span>clustered index 涓庛secondary index銆傚湪涓嬈℃煡璇腑錛屽彧鑳戒嬌鐢ㄤ竴涓儲寮曘?/span> Innodb鏄儲寮曠粍緇囪〃錛?/span>clustered index鐨勫彾緇撶偣淇濆瓨鐫鏁磋鐨勬暟鎹傚鏋滐紝瀹氫箟浜?/span>primary key錛屽垯clustered index灝辨槸primary key鐨勭儲寮曪紱濡傛灉娌℃湁瀹氫箟primary key mysql浼氶変腑絎竴涓粎鏈?/span>not null鍒楃殑unique绱㈠紩浣滀負涓婚敭錛屽茍鎶婃绱㈠紩褰撲綔clustered index浣跨敤錛涘鏋滄病鎵懼埌榪欐牱鐨勫垪錛?/span>innodb浼氬垱寤轟竴涓?/span>6瀛楄妭鐨?/span>RowId浣滀負涓婚敭銆傛墍浠ユ瘡寮犺〃鏈変笖鍙湁涓涓?/span>clustered index銆?/span> Secondary index鐨勫彾緇撶偣涓嶅寘鎷鐨勫叏閮ㄦ暟鎹紝鍖呭惈閿間互澶栬繕鍖呮嫭涓涓?/span>bookmark錛屽彲浠ュ憡璇?/span>innodb鍒頒粈涔堝湴鏂瑰彲浠ユ壘鍒扮浉瀵瑰簲鐨勫畬鏁磋鏁版嵁錛岃繕淇濆瓨浜嗕富閿殑鍋ュ箋?/span>Secondary index鍖呭惈涓婚敭錛屼絾涓嶅寘鍚畬鏁寸殑琛屾暟鎹紝鎵浠?/span>innodb鎬繪槸浼氬厛浠?/span>secondary index鐨勫彾鑺傜偣鍒ゆ柇鏄惁鑳藉緱鍒版墍闇鐨勬暟鎹傚, Create table t(a int, b varchar(20), primary key(a), key(b)); Explain select * from t; 浼氬彂鐜?/span>mysql閫夋嫨浜嗙儲寮?/span>b錛岃屼笉鏄?/span>a. 澶嶅悎绱㈠紩鏄湪澶氬垪錛?/span>>=2錛変笂寤虹珛鐨勭儲寮曪紝鍙堝彨澶氬垪绱㈠紩鎴栬仈鍚堢儲寮曘?/span>Innodb涓殑澶嶅悎绱㈠紩涔熸槸b+ tree緇撴瀯銆傜儲寮曠殑鏁版嵁鍖呭惈澶氬垪(col1, col2, col3…)錛屽湪绱㈠紩涓緷嬈℃寜鐓?/span>col1, col2, col3鎺掑簭銆傚(1, 2), (1, 3),(2,0)… 浣跨敤澶嶅悎绱㈠紩瑕佸厖鍒嗗埄鐢ㄦ渶宸﹀墠緙鍘熷垯錛岄【鍚嶆濅箟錛屽氨鏄渶宸︿紭鍏堛傚鍒涘緩绱㈠紩ind_col1_col2(col1, col2)錛岄偅涔堝湪鏌ヨwhere col1 = xxx and col2 = xx鎴栬?/span>where col1 = xxx閮藉彲浠ヨ蛋ind_col1_col2绱㈠紩銆?/span> 鍦ㄥ垱寤哄鍒楃儲寮曟椂錛岃鏍規嵁涓氬姟闇姹傦紝where瀛愬彞涓嬌鐢ㄦ渶棰戠箒涓旇繃婊ゆ晥鏋滃ソ鐨勭殑涓鍒楁斁鍦ㄦ渶宸﹁竟銆?/span> 鍙互閫氳繃DML璇彞鎿嶄綔innodb绱㈠紩銆傚洜涓?/span>innodb鏄儲寮曠粍緇囩殑琛紝瀵圭儲寮曠殑鎿嶄綔浼氶犳垚閿佽〃錛屽厛鐢熸垚涓寮犱復鏃惰〃錛屽皢鏁版嵁浠庡師濮嬭〃涓啓鍒頒復鏃惰〃錛屽啀灝嗗師濮嬭〃鍒犻櫎錛屾渶鍚庡皢涓存椂琛ㄨ〃鍚嶆敼涓哄師濮嬭〃琛ㄥ悕錛佸洜澧炲姞銆佸垹闄ゃ佷慨鏀瑰瓧孌典細瀵逛富绱㈠紩浜х敓褰卞搷錛屾墍浠ヤ篃浼氶攣琛ㄣ傚secondary index浠?/span>Innodb plugin寮濮嬶紝鏀寔蹇熺儲寮曞垱寤虹殑鏂規硶錛屽湪鍒涘緩鐨勮繃紼嬩腑涓嶉渶瑕侀噸寤鴻〃錛屾墍浠ラ熷害浼氬緢蹇紝鍚屾椂寮曟搸浼氬湪琛ㄤ笂鍔?/span>S閿侊紝鍦ㄥ垱寤鴻繃紼嬩腑鍙兘榪涜璇繪搷浣溿?/span> 1. 鎼滅儲鐨勭儲寮曞垪錛屼笉涓瀹氭槸鎵瑕侀夋嫨鐨勫垪銆備篃灝辨槸璇達紝鏈閫傚悎绱㈠紩鐨勫垪鏄嚭鐜板湪where瀛愬彞涓殑鍒楋紝鎴栬呰繛鎺ュ瓙鍙ヤ腑鎸囧畾鐨勫垪錛岃屼笉鏄嚭鐜板湪select鍏抽敭瀛楀悗鐨勯夋嫨鍒楄〃涓殑鍒椼?/span> 2. 浣跨敤鍞竴绱㈠紩銆傝冭檻鏌愬垪鐨勫垎甯冿紝绱㈠紩鐨勫垪鐨勫熀鏁拌秺澶э紝绱㈠紩鐨勬晥鏋滆秺濂姐備緥濡傦紝瀵規у埆M/F鍒楀仛绱㈠紩娌″澶х敤澶勩?/span> 3. 浣跨敤鐭儲寮曘傚鏋滄槸瀵瑰瓧絎︿覆榪涜绱㈠紩錛屽鏋滄湁鍙兘搴旇鎸囧畾鍓嶇紑闀垮害銆?/span> 4. 鍒╃敤鏈宸﹀墠緙銆傚敖閲忓皢浣跨敤棰戠箒涓旇繃婊ゆ晥鏋滃ソ鐨勫瓧孌墊斁“宸﹁竟” 5. 涓嶈榪囧害绱㈠紩銆?/span> 6. Innodb榛樿浼氭寜鐓т竴瀹氱殑欏哄簭淇濆瓨鏁版嵁錛屽鏋滄槑紜畾涔変簡涓婚敭錛屽垯鎸夌収涓婚敭欏哄簭淇濆瓨銆傚鏋滄病鏈変富閿紝浣嗘湁鍞竴绱㈠紩錛屽氨鎸夌収鍞竴绱㈠紩鐨勯『搴忎繚瀛樸傚鏋滄湁鍑犱釜鍒楅兘鏄敮涓鐨勶紝閮藉彲浠ヤ綔涓轟富閿殑鏃跺欙紝涓轟簡鎻愰珮鏌ヨ鏁堢巼錛屽簲閫夋嫨鏈甯哥敤璁塊棶鐨勫垪浣滀負涓婚敭銆傚彟澶栵紝innodb鐨?/span>secondary index閮戒細淇濆瓨涓婚敭鐨勯敭鍊鹼紝鎵鏈変富閿灝藉彲鑳介夋嫨杈冪煭鐨勬暟鎹被鍨嬨傚彲浠ョ湅鍑猴紝搴斿綋灝介噺閬垮厤瀵逛富閿殑淇敼銆傜粡榪?/span>dba鐨勬祴璇曪紝淇濊瘉涓婚敭鐨勯掑鍙互鎻愰珮鎻掑叆鎬ц兘銆?/span> 1. 瀵逛簬鍒涘緩鐨勫鍒楃儲寮曪紝鍙鏌ヨ鐨勬潯浠朵腑鐢ㄥ埌浜嗘渶宸﹁竟鐨勫垪錛岀儲寮曚竴鑸氨浼氳浣跨敤銆?/span> 2. 瀵逛簬浣跨敤like鐨勬煡璇紝鍚庨潰濡傛灉鏄父閲忓茍涓斿彧鏈?/span>%鍙蜂笉鍦ㄧ涓涓瓧絎︼紝绱㈠紩鎵嶅彲鑳借浣跨敤銆?/span> 3. 濡傛灉瀵瑰ぇ鏂囨湰榪涜鎼滅儲錛屽簲璇ヤ嬌鐢ㄥ叏鏂囩儲寮曪紝鑰屼笉鏄嬌鐢?/span>like ‘%...%’. 浣嗕笉騫哥殑鏄?/span>innodb涓嶆敮鎸佸叏鏂囩儲寮曘?/span> 4. 濡傛灉鍒楀悕鏄儲寮曪紝浣跨敤 index_column is null灝嗕嬌鐢ㄧ儲寮曘?/span>Oracle鏄笉琛岀殑銆?/span> 5. 濡傛灉mysql浼拌浣跨敤绱㈠紩姣斿叏琛ㄦ壂鎻忔洿鎱紝鏈涓嶄細浣跨敤绱㈠紩銆?/span> 6. 濡傛灉浣跨敤memory/head琛ㄥ茍涓?/span>where鏉′歡涓笉浣跨敤”=”榪涜绱㈠紩鍒楋紝閭d箞涓嶄細鐢ㄥ埌绱㈠紩銆?/span>Head琛ㄥ彧鏈夊湪”=”鐨勬椂鍊欐墠浼氫嬌鐢ㄧ儲寮曘?/span> 7. 鐢?/span>or鍒嗗壊寮鐨勬潯浠訛紝濡傛灉or鍓嶇殑鏉′歡涓殑鍒楁湁绱㈠紩錛岃屽悗闈㈠垪涓病鏈夌儲寮曪紝閭d箞娑夊強鍒扮殑绱㈠紩閮戒笉浼氳鐢ㄥ埌銆?/span> 8. 涓嶆槸澶氬垪绱㈠紩鐨勭涓閮ㄥ垎涓嶄細璧扮儲寮曘?/span> 9. 浠?/span>%寮濮嬬殑like涓嶄細璧扮儲寮?/span> 10. 濡傛灉鍒楁槸瀛楃涓詫紝閭d箞涓瀹氳鍦?/span>where鏉′歡涓妸瀛楃涓插父閲忓肩敤寮曞彿寮曡搗鏉ワ紝鍚﹀垯涓嶈兘璧扮儲寮曘傚洜涓猴紝mysql榛樿鎶婅緭鍏ョ殑甯擱噺鍊艱繘琛岃漿鎹互鍚庢墠榪涜媯绱€?/span> 11. 緇忚繃鏅氳繍綆楁垨鍑芥暟榪愮畻鍚庣殑绱㈠紩瀛楁涓嶈兘浣跨敤绱㈠紩 12. 涓嶇瓑浜庢搷浣滀笉鑳戒嬌鐢ㄧ儲錛?/span><>銆?/span>not in絳?/span> 13. Order by 浼樺寲錛氭煇浜涙儏鍐典笅錛?/span>mysql鍙互浣跨敤涓涓儲寮曟弧瓚?/span>order by,鑰屼笉闇瑕侀澶栫殑鎺掑簭銆?/span>Where鏉′歡涓?/span>order by 浣跨敤鐩稿悓鐨勭儲寮曪紝騫朵笖order by鐨勯『搴忓拰绱㈠紩欏哄簭鐩稿悓錛屽茍涓?/span>order by鐨勫瓧孌甸兘鏄崌搴忔垨鑰呴兘鏄檷搴忋?/span> SELECT * FROM t1 ORDER BY key_part1,key_part2,... ; SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC; SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC; 浣嗘槸浠ヤ笅鎯呭喌涓嶄嬌鐢ㄧ儲寮曪細 SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC 錛?/span> --order by 鐨勫瓧孌墊販鍚?/span> ASC 鍜?/span> DESC SELECT * FROM t1 WHERE key2=constant ORDER BY key1 錛?/span> -- 鐢ㄤ簬鏌ヨ琛岀殑鍏抽敭瀛椾笌 ORDER BY 涓墍浣跨敤鐨勪笉鐩稿悓 SELECT * FROM t1 ORDER BY key1, key2 錛?/span> -- 瀵逛笉鍚岀殑鍏抽敭瀛椾嬌鐢?/span> ORDER BY 鍙互浣跨敤explain鏌ョ湅sql鐨勬墽琛岃鍒掋?/span> 姣忎竴涓?/span>try璇彞鍧?/span>catch鐨勫紓甯擱兘涓庡紓甯歌〃涓殑涓欏圭浉瀵瑰簲錛屽紓甯歌〃涓殑姣忎竴欏歸兘鍖呮嫭錛?/span> 渚嬪錛?/p>
鐢?/span>javap –c鏌ョ湅瀛楄妭鐮佸涓嬶細 鍙ClassNotFoundException寮傚父鍙兘浼氬湪0~6涔嬮棿鎶涘嚭錛?/span>9寮濮嬪鐨勪唬鐮佸鐞嗘寮傚父銆?/span> 褰撲駭鐢熷紓甯哥殑鏃跺欙紝jvm灝嗕細鍦ㄦ暣涓紓甯歌〃涓悳绱笌涔嬪尮閰嶇殑欏癸紝濡傛灉褰撳墠pc鍦ㄥ紓甯歌〃鍏ュ彛鎵鎸囩殑鑼冨洿鍐咃紝騫朵笖鎵鎶涘嚭鐨勫紓甯告槸姝ゅ叆鍙f墍鎸囧悜鐨勭被鎴栬呭叾瀛愮被錛屽垯璺寵漿鍒板搴旂殑澶勭悊浠g爜緇х畫鎵ц銆?/span> Class鏂囦歡鐨?/span>attribute_info涓繚瀛樻湁Exceptions灞炴э紝璁板綍鐫姣忎釜鏂規硶throws鐨勫紓甯鎬俊鎭傚叿浣撶殑鍙互鏌ョ湅class綾繪枃浠舵牸寮忕浉鍏崇殑鏂囩珷銆?/span> athrow鎸囦護浠庢爤欏跺脊鍑?/span>Throwable瀵硅薄寮曠敤錛屾姏鍑哄紓甯搞?/span> 鍦?/span>jvm瑙勮寖涓紝finally璇彞鏄氳繃jsr/jsr_w涓?/span>ret鎸囦護瀹炵幇鐨勩傚綋鎵цjsr/jsr_w鐨勬椂鍊欏皢finally鎵ц瀹屾垚鍚庣殑榪斿洖鍦板潃鍘嬪叆鏍堜腑錛岃繘鍏?/span>finally鍚庝細椹笂灝嗘鍦板潃淇濆瓨鍒頒竴涓眬閮ㄥ彉閲忎腑錛屾墽琛屽畬鎴愬悗錛?/span>ret浠庢灞閮ㄥ彉閲忎腑鍙栧嚭榪斿洖鍦板潃銆傦紵錛燂紵涓轟粈涔堜細鍏堟妸榪斿洖鍦板潃淇濆瓨鍒板眬閮ㄥ彉閲忎腑鍛紵錛燂紵鍥犱負錛屽綋浠?/span>finally璇彞榪斿洖鐨勬椂鍊欓渶瑕佸皢榪斿洖鍦板潃鎴愭爤涓脊鍑猴紝褰?/span>finally璇彞闈炴甯哥粨鏉?/span>(break,continue,return, 鎶涘紓甯?/span>)鐨勬椂鍊欏氨涓嶇敤鍐嶈冭檻榪欎釜闂銆?/span> 浠ヤ笅鏄?/span>jvm瑙勮寖涓?/span>Compiling finally鐨勪竴孌碉細 褰?/span>tryItOut鎺掗櫎浠諱綍寮傚父鍚庨兘灝嗕細琚紓甯歌〃涓殑any欏規崟鑾鳳紝鎵ц瀹?/span>finally鍚庯紝浼氭墽琛?/span>athrow鎸囦護灝嗗紓甯告姏鍑恒?/span> 浠?/span>jdk鐨勬煇涓涓増鏈紑濮嬪氨涓嶄細緙栬瘧鍑虹紪璇戝嚭鍚?/span>jsr/jsr_w銆?/span>ret鐨勫瓧鑺傜爜浜嗭紝鍥犱負鏈夋寚浠や笂鐨勭己闄鳳紝瀵艱嚧jvm鐨勬楠屽拰鍒嗘瀽緋葷粺鍑虹幇婕忔礊銆?/span> 鍦?/span>finally涓嬌鐢?/span>break銆?/span>continue銆?/span>return銆佹姏鍑哄紓甯哥瓑璁や負鏄?/span>finally鐨勯潪姝e父緇撴潫銆傞潪姝e父緇撴潫鐨勬椂鍊欙紝ret鎸囦護涓嶄細琚墽琛岋紝寰堝彲鑳戒細鍑虹幇鎰忔兂涓嶅埌鐨勭粨鏋溿傚錛?/span>
鍥劇墖鏉ヨ嚜錛?a >http://www.cnblogs.com/chjw8016/archive/2011/03/08/1976891.htmlInnodb琛ㄧ殑闄愬埗
Innodb绱㈠紩
澶嶅悎绱㈠紩
绱㈠紩鎿嶄綔
绱㈠紩璁捐鍘熷垯
Mysql濡備綍浣跨敤绱㈠紩
Bridge methods in Java are synthetic methods, which are necessary to implement some of Java language features. The best known samples are covariant return type and a case in generics when erasure of base method's arguments differs from the actual method being invoked.
Have a look at following example:
public static class A<T> {
public T getT() {
return null;
}
}
public static class B extends A<String> {
public String getT() {
return null;
}
}
}
public static class A {
public Object getT() {
return null;
}
}
public static class B extends A {
public String getT() {
return null;
}
}
}
And after the compilation decompiled result class "B" will be following:
public SampleOne$B();
public java.lang.String getT();
Code:
0: aconst_null
1: areturn
public java.lang.Object getT();
Code:
0: aload_0
1: invokevirtual #2; // Call to Method getT:()Ljava/lang/String;
4: areturn
}
Above you can see there is new synthetic method "java.lang.Object getT()" which is not present in source code. That method acts as bridge method and all is does is delegating invocation to "java.lang.String getT()". Compiler has to do that, because in JVM method return type is part of method's signature, and creation of bridge method is the way to implement covariant return type.
Now have a look at following example which is generics-specific:
public class SampleTwo {
public static class A<T> {
public T getT(T args) {
return args;
}
}
public static class B extends A<String> {
public String getT(String args) {
return args;
}
}
}
after compilation class "B" will be transformed into following:
public class SampleThree$B extends SampleThree$A{
public SampleThree$B();
public java.lang.String getT(java.lang.String);
Code:
0: aload_1
1: areturn
public java.lang.Object getT(java.lang.Object);
Code:
0: aload_0
1: aload_1
2: checkcast #2; //class java/lang/String
5: invokevirtual #3; //Method getT:(Ljava/lang/String;)Ljava/lang/String;
8: areturn
}
here, the bridge method, which overrides method from base class "A", not just calling one with string argument (#3), but also performs type cast to "java.lang.String" (#2). It means, that if you will execute following code, ignoring compiler's "unchecked" warning, the result will be ClassCastException thrown from the bridge method:
A a = new B();
a.getT(new Object()));
These two examples are the best known cases where bridge methods are used, but there is, at least, one more, where bridge method is used to "change" visibility of base class's methods. Have a look at following sample and try to guess where compiler may need the bridge method to be created:
package samplefour;
public class SampleFour {
static class A {
public void foo() {
}
}
public static class C extends A {
}
public static class D extends A {
public void foo() {
}
}
}
public class SampleFour$C extends SampleFour$A{
public void foo();
Code:
0: aload_0
1: invokespecial #2; //Method SampleFour$A.foo:()V
4: return
}
compiler needs that method, because class A is not public and can't be accessed outside it's package, but class C is public and all inherited method have to become visible outside the package as well. Note, that class D will not have bridge method, because it overrides "foo" and there is no need to "increase" visibility.
It looks like, that type of bridge method, was introduced after bug which was fixed in Java 6. It means that before Java 6 that type of bridge method is not generated and method "C#foo" can't be called from package other than it's own via reflection, so following snippet causes IllegalAccessException, in cases when compiled on Java version < 1.6:
package samplefive;
SampleFour.C.class.getMethod("foo").invoke(new SampleFour.C());
Probably there are some other cases where bridge methods are used, but there is no source of information about it. Also, there is no definition of bridge method, although you can guess it easily, it's pretty obvious from examples above, but still would be nice to have something in spec which states it clearly. In spite of the fact that method Method#isBridge() is part of public reflection API since Java1.5 and bridge flag is part of class file format, JVM and JLS specifications do not have any information what exactly is that and do not provide any rules when and how it should be used by compiler. All I could find is just reference in "Discussion" area here.public class Test {
public static void main(String[] args) {
try {
Class.forName("java.lang.String");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String java.lang.String
2: invokestatic #3; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
5: pop
6: goto 14
9: astore_1
10: aload_1
11: invokevirtual #5; //Method java/lang/ClassNotFoundException.printStackTrace:()V
14: return
Exception table:
from to target type
0 6 9 Class java/lang/ClassNotFoundException
}
鏂規硶鍙兘浼氭姏鍑哄摢浜涘凡媯鏌ュ紓甯?/span>
finally璇彞
void tryFinally() {
try {
tryItOut();
} finally {
wrapItUp();
}
}
the compiled code is
Method void tryFinally()
0 aload_0 // Beginning of try block
1 invokevirtual #6 // Method Example.tryItOut()V
4 jsr 14 // Call finally block
7 return // End of try block
8 astore_1 // Beginning of handler for any throw
9 jsr 14 // Call finally block
12 aload_1 // Push thrown value
13 athrow //
and rethrow the value to the invoker
14 astore_2 // Beginning of finally block
15 aload_0 // Push this
16 invokevirtual #5 // Method Example.wrapItUp()V
19 ret 2 // Return from finally block
Exception table:
From To Target Type
0 4 8 any
鍐嶈finally鐨勯潪姝e父閫鍑?/span>
public class Test {
public static boolean test(boolean b) {
while (b) {
try {
return true;
} finally {
/*
break; 濮嬬粓榪斿洖false
continue; javac緙栬瘧鍐峧ava鎵ц浼氬嚭鐜版寰幆
鍦╡clipse涓敋鑷充細鍑虹幇鎶ラ敊錛氭彁紺烘壘鍒頒笉main class
return false; 濮嬬粓榪斿洖false
throw new RuntimeException(""); 鎶涘嚭寮傚父
*/
}
}
return false;
}
public static void main(String[] args) {
System.out.println(test(true));
}
}
寤鴻錛氬湪鍐?/span>finally璇彞鐨勬椂鍊欙紝灝介噺閬垮厤闈炴甯哥粨鏉燂紒
鍗曞簱鍗曡〃鏄渶甯歌鐨勬暟鎹簱璁捐錛屼緥濡傦紝鏈変竴寮犵敤鎴?span lang="EN-US">(user)琛ㄦ斁鍦ㄦ暟鎹簱db涓紝鎵鏈夌殑鐢ㄦ埛閮藉彲浠ュ湪db搴撲腑鐨?span lang="EN-US">user琛ㄤ腑鏌ュ埌銆?/p>
闅忕潃鐢ㄦ埛鏁伴噺鐨勫鍔狅紝user琛ㄧ殑鏁版嵁閲忎細瓚婃潵瓚婂ぇ錛屽綋鏁版嵁閲忚揪鍒頒竴瀹氱▼搴︾殑鏃跺欏user琛ㄧ殑鏌ヨ浼氭笎娓愮殑鍙樻參錛屼粠鑰屽獎鍝嶆暣涓?span lang="EN-US">DB鐨勬ц兘銆傚鏋滀嬌鐢?span lang="EN-US">mysql, 榪樻湁涓涓洿涓ラ噸鐨勯棶棰樻槸錛屽綋闇瑕佹坊鍔犱竴鍒楃殑鏃跺欙紝mysql浼氶攣琛紝鏈熼棿鎵鏈夌殑璇誨啓鎿嶄綔鍙兘絳夊緟銆?/p>
鍙互閫氳繃鏌愮鏂瑰紡灝?span lang="EN-US">user榪涜姘村鉤鐨勫垏鍒嗭紝浜х敓涓や釜琛ㄧ粨鏋勫畬鍏ㄤ竴鏍風殑user_0000,user_0001絳夎〃錛?span lang="EN-US">user_0000 + user_0001 + …鐨勬暟鎹垰濂芥槸涓浠藉畬鏁寸殑鏁版嵁銆?/p>
闅忕潃鏁版嵁閲忓鍔犱篃璁稿崟鍙?span lang="EN-US">DB鐨勫瓨鍌ㄧ┖闂翠笉澶燂紝闅忕潃鏌ヨ閲忕殑澧炲姞鍗曞彴鏁版嵁搴撴湇鍔″櫒宸茬粡娌″姙娉曟敮鎾戙傝繖涓椂鍊欏彲浠ュ啀瀵規暟鎹簱榪涜姘村鉤鍖哄垎銆?/p>
璁捐琛ㄧ殑鏃跺欓渶瑕佺‘瀹氭琛ㄦ寜鐓т粈涔堟牱鐨勮鍒欒繘琛屽垎搴撳垎琛ㄣ備緥濡傦紝褰撴湁鏂扮敤鎴鋒椂錛岀▼搴忓緱紜畾灝嗘鐢ㄦ埛淇℃伅娣誨姞鍒板摢涓〃涓紱鍚岀悊錛屽綋鐧誨綍鐨勬椂鍊欐垜浠緱閫氳繃鐢ㄦ埛鐨勮處鍙鋒壘鍒版暟鎹簱涓搴旂殑璁板綍錛屾墍鏈夌殑榪欎簺閮介渶瑕佹寜鐓ф煇涓瑙勫垯榪涜銆?/p>
閫氳繃鍒嗗簱鍒嗚〃瑙勫垯鏌ユ壘鍒板搴旂殑琛ㄥ拰搴撶殑榪囩▼銆傚鍒嗗簱鍒嗚〃鐨勮鍒欐槸user_id mod 4鐨勬柟寮忥紝褰撶敤鎴鋒柊娉ㄥ唽浜嗕竴涓處鍙鳳紝璐﹀彿id鐨?span lang="EN-US">123,鎴戜滑鍙互閫氳繃id mod 4鐨勬柟寮忕‘瀹氭璐﹀彿搴旇淇濆瓨鍒?span lang="EN-US">User_0003琛ㄤ腑銆傚綋鐢ㄦ埛123鐧誨綍鐨勬椂鍊欙紝鎴戜滑閫氳繃123 mod 4鍚庣‘瀹氳褰曞湪User_0003涓?/p>
1. 鍒嗗簱鍒嗚〃緇村害鐨勯棶棰?/p>
鍋囧鐢ㄦ埛璐拱浜嗗晢鍝?span lang="EN-US">,闇瑕佸皢浜ゆ槗璁板綍淇濆瓨鍙栨潵錛屽鏋滄寜鐓х敤鎴風殑綰害鍒嗚〃錛屽垯姣忎釜鐢ㄦ埛鐨勪氦鏄撹褰曢兘淇濆瓨鍦ㄥ悓涓琛ㄤ腑錛屾墍浠ュ緢蹇緢鏂逛究鐨勬煡鎵懼埌鏌愮敤鎴風殑璐拱鎯呭喌錛屼絾鏄煇鍟嗗搧琚喘涔扮殑鎯呭喌鍒欏緢鏈夊彲鑳藉垎甯冨湪澶氬紶琛ㄤ腑錛屾煡鎵捐搗鏉ユ瘮杈冮夯鐑︺傚弽涔嬶紝鎸夌収鍟嗗搧緇村害鍒嗚〃錛屽彲浠ュ緢鏂逛究鐨勬煡鎵懼埌姝ゅ晢鍝佺殑璐拱鎯呭喌錛屼絾瑕佹煡鎵懼埌涔頒漢鐨勪氦鏄撹褰曟瘮杈冮夯鐑︺?/p>
鎵浠ュ父瑙佺殑瑙e喅鏂瑰紡鏈夛細
a.閫氳繃鎵〃鐨勬柟寮忚В鍐籌紝姝ゆ柟娉曞熀鏈笉鍙兘錛屾晥鐜囧お浣庝簡銆?/p>
b.璁板綍涓や喚鏁版嵁錛屼竴浠芥寜鐓х敤鎴風含搴﹀垎琛紝涓浠芥寜鐓у晢鍝佺淮搴﹀垎琛ㄣ?/p>
c.閫氳繃鎼滅儲寮曟搸瑙e喅錛屼絾濡傛灉瀹炴椂鎬ц姹傚緢楂橈紝鍙堝緱鍏崇郴鍒板疄鏃舵悳绱€?/p>
2. 鑱斿悎鏌ヨ鐨勯棶棰?/p>
鑱斿悎鏌ヨ鍩烘湰涓嶅彲鑳斤紝鍥犱負鍏寵仈鐨勮〃鏈夊彲鑳戒笉鍦ㄥ悓涓鏁版嵁搴撲腑銆?/p>
3. 閬垮厤璺ㄥ簱浜嬪姟
閬垮厤鍦ㄤ竴涓簨鍔′腑淇敼db0涓殑琛ㄧ殑鏃跺欏悓鏃朵慨鏀?span lang="EN-US">db1涓殑琛紝涓涓槸鎿嶄綔璧鋒潵鏇村鏉傦紝鏁堢巼涔熶細鏈変竴瀹氬獎鍝嶃?/p>
4. 灝介噺鎶婂悓涓緇勬暟鎹斁鍒板悓涓DB鏈嶅姟鍣ㄤ笂
渚嬪灝嗗崠瀹?span lang="EN-US">a鐨勫晢鍝佸拰浜ゆ槗淇℃伅閮芥斁鍒?span lang="EN-US">db0涓紝褰?span lang="EN-US">db1鎸備簡鐨勬椂鍊欙紝鍗栧a鐩稿叧鐨勪笢瑗垮彲浠ユ甯鎬嬌鐢ㄣ備篃灝辨槸璇撮伩鍏嶆暟鎹簱涓殑鏁版嵁渚濊禆鍙︿竴鏁版嵁搴撲腑鐨勬暟鎹?/p>
鍦ㄥ疄闄呯殑搴旂敤涓紝緇濆ぇ閮ㄥ垎鎯呭喌閮芥槸璇昏繙澶т簬鍐欍?span lang="EN-US">Mysql鎻愪緵浜嗚鍐欏垎紱葷殑鏈哄埗錛屾墍鏈夌殑鍐欐搷浣滈兘蹇呴』瀵瑰簲鍒?span lang="EN-US">Master錛岃鎿嶄綔鍙互鍦?span lang="EN-US">Master鍜?span lang="EN-US">Slave鏈哄櫒涓婅繘琛岋紝Slave涓?span lang="EN-US">Master鐨勭粨鏋勫畬鍏ㄤ竴鏍鳳紝涓涓?span lang="EN-US">Master鍙互鏈夊涓?span lang="EN-US">Slave,鐢氳嚦Slave涓嬭繕鍙互鎸?span lang="EN-US">Slave,閫氳繃姝ゆ柟寮忓彲浠ユ湁鏁堢殑鎻愰珮DB闆嗙兢鐨?span lang="EN-US">QPS.
鎵鏈夌殑鍐欐搷浣滈兘鏄厛鍦?span lang="EN-US">Master涓婃搷浣滐紝鐒跺悗鍚屾鏇存柊鍒?span lang="EN-US">Slave涓婏紝鎵浠ヤ粠Master鍚屾鍒?span lang="EN-US">Slave鏈哄櫒鏈変竴瀹氱殑寤惰繜錛屽綋緋葷粺寰堢箒蹇欑殑鏃跺欙紝寤惰繜闂浼氭洿鍔犱弗閲嶏紝Slave鏈哄櫒鏁伴噺鐨勫鍔犱篃浼氫嬌榪欎釜闂鏇村姞涓ラ噸銆?/p>
姝ゅ錛屽彲浠ョ湅鍑?span lang="EN-US">Master鏄泦緹ょ殑鐡墮錛屽綋鍐欐搷浣滆繃澶氾紝浼氫弗閲嶅獎鍝嶅埌Master鐨勭ǔ瀹氭э紝濡傛灉Master鎸傛帀錛屾暣涓泦緹ら兘灝嗕笉鑳芥甯稿伐浣溿?/p>
鎵浠ワ紝1. 褰撹鍘嬪姏寰堝ぇ鐨勬椂鍊欙紝鍙互鑰冭檻娣誨姞Slave鏈哄櫒鐨勫垎寮忚В鍐籌紝浣嗘槸褰?span lang="EN-US">Slave鏈哄櫒杈懼埌涓瀹氱殑鏁伴噺灝卞緱鑰冭檻鍒嗗簱浜嗐?span lang="EN-US"> 2. 褰撳啓鍘嬪姏寰堝ぇ鐨勬椂鍊欙紝灝卞繀欏誨緱榪涜鍒嗗簱鎿嶄綔銆?/p>
鍙﹀錛屽彲鑳戒細鍥犱負縐嶇鍘熷洜錛岄泦緹や腑鐨勬暟鎹簱紜歡閰嶇疆絳変細涓嶄竴鏍鳳紝鏌愪簺鎬ц兘楂橈紝鏌愪簺鎬ц兘浣庯紝榪欎釜鏃跺欏彲浠ラ氳繃紼嬪簭鎺у埗姣忓彴鏈哄櫒璇誨啓鐨勬瘮閲嶏紝杈懼埌璐熻澆鍧囪 銆?/p>
澶囦喚鍦板潃錛?span style="font-family: Simsun; line-height: normal; font-size: medium; ">http://happyenjoylife.iteye.com/admin/blogs/1042538
1. 瀹夎mercurial
Mercurial鏄竴涓増鏈鐞嗗伐鍏楓?/span>
sudo apt-get install mercurial
瀹夎mercurial鐨勬墿灞曪紝娣誨姞fclone鍦ㄦ敮鎸?/span>
hg clone http://bitbucket.org/pmezard/hgforest-crew
灝嗕互涓嬪唴瀹規坊鍔犲埌$HOME/.hgrc鏂囦歡涓紝濡傛灉娌℃湁鍒欒嚜宸卞垱寤轟竴涓細
[extensions]
forest=/home/daren/hgforest-crew/forest.py
fetch=
2. 涓嬭澆jdk7婧愮爜
hg fclone http://hg.openjdk.java.net/jdk7/jdk7
3. 瀹夎gcc銆?/span>g++銆?/span>make絳?/span>
sudo apt-get install build-essential
4. 瀹夎XRender
sudo apt-get install libxrender-dev
sudo apt-get install xorg-dev
5. 瀹夎alsa
sudo apt-get install libasound2-dev
6. Cups
sudo apt-get install libcups2-dev
7. 瀹夎jdk6
8. 瀹夎ant
璁劇疆ANT_HOME
9. 瀹夎findbugs
緙栬瘧闇瑕佽繖鐜╂剰鍎挎湁鐐瑰鎬傞渶瑕佽緗?/span>FINDBUGS_HOME
10. 嫻嬭瘯緙栬瘧
export LANG=C ALT_BOOTDIR=/opt/jdk1.6.0_22/
#鍒犻櫎JAVA_HOME
export -n JAVA_HOME
export ALT_JDK_IMPORT_PATH=/opt/jdk1.6.0_22/
make sanity BUILD_JAXWS=false BUILD_JAXP =false
鍦?/span>build BUILD_JAXWS鍜?/span>BUILD_JAXP鎬繪槸鎻愮ず鎵句笉鍒版簮鏂囦歡錛岃屾垜鍙堟殏鏃跺鍙JDK銆?/span>Hotspot鎰熷叴瓚o紝鎵浠ョ儲鎬ф妸榪欎袱涓粰鍘繪帀銆?/span>
濡傛灉鍑虹幇:Sanity check passed.鍒欒〃紺烘祴璇曠紪璇戦氳繃浜嗭紝涓嶈繃涔熷埆寮蹇冨緱澶棭錛岀湡姝?/span>make鐨勬椂鍊欎笉淇濊瘉涓瀹氭病闂錛屼篃璁歌繕浼氱己灝戞煇浜涗緷璧栥?/span>
11. 緙栬瘧
export LANG=C ALT_BOOTDIR=/opt/jdk1.6.0_22/
#鍒犻櫎JAVA_HOME
export -n JAVA_HOME
export ALT_JDK_IMPORT_PATH=/opt/jdk1.6.0_22/
#make BUILD_JAXWS=false BUILD_JAXP=false
#make DEBUG_NAME=fastdebug BUILD_JAXWS=false BUILD_JAXP=false
make DEBUG_NAME=all_fastdebug BUILD_JAXWS=false BUILD_JAXP=false
濡傛灉涓鍒囨甯哥殑璇濆湪$HOME/jdk7/build/linux-i586/涓嬪氨鏈?/span>build鍑烘潵鐨?/span>jdk絳変簡銆?/span>