浣滆€咃細灏忓倕鍗氬锛歨ttps://bugstack.cn娌夋穩锛屽垎浜紝鎴愰暱锛岃鑷繁鍜屼粬浜烘湁鎵€鏀惰幏锛侌煒?.搴忚█鏄粈涔堬紵Java闈㈣瘯灏卞儚閫犵伀绠煔€绠€鍗曪紒浠ュ墠涓€鐩存兂濂藉ソ鐨凧ava闈㈣瘯銆傚搱鍝堬紝鎴戞€绘槸娴嬭瘯涓€浜涘伐浣滀腑鐢ㄤ笉鍒扮殑涓滆タ銆傛垜鍙互浣跨敤Spring銆丮yBatis銆丏ubbo銆丮Q鏉ュ疄鐜颁笟鍔¢渶姹傘€備絾鏄綋宸ヤ綔鍑犲勾闇€瑕佹彁鍗囪嚜宸憋紙鍔犻挶锛夌殑鏃跺€欙紝鎴戝紑濮嬭寰楄嚜宸卞彧鏄竴涓皟鐢ˋPI淇濆瓨鎺ュ彛鐨勫伐鍏蜂汉銆傛病鏈夌煡璇嗙殑骞垮害锛屾病鏈夋妧鏈殑娣卞害锛屾病鏈夋€濇兂锛屾病鏈夋剰璇嗭紝鎶婃棩甯稿紑鍙戠殑涓氬姟浠g爜涓殑澶т綋閫氱敤閫昏緫鎻愮偧鍑烘潵锛屽紑鍙戞垚閫氱敤缁勪欢锛屾洿鍒鐢ㄤ粈涔堟妧鏈潵瀹炵幇涓€浜涙棩甯哥敓娲讳腑浣跨敤鐨勫厓鍣ㄤ欢銆傛墍浠ユ湁鏃跺€欎綘璇撮潰璇曞ソ鍍忓湪閫犵伀绠紝杩欎簺鎶€鏈湪鏃ュ父鐢熸椿涓牴鏈敤涓嶅埌銆傚叾瀹炲緢澶氭椂鍊欎笉鏄洜涓烘病鏈夌敤鍒拌繖涓妧鏈紝鑰屾槸鍥犱负浣犳病鐢紙濂藉惂锛屾垜浠ュ墠娌$敤锛夈€傚綋浣犳湁浜嗚繖涓兂娉曪紝鎯宠绐佺牬钖祫鐡堕锛屼綘闇€瑕佷簡瑙e繀瑕佺殑鏁版嵁缁撴瀯锛屽涔燡ava鐨勭畻娉曢€昏緫锛岀啛鎮夐€氱敤鐨勮璁℃ā寮忥紝鐒跺悗缁撳悎Spring锛孫RM锛孯PC涔嬬被鐨勪笢瑗跨瓑銆備互婧愮爜瀹炵幇閫昏緫锛屽皢鐩稿簲鐨勬妧鏈柟妗堣祴鑳藉埌鎮ㄧ殑鏃ュ父涓氬姟鍙戝睍涓紝鏈夐拡瀵规€с€佺簿缁嗗寲鍦拌В鍐冲父瑙侀棶棰樸€傝繖浜涢兘鏄綘鑳藉姏鍦–RUD锛堝姞钖鐮侊級涔嬪鐨勪綋鐜般€傚浣曪紵鍚捣鏉ュソ鍍忓緢鏈夐亾鐞嗭紝閭f垜浠妇涓牀瀛愶紝鏉ヤ竴涓暟鎹簱璺敱鐨勯渶姹傚垎鏋愬拰閫昏緫瀹炵幇锛?銆侀渶姹傚垎鏋愬鏋滆鍋氫竴涓暟鎹簱璺敱锛岄渶瑕佸摢浜涙妧鏈偣锛熼鍏堟垜浠鐭ラ亾涓轰粈涔堣鍒嗗簱鍒嗚〃銆傚疄闄呬笂锛岀敱浜庝笟鍔¢噺澶э紝鏁版嵁澧為暱蹇紝闇€瑕佸皢鐢ㄦ埛鏁版嵁鎷嗗垎鍒颁笉鍚岀殑鏁版嵁搴撹〃涓紝浠ュ噺杞绘暟鎹簱鐨勫帇鍔涖€傚垎搴撳垎琛ㄦ搷浣滀富瑕佸寘鎷瀭鐩存媶鍒嗗拰姘村钩鎷嗗垎锛氬瀭鐩存媶鍒嗭細鎸囧皢琛ㄦ寜鐓т笟鍔¤繘琛屽垎绫伙紝鍒嗗竷鍒颁笉鍚岀殑鏁版嵁搴撲腑锛屼娇鏁版嵁鍘嬪姏鍦ㄤ笉鍚岀殑鏁版嵁搴撲箣闂村垎鎷呫€傚綊鏍圭粨搴曪紝涓€涓暟鎹簱鏄敱寰堝琛ㄧ粍鎴愮殑锛屾瘡涓〃瀵瑰簲涓嶅悓鐨勪笟鍔★紝涔熷氨鏄笓鐢ㄤ簬涓€涓笓闂ㄧ殑鏁版嵁搴撱€傛按骞虫媶鍒嗭細濡傛灉鍨傜洿鎷嗗垎鍚庨亣鍒板崟鏈虹摱棰堬紝鍙互浣跨敤姘村钩鎷嗗垎銆備笌鍨傜洿鎷嗗垎鐩告瘮锛屽尯鍒湪浜庯細鍨傜洿鎷嗗垎鏄皢涓嶅悓鐨勮〃鎷嗗垎鍒颁笉鍚岀殑鏁版嵁搴撲腑锛岃€屾按骞虫媶鍒嗘槸灏嗗悓涓€涓〃鎷嗗垎鍒颁笉鍚岀殑鏁版嵁搴撲腑銆傚锛歶ser_001銆乽ser_002浠ュ強鏈珷鎴戜滑瑕佸疄鐜扮殑涔熸槸姘村钩鎷嗗垎鐨勮矾鐢辫璁★紝濡傚浘1-1鎵€绀恒€傞偅涔堬紝杩欐牱鐨勬暟鎹簱璺敱璁捐搴旇鍖呭惈鍝簺鎶€鏈煡璇嗙偣鍛紵璇寸殑鏄疉OP鍒囬潰鎷︽埅鐨勪娇鐢紝鍥犱负闇€瑕佹爣璁颁娇鐢ㄦ暟鎹簱璺敱鐨勬柟娉曪紝鏂逛究鍒嗗簱鍒嗚〃閫昏緫鐨勫鐞嗐€傛暟鎹簮鍒囨崲鎿嶄綔锛岀敱浜庢湁鍒嗗簱锛屼細娑夊強澶氫釜鏁版嵁婧愪箣闂寸殑閾炬帴鍒囨崲锛屼互渚垮皢鏁版嵁鍒嗛厤鍒颁笉鍚岀殑鏁版嵁搴撱€傛暟鎹簱琛ㄥ鍧€鎿嶄綔锛屼竴鏉℃暟鎹垎閰嶅埌鍝釜鏁版嵁搴擄紝鍝釜琛紝闇€瑕佽繘琛岀储寮曡绠椼€傚湪鏂规硶璋冪敤鐨勮繃绋嬩腑锛屾渶缁堣ThreadLocal璁板綍涓嬫潵銆備负浜嗚鏁版嵁鍧囧寑鍒嗗竷鍒颁笉鍚岀殑鏁版嵁搴撹〃涓紝杩橀渶瑕佽€冭檻濡備綍杩涜鏁版嵁鍝堝笇鎿嶄綔銆傛暟鎹簱鍒嗚〃鍚庯紝璁╂暟鎹泦涓湪鏌愪釜鏁版嵁搴撶殑鏌愪釜琛ㄤ腑锛岃繖鏍锋暟鎹氨浼氫涪澶便€傚垎搴撳垎琛ㄧ殑鎰忎箟銆傜患涓婃墍杩帮紝鍙互鐪嬪嚭锛屾暟鎹瓨鍌ㄦ槸鍦ㄦ暟鎹簱鍜岃〃鐨勬暟鎹粨鏋勪笅瀹屾垚鐨勩€傛垜闇€瑕佺敤鍒扮殑鎶€鏈寘鎷細AOP銆佹暟鎹簮鍒囨崲銆乭ash绠楁硶銆乭ash瀵诲潃銆乀hreadLocal浠ュ強SpringBoot鐨凷tarter寮€鍙戞柟寮忕瓑鎶€鏈€傝嚦浜庢暎鍒椼€佸鍧€銆佹暟鎹瓨鍌紝鍏跺疄杩欑被鎶€鏈拰HashMap鏈夊お澶氱浉浼间箣澶勶紝鎵€浠ュ涔犳簮鐮佸悗閫犵伀绠殑鏈轰細鏉ヤ簡銆傚鏋滀綘瀵笻ashMap婧愮爜鍜孲pring婧愮爜鏈夋繁鍏ョ殑鍒嗘瀽鍜岀爺绌讹紝涓棿浠跺紑鍙戯紝閭d箞鍦ㄨ璁¤繖鏍蜂竴涓暟鎹簱璺敱缁勪欢鐨勬椂鍊欙紝涓€瀹氭湁寰堝鎬濊矾銆傛帴涓嬫潵锛岃鎴戜滑涓€璧峰皾璇曚粠婧愮爜瀛︿範閫犵伀绠惂锛?銆佹妧鏈爺绌跺湪JDK婧愮爜涓紝鍖呭惈鐨勬暟鎹粨鏋勮璁℃湁锛氭暟缁勩€侀摼琛ㄣ€侀槦鍒椼€佹爤銆佺孩榛戞爲銆傚叿浣撳疄鐜版湁ArrayList銆丩inkedList銆丵ueue銆丼tack锛岃繖浜涘湪鏁版嵁瀛樺偍涓槸渚濇瀛樺偍鐨勩€傚畠涓嶇敱鍝堝笇绱㈠紩澶勭悊銆侶ashMap鍜孴hreadLocal杩欎袱涓嚱鏁板湪鏁版嵁鎵╁睍鐨勬椂鍊欎細鐢ㄥ埌hash绱㈠紩銆乭ash绠楁硶銆佹媺閾惧鍧€鍜屽紑鏀惧鍧€锛屾墍浠ユ垜浠鍒嗘瀽瀛︿範鐨勪篃灏嗛泦涓湪杩欎袱涓嚱鏁颁笂銆?.ThreadLocal@Testpublicvoidtest_idx(){inthashCode=0;瀵逛簬(inti=0;i<16;i++){hashCode=i*0x61c88647+0x61c88647;intidx=hashCode&15;System.out.println("Fibonaccihash:"+idx+"Normalhash:"+(String.valueOf(i).hashCode()&15));鏂愭尝閭e鍝堝笇锛?鏅€氬搱甯岋細0鏂愭尝閭e鍝堝笇锛?4鏅€氬搱甯岋細1鏂愭尝閭e鍝堝笇锛?鏅€氬搱甯岋細2鏂愭尝閭e鍝堝笇锛?2鏅€氬搱甯岋細3鏂愭尝閭e鍝堝笇锛?鏅€氬搱甯岋細4鏂愭尝閭e鍝堝笇锛?0鏅€氬搱甯岋細5鏂愭尝閭e鍝堝笇锛?鏅€氬搱甯岋細6鏂愭尝閭e鍝堝笇锛?鏅€氬搱甯岋細7鏂愭尝閭e鍝堝笇锛?5鏅€氬搱甯岋細8鏂愭尝閭e鍝堝笇锛?鏅€氬搱甯岋細9鏂愭尝閭e鍝堝笇锛?3鏅€氬搱甯岋細15鏂愭尝閭e鍝堝笇锛?鏅€氬搱甯岋細0鏂愭尝閭e鍝堝笇锛?1鏅€氬搱甯岋細1鏂愭尝閭e鍝堝笇锛?鏅€氬搱甯岋細2鏂愭尝閭e鍝堝笇锛?鏅€氬搱甯岋細3鏂愭尝閭e鍝堝笇锛?鏅€氬搱甯岋細4鏁版嵁缁撴瀯锛氬搱甯岃〃鏁扮粍缁撴瀯鍝堝笇绠楁硶锛氭枑娉㈤偅濂戯紙Fibonacci锛夊搱甯屾硶瀵诲潃鏂规硶锛氭枑娉㈤偅濂戝搱甯屾柟娉曞彲浠ヤ娇鏁版嵁鏇村姞鍒嗘暎锛屽湪鏁版嵁鍙戠敓鍐茬獊鏃跺紑鏀惧鍧€锛屼粠鍐茬獊鑺傜偣鍚戝悗鏌ユ壘瀛樺偍鍏冪礌鐨勪綅缃€傚叕寮忥細f(k)=((k*2654435769)>>X)<>28銆侀粍閲戝垎鍓茬偣锛?鈭?-1)/2=0.61803398871.618:1==1:0.618瀛︿粈涔堬細鍙互鍙傝€冨鍧€鏂瑰紡鍜屽搱甯岀畻娉曪紝浣嗘槸杩欎釜鏁版嵁缁撴瀯鍜屾暟鎹簱涓婅璁捐瀹炵幇鐨勭粨鏋勬湁寰堝ぇ鐨勪笉鍚屻€備絾鏄疶hreadLocal鍙互鐢ㄦ潵瀛樺偍鍜屼紶閫掓暟鎹储寮曚俊鎭€?.HashMapppublicstaticintdisturbHashIdx(Stringkey,intsize){return(size-1)&(key.hashCode()^(key.hashCode()>>>16));}鏁版嵁缁撴瀯锛歨ashbucket鏁扮粍+Linked鍒楄〃+绾㈤粦鏍戝搱甯岀畻娉曪細鎵板姩鍑芥暟锛屽搱甯岀储寮曪紝鍒嗗竷寮忓鍧€鏂瑰紡锛屽彲浠ヨ鏁版嵁鏇村姞鍙搱甯岋細閫氳繃鎷夐摼瀵诲潃瑙e喅鏁版嵁鍐茬獊锛屽瓨鍌ㄦ暟鎹椂浼氫娇鐢ㄧ储寮曞湴鍧€锛屼細鍙戠敓鍐茬獊鏁版嵁閾捐〃褰撴煇涓閲忚秴杩?涓厓绱犳椂锛屽彲浠ユ墿灞曟垨鏍戝舰銆傚鍒扮殑涓滆タ锛氬搱甯岀畻娉曞拰瀵诲潃鏂规硶鍙互搴旂敤鍒版暟鎹簱璺敱鐨勮璁″拰瀹炵幇涓紝鏁存暟缁?閾捐〃鐨勬柟娉曞叾瀹炵被浼间簬搴?琛ㄧ殑鏂规硶銆傚洓銆佽璁″疄鐜?銆佸畾涔夎矾鐢辨敞瑙e畾涔堾Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE,ElementType.METHOD})public@interfaceDBRouter{Stringkey()default"";}浣跨敤@MapperpublicinterfaceIUserDao{@DBRouter(key="userId")UserqueryUserInfoByUserId(Userreq);@DBRouter(key="userId")voidinsertUser(Userreq);}棣栧厛锛屾垜浠渶瑕佸湪璺敱鏂规硶涓婅嚜瀹氫箟涓€涓敞瑙g敤浜庢斁缃湪鏁版嵁搴撲腑銆傚畠鐨勪娇鐢ㄦ柟娉曟槸閫氳繃鏂规硶閰嶇疆娉ㄨВ锛屽彲浠ヨ鎴戜滑鎸囧畾鐨凙OP鍒囬潰杩涜鎷︽埅锛屾嫤鎴悗杩涜鐩稿簲鐨勬暟鎹簱璺敱璁$畻鍜屽垽鏂紝鍒囨崲鐩稿簲鐨勬搷浣滄暟鎹簮銆?.瑙f瀽璺敱閰嶇疆浠ヤ笂鏄垜浠疄鐜版暟鎹簱璺敱缁勪欢鍚庣殑鏁版嵁婧愰厤缃€傚湪鍒嗗簱鍒嗚〃涓嬬殑鏁版嵁婧愪娇鐢ㄤ腑锛岄渶瑕佹敮鎸佸鏁版嵁婧愮殑淇℃伅閰嶇疆锛屼互婊¤冻涓嶅悓闇€姹傜殑鎵╁睍銆傚浜庤繖绉嶅ぇ鐨勮嚜瀹氫箟淇℃伅閰嶇疆锛岄渶瑕佷娇鐢╫rg.springframework.context.EnvironmentAware鎺ュ彛鑾峰彇閰嶇疆鏂囦欢锛屾彁鍙栭渶瑕佺殑閰嶇疆淇℃伅銆傛暟鎹簮閰嶇疆鎻愬彇@OverridepublicvoidsetEnvironment(Environmentenvironment){Stringprefix="router.jdbc.datasource.";dbCount=Integer.valueOf(environment.getProperty(prefix+"dbCount"));tbCount=Integer.valueOf(environment.getProperty(prefix+"tbCount"));StringdataSources=environment.getProperty(prefix+"list");for(StringdbInfo:dataSources.split(",")){MapdataSourceProps=PropertyUtil.鍙ユ焺锛堢幆澧冿紝鍓嶇紑+dbInfo锛孧ap.class锛夛紱dataSourceMap.put(dbInfo,dataSourceProps);}}prefix鏄暟鎹簮閰嶇疆鐨勮捣濮嬩俊鎭紝鍙互鑷畾涔変綘闇€瑕佺殑璧峰鍐呭銆俤bCount銆乼bCount銆乨ataSources銆乨ataSourceProps閮藉皢閰嶇疆淇℃伅鎻愬彇鍑烘潵锛屽瓨鍌ㄥ湪dataSourceMap涓紝浠ヤ緵鍚庣画浣跨敤銆?銆佹暟鎹簮鍒囨崲鍦ㄩ厤鍚圫pringBoot寮€鍙戠殑Starter涓紝闇€瑕佹彁渚涗竴涓狣ataSource鐨勫疄渚嬪寲瀵硅薄锛岄偅涔堟垜浠妸杩欎釜瀵硅薄鏀惧湪DataSourceAutoConfig涓疄鐜帮紝杩欓噷鎻愪緵鐨勬暟鎹簮鏄彲浠ュ姩鎬佹敼鍙樼殑锛屽嵆鏀寔鍔ㄦ€佸垏鎹㈡暟鎹簮銆傚垱寤烘暟鎹簮@BeanpublicDataSourcedataSource(){//鍒涘缓鏁版嵁婧怣ap