浠?.0.1鐗堟湰寮濮嬶紝Hibernate澧炲姞浜哠essionFactory.getCurrentSession()鏂規硶銆?/span>涓 寮濮嬶紝瀹冨亣瀹氫簡閲囩敤JTA浜嬪姟錛孞TA浜嬪姟瀹氫箟浜嗗綋鍓峴ession鐨勮寖鍥村拰涓婁笅鏂?scope and context)銆侶ibernate寮鍙戝洟闃熷潥淇★紝鍥犱負鏈夊ソ鍑犱釜鐙珛鐨凧TA TransactionManager瀹炵幇紼沖畾鍙敤錛屼笉璁烘槸鍚﹁閮ㄧ講鍒頒竴涓狫2EE瀹瑰櫒涓紝澶у鏁?鍋囪嫢涓嶆槸鎵鏈夌殑錛夊簲鐢ㄧ▼搴忛兘搴旇閲囩敤JTA浜嬪姟綆$悊銆?鍩轟簬榪欎竴鐐癸紝閲囩敤JTA鐨勪笂涓嬫枃鐩稿叧session鍙互婊¤凍浣犱竴鍒囬渶瑕併?/p>
鏇村ソ鐨勬槸錛屼粠3.1寮濮嬶紝SessionFactory.getCurrentSession()鐨勫悗鍙板疄鐜版槸鍙嫈鎻掔殑銆傚洜姝わ紝鎴戜滑寮曞叆浜嗘柊鐨勬墿灞?鎺ュ彛 (org.hibernate.context.CurrentSessionContext)鍜屾柊鐨勯厤緗弬鏁?(hibernate.current_session_context_class)錛屼互渚垮浠涔堟槸“褰撳墠session”鐨勮寖鍥村拰涓婁笅鏂?scope and context)鐨勫畾涔夎繘琛屾嫈鎻掋?/p>
璇峰弬闃?org.hibernate.context.CurrentSessionContext鎺ュ彛鐨凧avadoc,閭i噷鏈夊叧浜庡畠鐨勫綰︾殑璇︾粏璁ㄨ銆傚畠瀹氫箟 浜嗗崟涓鐨勬柟娉曪紝currentSession()錛岀壒瀹氱殑瀹炵幇鐢ㄥ畠鏉ヨ礋璐h窡韙綋鍓嶇殑涓婁笅鏂噑ession銆侶ibernate鍐呯疆浜嗘鎺ュ彛鐨勪袱縐嶅疄鐜般?/p>
org.hibernate.context.JTASessionContext - 褰撳墠session鏍規嵁JTA鏉ヨ窡韙拰鐣屽畾銆傝繖鍜屼互鍓嶇殑浠呮敮鎸丣TA鐨勬柟娉曟槸瀹屽叏涓鏍風殑銆傝鎯呰鍙傞槄Javadoc銆?/p>
org.hibernate.context.ThreadLocalSessionContext - 褰撳墠session閫氳繃褰撳墠鎵ц鐨勭嚎紼嬫潵璺熻釜鍜岀晫瀹氥傝鎯呬篃璇峰弬闃匤avadoc銆?/p>
榪欎袱縐嶅疄鐜伴兘鎻愪緵浜?#8220;姣忔暟鎹簱浜嬪姟瀵瑰簲涓涓猻ession”鐨勭紪紼嬫ā鍨嬶紝涔熺О浣滄瘡嬈¤姹備竴涓猻ession銆侶ibernate session鐨勮搗濮嬪拰緇堢粨鐢辨暟鎹簱浜嬪姟鐨勭敓瀛樻潵鎺у埗銆傚亣鑻ヤ綘閲囩敤鑷緙栧啓浠g爜鏉ョ鐞嗕簨鍔★紙姣斿錛屽湪綰補鐨凧2SE,鎴栬?JTA/UserTransaction/BMT錛夛紝寤鴻浣犱嬌鐢℉ibernate Transaction API鏉ユ妸搴曞眰浜嬪姟瀹炵幇浠庝綘鐨勪唬鐮佷腑闅愯棌鎺夈傚鏋滀綘鍦ㄦ敮鎸丆MT鐨凟JB瀹瑰櫒涓墽琛岋紝浜嬪姟杈圭晫鏄0鏄庡紡瀹氫箟鐨勶紝浣犱笉闇瑕佸湪浠g爜涓繘琛屼換浣曚簨鍔℃垨 session綆$悊鎿嶄綔銆傝鍙傞槄絎?11 绔?浜嬪姟鍜屽茍鍙戜竴鑺傛潵闃呰鏇村鐨勫唴瀹瑰拰紺轟緥浠g爜銆?/p>
hibernate.current_session_context_class 閰嶇疆鍙傛暟瀹氫箟浜嗗簲璇ラ噰鐢ㄥ摢涓猳rg.hibernate.context.CurrentSessionContext瀹炵幇銆傛敞鎰忥紝涓轟簡鍚戜笅鍏煎錛屽鏋滄湭 閰嶇疆姝ゅ弬鏁幫紝浣嗘槸瀛樺湪org.hibernate.transaction.TransactionManagerLookup鐨勯厤 緗紝Hibernate浼氶噰鐢╫rg.hibernate.context.JTASessionContext銆備竴鑸岃█錛屾鍙傛暟鐨勫兼寚鏄庝簡瑕佷嬌鐢ㄧ殑瀹?鐜扮被鐨勫叏鍚嶏紝浣嗛偅涓や釜鍐呯疆鐨勫疄鐜板彲浠ヤ嬌鐢ㄧ畝鍐欙紝鍗?jta"鍜?thread"銆?/p>
1銆乬etCurrentSession()涓巓penSession()鐨勫尯鍒紵
* 閲囩敤getCurrentSession()鍒涘緩鐨剆ession浼氱粦瀹氬埌褰撳墠綰跨▼涓紝鑰岄噰鐢╫penSession()
鍒涘緩鐨剆ession鍒欎笉浼?br />
* 閲囩敤getCurrentSession()鍒涘緩鐨剆ession鍦╟ommit鎴杛ollback鏃朵細鑷姩鍏抽棴錛岃岄噰鐢╫penSession()
鍒涘緩鐨剆ession蹇呴』鎵嬪姩鍏抽棴
2銆佷嬌鐢╣etCurrentSession()闇瑕佸湪hibernate.cfg.xml鏂囦歡涓姞鍏ュ涓嬮厤緗細
* 濡傛灉浣跨敤鐨勬槸鏈湴浜嬪姟錛坖dbc浜嬪姟錛?br />
<property name="hibernate.current_session_context_class">thread</property>
* 濡傛灉浣跨敤鐨勬槸鍏ㄥ眬浜嬪姟錛坖ta浜嬪姟錛?br />
<property name="hibernate.current_session_context_class">jta</property>
鍒╀簬ThreadLocal妯″紡綆$悊Session
鏃╁湪Java1.2鎺ㄥ嚭涔嬫椂錛孞ava騫沖彴涓氨寮曞叆浜嗕竴涓柊鐨勬敮鎸侊細java.lang.ThreadLocal錛岀粰鎴戜滑鍦ㄧ紪鍐欏綰跨▼紼嬪簭
鏃舵彁渚涗簡涓縐嶆柊鐨勯夋嫨銆俆hreadLocal鏄粈涔堝憿錛熷叾瀹濼hreadLocal騫墮潪鏄竴涓嚎紼嬬殑鏈湴瀹炵幇鐗堟湰錛屽畠騫朵笉鏄竴涓猅hread錛?br />
鑰屾槸thread local variable(綰跨▼灞閮ㄥ彉閲?銆備篃璁告妸瀹冨懡鍚嶄負ThreadLocalVar鏇村姞鍚堥傘傜嚎紼嬪眬閮ㄥ彉閲?ThreadLocal)
鍏跺疄鐨勫姛鐢ㄩ潪甯哥畝鍗曪紝灝辨槸涓烘瘡涓涓嬌鐢ㄦ煇鍙橀噺鐨勭嚎紼嬮兘鎻愪緵涓涓鍙橀噺鍊肩殑鍓湰錛屾槸姣忎竴涓嚎紼嬮兘鍙互鐙珛鍦版敼鍙樿嚜宸辯殑鍓湰錛?br />
鑰屼笉浼氬拰鍏跺畠綰跨▼鐨勫壇鏈啿紿併備粠綰跨▼鐨勮搴︾湅錛屽氨濂藉儚姣忎竴涓嚎紼嬮兘瀹屽叏鎷ユ湁涓涓鍙橀噺銆?br />
ThreadLocal鏄浣曞仛鍒頒負姣忎竴涓嚎紼嬬淮鎶ゅ彉閲忕殑鍓湰鐨勫憿錛熷叾瀹炲疄鐜扮殑鎬濊礬寰堢畝鍗曪紝鍦═hreadLocal綾諱腑鏈変竴涓狹ap錛?br />
鐢ㄤ簬瀛樺偍姣忎竴涓嚎紼嬬殑鍙橀噺鐨勫壇鏈傛瘮濡備笅闈㈢殑紺轟緥瀹炵幇(涓轟簡綆鍗曪紝娌℃湁鑰冭檻闆嗗悎鐨勬硾鍨?錛?br />
public class HibernateUtil {
public static final ThreadLocal session =new ThreadLocal();
public static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session currentSession() throws HibernateException {
Session s = session.get();
if(s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = session.get();
if(s != null) {
s.close();
}
session.set(null);
}
}