锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鎴戜滑鐭ラ亾Spring閫氳繃鍚勭DAO妯℃澘綾婚檷浣庝簡寮鍙戣呬嬌鐢ㄥ悇縐嶆暟鎹寔涔呮妧鏈殑闅懼害銆傝繖浜涙ā鏉跨被閮芥槸綰跨▼瀹夊叏鐨勶紝涔熷氨鏄錛屽涓狣AO鍙互澶嶇敤鍚屼竴涓ā鏉垮疄渚嬭屼笉浼?xì)鍙戠敓鍐步H併?/p>
鎴戜滑浣跨敤妯℃澘綾昏闂簳灞傛暟鎹紝鏍規(guī)嵁鎸佷箙鍖栨妧鏈殑涓嶅悓錛屾ā鏉跨被闇瑕佺粦瀹氭暟鎹繛鎺ユ垨浼?xì)璇濈殑璧勬簮銆備絾榪欎簺璧勬簮鏈韓鏄潪綰跨▼瀹夊叏鐨勶紝涔熷氨鏄瀹冧滑涓嶈兘鍦ㄥ悓涓鏃跺埢琚涓嚎紼嬪叡浜?/p>
铏界劧妯℃澘綾婚氳繃璧勬簮姹犺幏鍙栨暟鎹繛鎺ユ垨浼?xì)璇濆Q屼絾璧勬簮姹犳湰韜В鍐崇殑鏄暟鎹繛鎺ユ垨浼?xì)璇濈殑缂撳瓨闂锛岒q墮潪鏁版嵁榪炴帴鎴栦細(xì)璇濈殑綰跨▼瀹夊叏闂銆?/p>
鎸夌収浼犵粺緇忛獙錛屽鏋滄煇涓璞℃槸闈炵嚎紼嬪畨鍏ㄧ殑錛屽湪澶氱嚎紼嬬幆澧冧笅錛屽瀵硅薄鐨勮闂繀欏婚噰鐢╯ynchronized榪涜綰跨▼鍚屾銆備絾Spring鐨凞AO妯℃澘綾誨茍鏈噰鐢ㄧ嚎紼嬪悓姝ユ満鍒訛紝鍥犱負(fù)綰跨▼鍚屾闄愬埗浜嗗茍鍙戣闂紝浼?xì)甯︽潵寰堝ぇ鐨勬ц兘鎹熷け銆?/p>
姝ゅ錛岄氳繃浠g爜鍚屾瑙e喅鎬ц兘瀹夊叏闂鎸戞垬鎬у緢澶э紝鍙兘浼?xì)澧炲己濂藉嚑鍊嶇殑瀹炵幇闅懼害銆傞偅妯℃澘綾葷┒绔熶話涓堜綍縐嶉瓟娉曠鍔燂紝鍙互鍦ㄦ棤闇鍚屾鐨勬儏鍐典笅灝卞寲瑙g嚎紼嬪畨鍏ㄧ殑闅鵑鍛紵絳旀灝辨槸ThreadLocal錛?/p>
ThreadLocal鍦⊿pring涓彂鎸ョ潃閲嶈鐨勪綔鐢紝鍦ㄧ鐞唕equest浣滅敤鍩熺殑Bean銆佷簨鍔$鐞嗐佷換鍔¤皟搴︺丄OP絳夋ā鍧楅兘鍑虹幇浜嗗畠浠殑韜獎錛岃搗鐫涓捐凍杞婚噸鐨勪綔鐢ㄣ傝鎯充簡瑙pring浜嬪姟綆$悊鐨勫簳灞傛妧鏈紝ThreadLocal鏄繀欏繪敾鍏嬬殑灞卞ご鍫″瀿銆?/p>
ThreadLocal鏄粈涔?/strong>
鏃╁湪JDK 1.2鐨勭増鏈腑灝辨彁渚沯ava.lang.ThreadLocal錛孴hreadLocal涓鴻В鍐沖綰跨▼紼嬪簭鐨勫茍鍙戦棶棰樻彁渚涗簡涓縐嶆柊鐨勬濊礬銆備嬌鐢ㄨ繖涓伐鍏風(fēng)被鍙互寰堢畝媧佸湴緙栧啓鍑轟紭緹庣殑澶氱嚎紼嬬▼搴忋?/p>
ThreadLocal寰堝鏄撹浜烘湜鏂囩敓涔夛紝鎯沖綋鐒跺湴璁や負(fù)鏄竴涓?#8220;鏈湴綰跨▼”銆傚叾瀹烇紝ThreadLocal騫朵笉鏄竴涓猅hread錛岃屾槸Thread鐨勫眬閮ㄥ彉閲忥紝涔熻鎶婂畠鍛藉悕涓篢hreadLocalVariable鏇村鏄撹浜虹悊瑙d竴浜涖?/p>
褰撲嬌鐢═hreadLocal緇存姢鍙橀噺鏃訛紝ThreadLocal涓烘瘡涓嬌鐢ㄨ鍙橀噺鐨勭嚎紼嬫彁渚涚嫭绔嬬殑鍙橀噺鍓湰錛屾墍浠ユ瘡涓涓嚎紼嬮兘鍙互鐙珛鍦版敼鍙樿嚜宸辯殑鍓湰錛岃屼笉浼?xì)濯勫搷鍏跺畠绾拷E嬫墍瀵瑰簲鐨勫壇鏈?/p>
浠庣嚎紼嬬殑瑙掑害鐪嬶紝鐩爣鍙橀噺灝辮薄鏄嚎紼嬬殑鏈湴鍙橀噺錛岃繖涔熸槸綾誨悕涓?#8220;Local”鎵瑕佽〃杈劇殑鎰忔濄?/p>
綰跨▼灞閮ㄥ彉閲忓茍涓嶆槸Java鐨勬柊鍙戞槑錛屽緢澶氳璦錛堝IBM IBM XL FORTRAN錛夊湪璇硶灞傞潰灝辨彁渚涚嚎紼嬪眬閮ㄥ彉閲忋傚湪Java涓病鏈夋彁渚涘湪璇█綰ф敮鎸侊紝鑰屾槸鍙樼浉鍦伴氳繃ThreadLocal鐨勭被鎻愪緵鏀寔銆?/p>
鎵浠ワ紝鍦↗ava涓紪鍐欑嚎紼嬪眬閮ㄥ彉閲忕殑浠g爜鐩稿鏉ヨ瑕佺鎷欎竴浜涳紝鍥犳閫犳垚綰跨▼灞閮ㄥ彉閲忔病鏈夊湪Java寮鍙戣呬腑寰楀埌寰堝ソ鐨勬櫘鍙?qiáng)銆?/p>
ThreadLocal鐨勬帴鍙f柟娉?/p>
ThreadLocal綾繪帴鍙e緢綆鍗曪紝鍙湁4涓柟娉曪紝鎴戜滑鍏堟潵浜嗚В涓涓嬶細(xì)
璁劇疆褰撳墠綰跨▼鐨勭嚎紼嬪眬閮ㄥ彉閲忕殑鍊箋?/p>
璇ユ柟娉曡繑鍥炲綋鍓嶇嚎紼嬫墍瀵瑰簲鐨勭嚎紼嬪眬閮ㄥ彉閲忋?/p>
灝嗗綋鍓嶇嚎紼嬪眬閮ㄥ彉閲忕殑鍊煎垹闄わ紝鐩殑鏄負(fù)浜嗗噺灝戝唴瀛樼殑鍗犵敤錛岃鏂規(guī)硶鏄疛DK 5.0鏂板鐨勬柟娉曘傞渶瑕佹寚鍑虹殑鏄紝褰撶嚎紼嬬粨鏉熷悗錛屽搴旇綰跨▼鐨勫眬閮ㄥ彉閲忓皢鑷姩琚瀮鍦懼洖鏀訛紝鎵浠ユ樉寮忚皟鐢ㄨ鏂規(guī)硶娓呴櫎綰跨▼鐨勫眬閮ㄥ彉閲忓茍涓嶆槸蹇呴』鐨勬搷浣滐紝浣嗗畠鍙互鍔犲揩鍐呭瓨鍥炴敹鐨勯熷害銆?/p>
榪斿洖璇ョ嚎紼嬪眬閮ㄥ彉閲忕殑鍒濆鍊鹼紝璇ユ柟娉曟槸涓涓猵rotected鐨勬柟娉曪紝鏄劇劧鏄負(fù)浜嗚瀛愮被瑕嗙洊鑰岃璁$殑銆傝繖涓柟娉曟槸涓涓歡榪熻皟鐢ㄦ柟娉曪紝鍦ㄧ嚎紼嬬1嬈¤皟鐢╣et()鎴杝et(Object)鏃舵墠鎵ц錛屽茍涓斾粎鎵ц1嬈°俆hreadLocal涓殑緙虹渷瀹炵幇鐩存帴榪斿洖涓涓猲ull銆?/p>
鍊煎緱涓鎻愮殑鏄紝鍦↗DK5.0涓紝ThreadLocal宸茬粡鏀寔娉涘瀷錛岃綾葷殑綾誨悕宸茬粡鍙樹負(fù)ThreadLocal<T>銆侫PI鏂規(guī)硶 涔熺浉搴旇繘琛屼簡璋冩暣錛屾柊鐗堟湰鐨凙PI鏂規(guī)硶鍒嗗埆鏄痸oid set(T value)銆乀 get()浠ュ強(qiáng)T initialValue()銆?/p>
ThreadLocal鏄浣曞仛鍒頒負(fù)姣忎竴涓嚎紼嬬淮鎶ゅ彉閲忕殑鍓湰鐨勫憿錛熷叾瀹炲疄鐜扮殑鎬濊礬寰堢畝鍗曪細(xì)鍦═hreadLocal綾諱腑鏈変竴涓狹ap錛岀敤浜庡瓨鍌ㄦ瘡涓涓嚎紼嬬殑鍙橀噺鍓湰錛孧ap涓厓绱犵殑閿負(fù)綰跨▼瀵硅薄錛岃屽煎搴旂嚎紼嬬殑鍙橀噺鍓湰銆傛垜浠嚜宸卞氨鍙互鎻愪緵涓涓畝鍗曠殑瀹炵幇鐗堟湰錛?/p>
浠g爜娓呭崟1 SimpleThreadLocal
public class SimpleThreadLocal {
private Map valueMap = Collections.synchronizedMap(new HashMap());
public void set(Object newValue) {
valueMap.put(Thread.currentThread(), newValue);鈶犻敭涓虹嚎紼嬪璞★紝鍊間負(fù)鏈嚎紼嬬殑鍙橀噺鍓湰
}
public Object get() {
Thread currentThread = Thread.currentThread();
Object o = valueMap.get(currentThread);鈶¤繑鍥炴湰綰跨▼瀵瑰簲鐨勫彉閲?/strong>
if (o == null && !valueMap.containsKey(currentThread)) {鈶㈠鏋滃湪Map涓笉瀛樺湪錛屾斁鍒癕ap
涓繚瀛樿搗鏉ャ?/strong>
o = initialValue();
valueMap.put(currentThread, o);
}
return o;
}
public void remove() {
valueMap.remove(Thread.currentThread());
}
public Object initialValue() {
return null;
}
}
铏界劧浠g爜娓呭崟9鈥?榪欎釜ThreadLocal瀹炵幇鐗堟湰鏄懼緱姣旇緝騫肩錛屼絾瀹冨拰JDK鎵鎻愪緵鐨凾hreadLocal綾誨湪瀹炵幇鎬濊礬涓婃槸鐩歌繎鐨勩?/p>
涓涓猅headLocal瀹炰緥
涓嬮潰錛屾垜浠氳繃涓涓叿浣撶殑瀹炰緥浜嗚В涓涓婽hreadLocal鐨勫叿浣撲嬌鐢ㄦ柟娉曘?/p>
浠g爜娓呭崟2 SequenceNumber
package com.baobaotao.basic;
public class SequenceNumber {
鈶?/strong>閫氳繃鍖垮悕鍐呴儴綾昏鐩?/strong>ThreadLocal鐨?/strong>initialValue()鏂規(guī)硶錛屾寚瀹氬垵濮嬪?/strong>
private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>(){
public Integer initialValue(){
return 0;
}
};
鈶?/strong>鑾峰彇涓嬩竴涓簭鍒楀?/strong>
public int getNextNum(){
seqNum.set(seqNum.get()+1);
return seqNum.get();
}
public static void main(String[] args)
{
SequenceNumber sn = new SequenceNumber();
鈶?/strong> 3涓嚎紼嬪叡浜?/strong>sn錛屽悇鑷駭鐢熷簭鍒楀彿
TestClient t1 = new TestClient(sn);
TestClient t2 = new TestClient(sn);
TestClient t3 = new TestClient(sn);
t1.start();
t2.start();
t3.start();
}
private static class TestClient extends Thread
{
private SequenceNumber sn;
public TestClient(SequenceNumber sn) {
this.sn = sn;
}
public void run()
{
for (int i = 0; i < 3; i++) {鈶f瘡涓嚎紼嬫墦鍑?/strong>3涓簭鍒楀?/strong>
System.out.println("thread["+Thread.currentThread().getName()+
"] sn["+sn.getNextNum()+"]");
}
}
}
}
閫氬父鎴戜滑閫氳繃鍖垮悕鍐呴儴綾葷殑鏂瑰紡瀹氫箟ThreadLocal鐨勫瓙綾伙紝鎻愪緵鍒濆鐨勫彉閲忓鹼紝濡備緥瀛愪腑鈶犲鎵紺恒俆estClient綰跨▼浜х敓涓緇勫簭鍒楀彿錛? 鍦ㄢ憿澶勶紝鎴戜滑鐢熸垚3涓猅estClient錛屽畠浠叡浜悓涓涓猄equenceNumber瀹炰緥銆傝繍琛屼互涓婁唬鐮侊紝鍦ㄦ帶鍒跺彴涓婅緭鍑轟互涓嬬殑緇撴灉錛?/p>
thread[Thread-2] sn[1]
thread[Thread-0] sn[1]
thread[Thread-1] sn[1]
thread[Thread-2] sn[2]
thread[Thread-0] sn[2]
thread[Thread-1] sn[2]
thread[Thread-2] sn[3]
thread[Thread-0] sn[3]
thread[Thread-1] sn[3]
鑰冨療杈撳嚭鐨勭粨鏋滀俊鎭紝鎴戜滑鍙戠幇姣忎釜綰跨▼鎵浜х敓鐨勫簭鍙瘋櫧鐒墮兘鍏變韓鍚屼竴涓猄equenceNumber瀹炰緥錛屼絾瀹冧滑騫舵病鏈夊彂鐢熺浉浜掑共鎵扮殑鎯呭喌錛岃屾槸鍚勮嚜浜х敓鐙珛鐨勫簭鍒楀彿錛岃繖鏄洜涓烘垜浠氳繃ThreadLocal涓烘瘡涓涓嚎紼嬫彁渚涗簡鍗曠嫭鐨勫壇鏈?/p>
Thread鍚屾鏈哄埗鐨勬瘮杈?/p>
ThreadLocal鍜岀嚎紼嬪悓姝ユ満鍒剁浉姣旀湁浠涔堜紭鍔垮憿錛烼hreadLocal鍜岀嚎紼嬪悓姝ユ満鍒墮兘鏄負(fù)浜嗚В鍐沖綰跨▼涓浉鍚屽彉閲忕殑璁塊棶鍐茬獊闂銆?/p>
鍦ㄥ悓姝ユ満鍒朵腑錛岄氳繃瀵硅薄鐨勯攣鏈哄埗淇濊瘉鍚屼竴鏃墮棿鍙湁涓涓嚎紼嬭闂彉閲忋傝繖鏃惰鍙橀噺鏄涓嚎紼嬪叡浜殑錛屼嬌鐢ㄥ悓姝ユ満鍒惰姹傜▼搴忔厧瀵嗗湴鍒嗘瀽浠涔堟椂鍊欏鍙橀噺榪涜璇誨啓錛屼粈涔堟椂鍊欓渶瑕侀攣瀹氭煇涓璞★紝浠涔堟椂鍊欓噴鏀懼璞¢攣絳夌箒鏉傜殑闂錛岀▼搴忚璁″拰緙栧啓闅懼害鐩稿杈冨ぇ銆?/p>
鑰孴hreadLocal鍒欎粠鍙︿竴涓搴︽潵瑙e喅澶氱嚎紼嬬殑騫跺彂璁塊棶銆俆hreadLocal浼?xì)湄?fù)姣忎竴涓嚎紼嬫彁渚涗竴涓嫭绔嬬殑鍙橀噺鍓湰錛屼粠鑰岄殧紱諱簡澶氫釜綰? 紼嬪鏁版嵁鐨勮闂啿紿併傚洜涓烘瘡涓涓嚎紼嬮兘鎷ユ湁鑷繁鐨勫彉閲忓壇鏈紝浠庤屼篃灝辨病鏈夊繀瑕佸璇ュ彉閲忚繘琛屽悓姝ヤ簡銆俆hreadLocal鎻愪緵浜嗙嚎紼嬪畨鍏ㄧ殑鍏變韓瀵硅薄錛屽湪緙? 鍐欏綰跨▼浠g爜鏃訛紝鍙互鎶婁笉瀹夊叏鐨勫彉閲忓皝瑁呰繘ThreadLocal銆?/p>
鐢變簬ThreadLocal涓彲浠ユ寔鏈変換浣曠被鍨嬬殑瀵硅薄錛屼綆鐗堟湰JDK鎵鎻愪緵鐨刧et()榪斿洖鐨勬槸Object瀵硅薄錛岄渶瑕佸己鍒剁被鍨嬭漿鎹€備絾JDK 5.0閫氳繃娉涘瀷寰堝ソ鐨勮В鍐充簡榪欎釜闂錛屽湪涓瀹氱▼搴﹀湴綆鍖朤hreadLocal鐨勪嬌鐢紝浠g爜娓呭崟 9 2灝變嬌鐢ㄤ簡JDK 5.0鏂扮殑ThreadLocal<T>鐗堟湰銆?/p>
姒傛嫭璧鋒潵璇達(dá)紝瀵逛簬澶氱嚎紼嬭祫婧愬叡浜殑闂錛屽悓姝ユ満鍒墮噰鐢ㄤ簡“浠ユ椂闂存崲絀洪棿”鐨勬柟寮忥紝鑰孴hreadLocal閲囩敤浜?#8220;浠ョ┖闂存崲鏃墮棿”鐨勬柟寮忋傚墠鑰呬粎鎻愪緵涓浠藉彉閲忥紝璁╀笉鍚岀殑綰跨▼鎺掗槦璁塊棶錛岃屽悗鑰呬負(fù)姣忎竴涓嚎紼嬮兘鎻愪緵浜嗕竴浠藉彉閲忥紝鍥犳鍙互鍚屾椂璁塊棶鑰屼簰涓嶅獎鍝嶃?/p>
Spring浣跨敤ThreadLocal瑙e喅綰跨▼瀹夊叏闂
鎴戜滑鐭ラ亾鍦ㄤ竴鑸儏鍐典笅錛屽彧鏈夋棤鐘舵佺殑Bean鎵嶅彲浠ュ湪澶氱嚎紼嬬幆澧冧笅鍏變韓錛屽湪Spring涓紝緇濆ぇ閮ㄥ垎Bean閮藉彲浠ュ0鏄庝負(fù)singleton浣滅敤 鍩熴傚氨鏄洜涓篠pring瀵逛竴浜汢ean錛堝RequestContextHolder銆? TransactionSynchronizationManager銆丩ocaleContextHolder絳夛級涓潪綰跨▼瀹夊叏鐘舵侀噰鐢? ThreadLocal榪涜澶勭悊錛岃瀹冧滑涔熸垚涓虹嚎紼嬪畨鍏ㄧ殑鐘舵侊紝鍥犱負(fù)鏈夌姸鎬佺殑Bean灝卞彲浠ュ湪澶氱嚎紼嬩腑鍏變韓浜嗐?/p>
涓鑸殑Web搴旂敤鍒掑垎涓哄睍鐜板眰銆佹湇鍔″眰鍜屾寔涔呭眰涓変釜灞傛錛屽湪涓嶅悓鐨勫眰涓紪鍐欏搴旂殑閫昏緫錛屼笅灞傞氳繃鎺ュ彛鍚戜笂灞傚紑鏀懼姛鑳借皟鐢ㄣ傚湪涓鑸儏鍐典笅錛屼粠鎺ユ敹璇鋒眰鍒拌繑鍥炲搷搴旀墍緇忚繃鐨勬墍鏈夌▼搴忚皟鐢ㄩ兘鍚屽睘浜庝竴涓嚎紼嬶紝濡傚浘9鈥?鎵紺猴細(xì)
鍥?/a>1鍚屼竴綰跨▼璐氫笁灞?/p>
榪欐牱浣犲氨鍙互鏍規(guī)嵁闇瑕侊紝灝嗕竴浜涢潪綰跨▼瀹夊叏鐨勫彉閲忎互ThreadLocal瀛樻斁錛屽湪鍚屼竴嬈¤姹傚搷搴旂殑璋冪敤綰跨▼涓紝鎵鏈夊叧鑱旂殑瀵硅薄寮曠敤鍒扮殑閮芥槸鍚屼竴涓彉閲忋?/p>
涓嬮潰鐨勫疄渚嬭兘澶熶綋鐜癝pring瀵規(guī)湁鐘舵丅ean鐨勬敼閫犳濊礬錛?/p>
浠g爜娓呭崟3 TopicDao錛氶潪綰跨▼瀹夊叏 public class TopicDao { private Connection conn;鈶?/strong>涓涓潪綰跨▼瀹夊叏鐨勫彉閲?/strong> public void addTopic(){ Statement stat = conn.createStatement();鈶?/strong>寮曠敤闈炵嚎紼嬪畨鍏ㄥ彉閲?/strong> … } } 鐢變簬鈶犲鐨刢onn鏄垚鍛樺彉閲忥紝鍥犱負(fù)addTopic()鏂規(guī)硶鏄潪綰跨▼瀹夊叏鐨勶紝蹇呴』鍦ㄤ嬌鐢ㄦ椂鍒涘緩涓涓柊TopicDao瀹炰緥錛堥潪singleton錛夈備笅闈嬌鐢═hreadLocal瀵筩onn榪欎釜闈炵嚎紼嬪畨鍏ㄧ殑“鐘舵?#8221;榪涜鏀歸狅細(xì) 浠g爜娓呭崟4 TopicDao錛氱嚎紼嬪畨鍏?/p>
import java.sql.Connection; import java.sql.Statement; public class TopicDao { 鈶犱嬌鐢═hreadLocal淇濆瓨Connection鍙橀噺 private static ThreadLocal<Connection> connThreadLocal = new ThreadLocal<Connection>(); public static Connection getConnection(){ 鈶″鏋渃onnThreadLocal娌℃湁鏈嚎紼嬪搴旂殑Connection鍒涘緩涓涓柊鐨凜onnection錛?/strong> 騫跺皢鍏朵繚瀛樺埌綰跨▼鏈湴鍙橀噺涓?/strong> if (connThreadLocal.get() == null) { Connection conn = ConnectionManager.getConnection(); connThreadLocal.set(conn); return conn; }else{ return connThreadLocal.get();鈶㈢洿鎺ヨ繑鍥炵嚎紼嬫湰鍦板彉閲?/strong> } } public void addTopic() { 鈶d粠ThreadLocal涓幏鍙栫嚎紼嬪搴旂殑Connection Statement stat = getConnection().createStatement(); } } 涓嶅悓鐨勭嚎紼嬪湪浣跨敤TopicDao鏃訛紝鍏堝垽鏂璫onnThreadLocal.get()鏄惁鏄痭ull錛屽鏋滄槸null錛屽垯璇存槑褰撳墠綰跨▼榪樻病鏈夊
搴旂殑Connection瀵硅薄錛岃繖鏃跺垱寤轟竴涓狢onnection瀵硅薄騫舵坊鍔犲埌鏈湴綰跨▼鍙橀噺涓紱濡傛灉涓嶄負(fù)null錛屽垯璇存槑褰撳墠鐨勭嚎紼嬪凡緇忔嫢鏈変簡
Connection瀵硅薄錛岀洿鎺ヤ嬌鐢ㄥ氨鍙互浜嗐傝繖鏍鳳紝灝變繚璇佷簡涓嶅悓鐨勭嚎紼嬩嬌鐢ㄧ嚎紼嬬浉鍏崇殑Connection錛岃屼笉浼?xì)鋴社敤鍏跺畠绾拷E嬬殑
Connection銆傚洜姝わ紝榪欎釜TopicDao灝卞彲浠ュ仛鍒皊ingleton鍏變韓浜嗐?/p>
褰撶劧錛岃繖涓緥瀛愭湰韜緢綺楃硻錛屽皢Connection鐨凾hreadLocal鐩存帴鏀懼湪DAO鍙兘鍋氬埌鏈珼AO鐨勫涓柟娉曞叡浜獵onnection鏃?
涓嶅彂鐢熺嚎紼嬪畨鍏ㄩ棶棰橈紝浣嗘棤娉曞拰鍏跺畠DAO鍏辯敤鍚屼竴涓狢onnection錛岃鍋氬埌鍚屼竴浜嬪姟澶欴AO鍏變韓鍚屼竴Connection錛屽繀欏誨湪涓涓叡鍚岀殑澶栭儴綾?
浣跨敤ThreadLocal淇濆瓨Connection銆備絾榪欎釜瀹炰緥鍩烘湰涓婅鏄庝簡Spring瀵規(guī)湁鐘舵佺被綰跨▼瀹夊叏鍖栫殑瑙e喅鎬濊礬銆?/p>
灝忕粨 ThreadLocal鏄В鍐崇嚎紼嬪畨鍏ㄩ棶棰樹竴涓緢濂界殑鎬濊礬錛屽畠閫氳繃涓烘瘡涓嚎紼嬫彁渚涗竴涓嫭绔嬬殑鍙橀噺鍓湰瑙e喅浜嗗彉閲忓茍鍙戣闂殑鍐茬獊闂銆傚湪寰堝鎯呭喌涓嬶紝
ThreadLocal姣旂洿鎺ヤ嬌鐢╯ynchronized鍚屾鏈哄埗瑙e喅綰跨▼瀹夊叏闂鏇寸畝鍗曪紝鏇存柟渚匡紝涓旂粨鏋滅▼搴忔嫢鏈夋洿楂樼殑騫跺彂鎬с?/p>