鍦烘櫙浠嬬粛浠庝粖澶╃殑姝f枃寮€濮嬶紝鎴戜滑鍏堜粙缁嶄竴涓畝鍗曠殑棰勬墸淇濊垂涓氬姟鍦烘櫙锛堣储鍔″叕鍙稿湪鍥哄畾鏃ユ湡浠庣敤鎴疯处鎴蜂腑鎵i櫎淇濊垂锛夈€傝处鍗曠浉鍏崇殑鎵g即淇℃伅锛岀劧鍚庡湪鎴戜滑鐨刾remiumapplicationform涓坊鍔犱竴鏉℃暟鎹紝鐒跺悗寮傛鍙戣捣涓€涓祦绋嬪畨鎺掞紝杩涘叆鐪熸鐨勬墸缂撮€昏緫澶勭悊銆傝鍒掓槸瀹岀編鐨勶紝浣嗗湪鍘嬪姏娴嬭瘯涓嵈棰戦鍙戠幇寮傚父銆備富瑕侀棶棰樻槸鏈変袱娆℃柇鏂画缁彁绀轰繚璐圭敵璇蜂笉瀛樺湪锛堜繚璐规墸缂存祦绋嬪畨鎺掔涓€涓妭鐐规槸楠岃瘉淇濊垂鐢宠淇℃伅鏄惁瀛樺湪锛夛紝鎴戜滑閫氳繃淇濊垂鐢宠鍙峰彂鐜版湁鏁版嵁搴撶‘瀹炴湁鏁版嵁锛屼絾鏄煡鐪嬫棩蹇楋紝sql鐨勬煡璇㈢粨鏋滅‘瀹炴槸0銆傛棩蹇楅绻佹彁绀篊ausedby:java.sql.SQLException:connectionholderisnull锛屽鑷村悗缁壒閲忚繍琛屽け璐ャ€傚皬浼欎即浠彲浠ュ紑濮嬫€濊€冧簡锛岃繖涓や釜闂鍙兘鏄暟鎹簱杩炴帴涓㈠け瀵艰嚧鐨勫師鍥犮€傛祴璇曞弽棣堝畾鏃朵换鍔℃墽琛屽け璐ユ椂锛岀涓€娆$湅鍒拌繖涓紓甯告彁绀烘椂锛宑onnectionholder涓簄ull銆傛垜鐨勭涓€鍙嶅簲鏄暟鎹簱杩炴帴杩樻病鏈夋墽琛屽畬浠诲姟銆傞」鐩摢閲岀敤鍒颁簡druid杩炴帴姹狅紝娌℃湁瑙e喅銆傜湅鐪媑ithub涓婄殑https://github.com/alibaba/dr...鍦╣ithub涓婏紝鐪嬪埌涔熸湁寰堝灏忎紮浼存彁浜唅ssue锛屽ぇ鑷寸湅浜嗕笅銆傛嵁鎴戜簡瑙o紝闂鍙兘鏄敱浜庝袱涓師鍥犻€犳垚鐨勩€傝繛鎺ユ暟瓒呰繃涓婇檺锛屽崟娆¤繛鎺ヨ秴鏃躲€傚甫鐫€杩欎袱涓棶棰橈紝鎴戝幓鏌ョ湅浜咥pollo鐨勭浉鍏抽厤缃€傜洰鍓嶇殑绯荤粺浣跨敤闃块噷銆俤ruid杩炴帴姹犵殑閰嶇疆鍙傛暟涓?/鏈€澶ц繛鎺ユ暟spring.datasource.druid.max-active=128//閰嶇疆绛夊緟杩炴帴鑾峰彇timeout鐨勬椂闂磗pring.datasource.druid.max-wait=60000//瓒呮椂鑷姩鎭㈠杩炴帴閰嶇疆spring.datasource.druid.remove-abandoned=true//杩炴帴瓒呮椂鎭㈠鏃堕棿spring.datasource.druid.remove-abandoned-timeout-millis=30000鏈変簡杩欎簺鍙傛暟锛屾垜鍘绘煡杩欎釜鎵g暀鏁版嵁鏌ヨ褰撴垜鐪嬪埌涓€涓秴杩?00琛岀殑鏂规硶琚獲Transcation娉ㄨВ瑕嗙洊鏃讹紝鎴戠煡閬撹繖鏄竴浠跺潖浜嬨€傛帴涓嬫潵鏄疈Transcation鐨勭鏅椂闂淬€侤Transcation铏界劧鐢ㄨ捣鏉ュ緢鐖斤紝浣嗘槸浣跨敤涓嶅綋鏄潪甯稿鏄撶殑銆傛媺杩涚伀钁満锛屾垜浠煡閬撳0鏄庡紡浜嬪姟鏄熀浜嶢OP绠$悊鐨勶紝鎷︽埅涓氬姟鏂规硶鍓嶅悗锛屽鎴戜滑鐨勪笟鍔′唬鐮佹病鏈変镜鍏ユ€э紝浣嗘槸澹版槑寮忎簨鍔$殑灞€闄愭€у湪浜庡畠鐨勬渶灏忕矑搴﹀繀椤诲拰鏂规硶涓€鏍枫€備粩缁嗙湅杩欎釜閫昏緫锛屽洜涓洪鎵i渶瑕佺殑鏁版嵁寰堝锛屽仛浜嗗娆¤法妯″潡鏌ヨ锛屼唬鐮佷氦浜嗗緢澶氫汉銆傚ぇ瀹舵瘡娆¢兘缂濈紳琛ヨˉ涓€浜涢€昏緫锛岄兘蹇冪収涓嶅鍦版煡涓嶅嚭鏉ャ€備氦鏄撳お澶х殑闂寰堟槑鏄撅紝鎴戜滑鎵句笉鍒扮涓€涓啓杩欎釜@Trancation鐨勪汉锛屽氨瀵逛粬璇达紝灏忓瓙锛屼綘鍐欑殑鏈夐棶棰橈紝浜ゆ槗澶ぇ浜嗮煂讹笍馃悢瀹藉ぇ澶勫垎鑷繁寰呬汉锛屽懜锛屽弽鍏堕亾鑰岃涔嬶紝涓ヤ簬寰嬪繁锛屽浠ュ緟浜恒€備笉鏄瘡涓汉閮藉湪浜旀ゼ銆傚洜姝わ紝鍦ㄥ钩鏃剁殑浠g爜涓紝鎴戜滑鍙互鏈夐€夋嫨鍦颁娇鐢ㄧ▼搴忓寲浜嬪姟鏉ユ帶鍒惰繖涓簨鍔$殑鑼冨洿銆傞樋閲屽反宸磋鑼冧腑瀵硅繖涓€鐐圭殑澶勭悊鍏跺疄宸茬粡缁欐垜浠В閲婅繃浜嗐€傜▼搴忓寲浜ゆ槗铏界劧鐪嬭捣鏉ユ病鏈夐偅涔堚€滀紭闆呪€濓紝浣嗚嚦灏戝彲浠ヤ负鍏朵粬灏忎紮浼存彁閱掓垨鑰呴伩鍏嶈繖绉嶅ぇ浜ゆ槗鐨勫彂鐢燂紝鑰屼笖鐩告瘮澹版槑寮忎氦鏄撲篃娌℃湁閭d箞瀹规槗澶辫触锛岃鎴戜滑鍥炶繃澶存潵鍒颁富棰樸€傚叾瀹炲ぇ瀹跺垎鏋愬畬杩欎釜搴旇蹇冮噷鏈夋暟浜嗐€備负浠€涔堜細涓㈠け杩炴帴鏄洜涓轰簨鍔″お澶э紝闀挎椂闂村崰鐢ㄨ繖涓暟鎹簱杩炴帴銆傝繛鎺ユ睜璧勬簮涓嶈冻锛屾垨鍗曟杩炴帴瓒呮椂銆傝В鍐虫柟娉曚篃寰堢畝鍗曘€備负浜嗕笉闃荤娴嬭瘯杩涘害锛屾垜浠彲浠ユ殏鏃剁鐢ㄨ繛鎺ヨ秴鏃舵仮澶嶆満鍒讹紝澧炲姞杩炴帴鏁帮紝鐒跺悗鎵嬪姩浼樺寲鐙楀睅灞便€備綘璁や负杩欐槸缁撴潫浜嗗悧锛熷綋鐒朵笉鏄€傚湪璋冩煡鐨勮繃绋嬩腑锛屾垜鎯冲埌浜嗕竴涓棶棰橈細@Transcational鏄粈涔堟椂鍊欏紑濮嬩氦鏄撶殑锛熺粰浣犱笁绉掗挓鐨勬椂闂存€濊€冦€俹k锛屽鏋滀綘鐭ラ亾鐨勫緢娓呮鍙互璺宠繃杩欓儴鍒嗭紝濡傛灉浣犱笉鏄緢娓呮锛屾垨鑰呬綘璁や负涓€杩涘叆鏂规硶灏卞紑濮嬩簨鍔★紝閭f垜浠潵鐪嬬湅@Trancational鐨勬簮鐮佹潵寮€濮嬩氦鏄撱€傚厛鍐欎釜demo鍚с€傛柇鐐瑰埌瑙傚療鏍堢殑鏂规硶寮€濮嬶紝杩欎釜鍦版柟寰堝彲鐤憃rg.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction鎺ヤ笅鏉ユ垜浠柇鐐瑰埌#createTransactionIfNecessary杩欎釜鏂规硶鐢ㄦ潵鍒涘缓涓€涓簨鍔★紝褰撳墠浜嬪姟鐨勭姸鎬佸拰淇℃伅淇濆瓨鍦═ransactionInfo瀵硅薄涓紝鍖呮嫭璁剧疆浼犳挱琛屼负銆侀殧绂荤骇鍒€佹墜鍔ㄦ彁浜ゃ€佸紑鍚簨鍔$瓑锛屽皢浜嬪姟txInfo缁戝畾鍒板綋鍓嶇嚎绋嬶紝鍏朵腑浣跨敤浜嗗緢澶氱紦瀛樺拰threadLocal瀵硅薄鏂逛究鑾峰彇杩炴帴淇℃伅绛?,杩樻湁閲岄潰鐨勪竴浠朵簨锛屾垜浠户缁線涓嬩竴姝ユ杩芥煡锛岃瀵熸爤锛屾壘鍒扮湡姝e紑濮嬪鐞嗕簨鍔$殑閫昏緫org.springframework.jdbc.datasource.DataSourceTransactionManager#doBegin宸茬粡瑙i噴杩囦簡瀵逛簬浣狅紝璋㈣阿锛屾垜浠彲浠ョ湅鍒板湪杩欐浠g爜涓紝杩欓儴鍒嗗皢浜嬪姟鍒囨崲鍒版墜鍔ㄦ彁浜わ紝骞跺皢autoCommit璁剧疆涓篺alse//蹇呰鏃跺垏鎹㈠埌鎵嬪姩鎻愪氦銆傝繖鍦ㄤ竴浜汮DBC椹卞姩绋嬪簭涓潪甯告槀璐碉紝//鎵€浠ユ垜浠笉鎯充笉蹇呰鍦拌繖鏍峰仛锛堜緥濡傦紝濡傛灉鎴戜滑宸茬粡鏄庣‘鍦?/閰嶇疆杩炴帴姹犳潵璁剧疆瀹冿級銆?/蹇呰鏃跺垏鎹㈠埌鎵嬪姩鎻愪氦浜嬪姟銆傚湪鏌愪簺JDBC椹卞姩绋嬪簭涓环鏍兼槀璐碉紝闄ら潪蹇呰锛屽惁鍒欎笉瑕佷娇鐢ㄥ畠銆傦紙姣斿鎴戜滑璁剧疆浜嗚繛鎺ユ睜鍐茬獊锛?/濡傛灉鏄嚜鍔ㄦ彁浜わ紝浜嬪姟瀵硅薄蹇呴』灏嗚嚜鍔ㄦ彁浜ゆ仮澶嶄负true锛屽叧闂繛鎺ョ殑鑷姩鎻愪氦銆俰f(con.getAutoCommit()){//鍦╠oCleanupAfterCompletion鏂规硶涓紝褰撲簨鍔$粨鏉熸椂锛屼細鍒ゆ柇杩欎釜鍊间负true锛屼細鑷姩鎻愪氦杩炴帴銆倀xObject.setMustRestoreAutoCommit(true);if(logger.isDebugEnabled()){logger.debug("灏咼DBC杩炴帴["+con+"]鍒囨崲涓烘墜鍔ㄦ彁浜?);}con.setAutoCommit(false);閭d箞锛岃繖涓椂鍊欐槸鍚﹀紑濮嬩簡浜ゆ槗鍛紵杩欓噷濂藉儚娌℃湁鍏抽棴鎴戜滑鐨勮嚜鍔ㄦ彁浜わ紝鎵€浠ユ垜浠厛鍐欎竴涓皬demo瀹為獙锛岀劧鍚庣敤杩欎釜sql鏌ヨ褰撳墠浜嬪姟銆傚張鏄竴涓煡璇嗙偣銆傛嬁涓猲otebook璧锋潵锛孲ELECT*FROMinformation_schema.INNODB_TRX鎺ヤ笅鏉ユ垜浠笅鏂偣锛岀湅鐪嬩簨鍔℃湁娌℃湁鎵撳紑銆備簨瀹炲緢娓呮銆傚師鏉Trancational鏄涓€涓猻ql鎵ц鏃跺紑鍚殑浜嬪姟銆傚叿浣撶殑婧愮爜璺熻釜浜ょ粰鏈嬪弸浠紝澶у鑷繁鍘昏瘯璇曞惂銆傛暟鎹簱涓湁鏁版嵁锛屼负浠€涔堟煡璇笉鍒帮紵鎺ヤ笅鏉ワ紝璁╂垜浠洖椤句竴涓嬫垜浠殑绗竴涓棶棰樸€備负浠€涔堟暟鎹簱涓湁鏁版嵁锛屾墽琛屾椂鍗存壘涓嶅埌锛熸帴涓嬫潵涓婁竴娉吉浠g爜鐨勭溂灏栫殑灏忎紮浼村彲鑳戒竴涓嬪瓙灏卞彂鐜颁簡銆傛槸涓嶆槸寮傛鍚姩娴佺▼缂栨帓鐨勯攨锛熷叧浜嶴pring涓簨鍔$殑浼犳挱锛岃繖閲屽氨涓嶅啀涓哄皬浼欎即浠禈杩颁簡銆傞偅涔堬紝鍦ㄥ浣曟帶鍒朵簨鍔℃彁浜や箣鍚庯紝灏遍渶瑕佸€熷姪鎴戜滑浠婂ぉ鐨勪富瑙掓潵鍙戣捣鎴戜滑鐨勬祦绋嬪畨鎺掍簡銆?/娉ㄥ唽浜嬪姟鐨勫悗澶勭悊TransactionSynchronizationManager.registerSynchronization(newTransactionSynchronization(){@OverridepublicvoidafterCommit(){log.info("浜嬪姟鎻愪氦瀹屾垚锛屽惎鍔ㄦ祦绋嬶紒");//寮傛鍚姩娴佺▼缂栨帓杩欎釜.asyncExecute锛堟垜insurancePremiumApplyDo,flowId);});}杩欏緢濂界殑瑙e喅浜嗘垜浠殑闂銆備綘璁や负杩欐槸缁撴潫浜嗗悧锛熷綋鐒朵笉鏄紝浣犻渶瑕佺煡閬撲负浠€涔堛€傛垜浠潵鐪嬬湅TransactionSynchronizationManager锛屼竴涓簨鍔$鐞嗗櫒锛屽湪浜嬪姟鎻愪氦鍚庡浣曞府鎴戞墽琛屾垜浠殑浠g爜锛熷拰demo涓€鏍凤紝鐪嬬湅afterCommit鏂规硶鏄惁鐪熺殑鏈夋晥銆傜湡鐨勫緢瀹岀編銆傛帴涓嬫潵锛岃鎴戜滑鐪嬬湅杩欎釜afterCommit鏄浣曞伐浣滅殑銆傚湪姝e紡鍏紑婧愮爜涔嬪墠锛屾垜浠兂涓€鎯筹紝濡傛灉瑕佸疄鐜拌繖涓猘fterCommit鍑芥暟锛屾垜浠細鎬庝箞鍋氾紵绗竴涓€濊矾鏄垽鏂綋鍓嶇嚎绋嬬粦瀹氱殑浜嬪姟鏄惁澶勭悊瀹屾瘯锛屽鏋滃鐞嗗畬姣曪紝鍒欒皟鐢╝fterCommit鏂规硶銆傞偅涔堜粠鍝噷鍒ゆ柇浜ゆ槗瀹屾垚鍛紵娌¢敊锛屽氨鏄垜浠墠闈㈡彁鍒扮殑#invokeWithinTransaction涓殑commitTransactionAfterReturning鏂规硶銆傝繖涓柟娉曠殑鍚嶅瓧宸茬粡寰堟槑纭殑鍛婅瘔鎴戜滑锛屾垜鍦ㄨ繖涓柟娉曚腑鎵ц鐨勬槸鎻愪氦浜ゆ槗涔嬪悗鐨勬柟娉曘€傜湅鏉ユ垜浠殑鐞嗚鐭ヨ瘑闈炲父涓板瘜銆傛帴涓嬫潵锛屾垜浠彧闇€瑕佹煡鐪嬫簮浠g爜灏卞彲浠ラ獙璇佹垜浠殑鐚滄祴浜嗐€傚湪楠岃瘉鎴戜滑鐨勭寽鎯充箣鍓嶏紝鎴戜滑鍏堟寜椤哄簭鐪嬩竴涓媎emo浠g爜涓殑#registerSynchronization鏂规硶鍋氫簡浠€涔堛€傝繖绉嶆柟娉曠湅璧锋潵鐩稿綋绠€鍗曟槗鎳傘€傚皢鎴戜滑鏂板缓鐨凾ransactionSynchronization瀵硅薄鏀惧叆涓€涓猻ynchronizations涓紝鎴戜滑鏆備笖绉颁箣涓簍ransaction銆備负浠€涔堝儚synchronizer涓€鏍峰畨瑁呭湪涓€涓猅hreadLocal涓紝鑰屼笖鏄竴涓猄et闆嗗悎銆備笅闈㈡垜浠潵瀹為檯鎬濊€冧竴涓嬶紝涓€涓嚎绋嬫槸鍚﹀彲浠ヨ澶氫釜浜嬪姟缁戝畾锛屼互鍙婂涓簨鍔$粦瀹氱殑绾跨▼濡備綍瀛樺偍銆傛垜浠彲浠ョ悊瑙d负浠€涔堣鐢ㄥ埌ThreadLocal鍜孲et闆嗗悎锛屾殏鏃跺厛鍏虫敞涓€涓嬶紝鐒跺悗寰€涓嬬湅鐩存帴鍦╝fterCommit涓婃墦鏂偣锛岃皟璇曞垎鏋愪竴娉紝璋佸湪璋冪敤afterCommit锛屾槸鍚﹁皟鐢ㄤ笌鎴戜滑鐨勭寽娴嬩竴鑷淬€傚紑濮嬭繘鍏fterCommit鐨勫唴閮▁iu锛屼唬鐮乨ebug杩涘叆杩欓噷锛屾垜浠敞鎰忓浘涓殑绗簩涓柟娉曪紝杩欓噷鐨勬敞閲婁篃寰堟竻妤氾紝鍏跺疄灏辨槸瀹為檯鐨勬剰鎬濓紝灏辨槸鎴戜滑鐨刟fterCommit鐪熸琚皟鐢ㄧ殑鍦版柟鍜岃繖閲屾槸涓€涓惊鐜紝涔熺鍚堟垜浠笂闈㈢湅鍒扮殑涓轰粈涔堣鎶婃垜浠殑鏂板璞℃斁鍏ュ悓姝ャ€傝嚦浜庝负浠€涔堟槸鍒楄〃鑰屼笉鏄泦鍚堬紝鏈夊叴瓒g殑鏈嬪弸鍙互鐮旂┒涓€涓嬨€傝繖涓嶆槸鎴戜滑鍒嗘瀽鐨勯噸鐐广€傜湅鐪嬫槸璋佽皟鐢ㄤ簡#invokeAfterCommit鏂规硶鍛紝灏辨槸涓婇潰鐨?triggerAfterCommit鏂规硶锛屾兂蹇呰嫳璇繃浜嗗洓绾х殑鍚屽閮借兘鐪嬫噦娉ㄩ噴鐨勬剰鎬漈rigger{@codeafterCommit}callbacksonallcurrentlyregisteredsynchronizations.鍦ㄦ墍鏈夊悓姝ヤ笂瑙﹀彂afterCommit鏂规硶灏眔k浜嗭紝鎺ヤ笅鏉ユ彮鏅撶瓟妗堛€傝皝瑙﹀彂浜哸fterCommit鏂规硶锛熸垜浠殑鐚滄祴鏄惁姝g‘锛熸槸commitTransactionAfterReturning鏂规硶鍚楋紵鎵撳紑鎴戜滑鐨勫爢鏍堬紝鐪嬪埌鍦ㄨ窛绂荤6琛岀殑#invokeWithinTransaction涓壘鍒颁簡commitTransactionAfterReturning鏂规硶锛岀寽娴嬫槸姝g‘鐨勩€傛帴涓嬫潵鎴戜滑鍙互姝i潰鐪嬩竴涓嬭繖涓?afterCommit鏄浣曞疄鐜伴暱鍥鹃璀︾殑銆傛參鎱㈢湅锛屽彲浠ユ敹钘忥紝鐐硅禐锛岀湅鎬荤粨銆傚埌杩欓噷鎴戜滑宸茬粡鍙互浜嗚В鍒癅Transcation鐨勪娇鐢ㄥ皬缁嗚妭浜嗭紝涓嶆帹鑽愪娇鐢ㄣ€傚浜庡ぇ棰濅氦鏄擄紝寤鸿灏藉彲鑳芥墜鍔ㄥ紑鍚氦鏄撱€侤Trancation寮€鍚簨鍔$殑瀹炵幇鏂瑰紡鏄柟娉曡繘鏉ョ殑鏃跺€欙紝鍙槸鍏抽棴浜嗚嚜鍔ㄦ彁浜わ紝浜嬪姟灏辩华浜嗐€傚綋浠g爜鐪熸璋冪敤sql鏃讹紝瀹冧細鍚姩浜嬪姟銆俻ost-submission鐨勫簳灞傚疄鐜?afterCommit鐨勬簮鐮佸叧浜嶡Trancation鐨勪簨鍔℃簮鐮佽繕鏄緢瀹规槗鐞嗚В鐨勩€傛帹鑽愬皬浼欎即浠彲浠ョ湅鐪嬶紝涔熺粰鑷繁鐣欎釜浣滀笟銆傝嚜宸辩湅鐪媜rg.springframework.transaction.support.TransactionSynchronization#beforeCommit杩欑瘒鏂囩珷鐨勫疄鐜帮紝涔熸槸瀵硅繖绡囨枃绔犵殑宸╁浐銆備竴涓嶅皬蹇冿紝鍙堜細杩涙銆備粠杩欎竴姝ュ紑濮嬶紝浣犵殑鍚屼簨灏变細寮€濮嬪叓鍗﹀叓鍗︿簡銆備笁鏈堝緢蹇氨瑕佽繃鍘讳簡銆傚湪缃戜笂涔颁簡ExcuseMeOrchestra鐨勭エ锛屽洜涓烘繁鍦崇柅鎯呰杩欢鏈熴€傚垢杩愮殑鏄紝娣卞湷鐨勭柅鎯呭凡缁忛€愭笎寰楀埌鎺у埗銆傛暣涓笁鏈堟垜鍋氫簡鏃犳暟娆℃牳閰告娴嬶紝鍑犳閮借鍛婄煡鎴戠殑濮垮娍鏄爣鍑嗙殑銆傚笇鏈涜嚜宸变笉鐢ㄨ24灏忔椂鏍搁吀锛岃繘鍏叡鍦烘墍涓嶇敤鎵爜銆傜澶у鍥涙湀蹇箰銆傚墠娈垫椂闂存帹鑽愭垜鐨勯偅涓潰璇曞畼灞呯劧鍜屾垜鐮镐簡銆傛祬璋圡avenThreadLocalMaven
