亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Hibernate事務(wù)處理機(jī)制

2019-11-18 13:56:01
字體:
供稿:網(wǎng)友

  Hibernate是對JDBC的輕量級對象封裝,Hibernate本身是不具備Transaction處理功能的,Hibernate的Transaction實(shí)際上是底層的JDBC Transaction的封裝,或者是JTA Transaction的封裝,下面我們具體的分析:

Hibernate可以配置為JDBCTransaction或者是JTATransaction,這取決于你在hibernate.PRoperties中的配置:

#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory

假如你什么都不配置,默認(rèn)情況下使用JDBCTransaction,假如你配置為:

hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory

將使用JTATransaction

不管你預(yù)備讓Hibernate使用JDBCTransaction,還是JTATransaction,我的忠告就是什么都不配,將讓它保持默認(rèn)狀態(tài),如下:

#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory

在下面的分析中我會給出原因。

一、JDBC Transaction

看看使用JDBC Transaction的時(shí)候我們的代碼例子:

session session = sf.openSession();
Transaction tx = session.beginTransactioin();
...
session.flush();
tx.commit();
session.close();

這是默認(rèn)的情況,當(dāng)你在代碼中使用Hibernate的Transaction的時(shí)候?qū)嶋H上就是JDBCTransaction。那么JDBCTransaction究竟是什么東西呢?來看看源代碼就清楚了:

Hibernate2.0.3源代碼中的類

net.sf.hibernate.transaction.JDBCTransaction:

public void begin() throws HibernateException {

...
if (toggleAutoCommit) session.connection().setAutoCommit(false);
...
}

這是啟動Transaction的方法,看到 connection().setAutoCommit(false) 了嗎?是不是很熟悉?

再來看

public void commit() throws HibernateException {
...
try {
if ( session.getFlushMode()!=FlushMode.NEVER ) session.flush();
try {
session.connection().commit();
committed = true;
}
...
toggleAutoCommit();
}

這是提交方法,看到connection().commit() 了嗎?下面就不用我多說了,這個(gè)類代碼非常簡單易懂,通過閱讀使我們明白Hibernate的Transaction都在干了些什么?我現(xiàn)在把用Hibernate寫的例子翻譯成JDBC,大家就一目了然了:

Connection conn = ...; <--- session = sf.openSession();

conn.setAutoCommit(false); <--- tx = session.beginTransactioin();

... <--- ...

conn.commit(); <--- tx.commit(); (對應(yīng)左邊的兩句)
conn.setAutoCommit(true);

conn.close(); <--- session.close();

看明白了吧,Hibernate的JDBCTransaction根本就是conn.commit而已,根本毫無神秘可言,只不過在Hibernate中,Session打開的時(shí)候,就會自動conn.setAutoCommit(false),不像一般的JDBC,默認(rèn)都是true,所以你最后不寫commit也沒有關(guān)系,由于Hibernate已經(jīng)把AutoCommit給關(guān)掉了,所以用Hibernate的時(shí)候,你在程序中不寫Transaction的話,數(shù)據(jù)庫根本就沒有反應(yīng)。

二、JTATransaction

假如你在EJB中使用Hibernate,或者預(yù)備用JTA來治理跨Session的長事務(wù),那么就需要使用JTATransaction,先看一個(gè)例子:

javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction");

Session s1 = sf.openSession();
...
s1.flush();
s1.close();

...

Session s2 = sf.openSession();
...
s2.flush();
s2.close();

tx.commit();

這是標(biāo)準(zhǔn)的使用JTA的代碼片斷,Transaction是跨Session的,它的生命周期比Session要長。假如你在EJB中使用Hibernate,那么是最簡單不過的了,你什么Transaction代碼統(tǒng)統(tǒng)都不要寫了,直接在EJB的部署描述符上配置某某方法是否使用事務(wù)就可以了。

現(xiàn)在我們來分析一下JTATransaction的源代碼, net.sf.hibernate.transaction.JTATransaction:

public void begin(InitialContext context, ...
...
ut = (UserTransaction) context.lookup(utName);
...

看清楚了嗎? 和我上面寫的代碼 tx = new Initial Context?().lookup("javax.transaction.UserTransaction"); 是不是完全一樣?

public void commit() ...
...
if (newTransaction) ut.commit();
...

JTATransaction的控制稍微復(fù)雜,不過仍然可以很清楚的看出來Hibernate是如何封裝JTA的Transaction代碼的。

但是你現(xiàn)在是否看到了什么問題? 仔細(xì)想一下,Hibernate Transaction是從Session中獲得的,tx = session.beginTransaction(),最后要先提交tx,然后再session.close,這完全符合JDBC的Transaction的操作順序,但是這個(gè)順序是和JTA的Transactioin操作順序徹底矛盾的?。?! JTA是先啟動Transaction,然后啟動Session,關(guān)閉Session,最后提交Transaction,因此當(dāng)你使用JTA的Transaction的時(shí)候,那么就千萬不要使用Hibernate的Transaction,而是應(yīng)該像我上面的JTA的代碼片斷那樣使用才行。

總結(jié):
1、在JDBC上使用Hibernate

必須寫上Hibernate Transaction代碼,否則數(shù)據(jù)庫沒有反應(yīng)。此時(shí)Hibernate的Transaction就是Connection.commit而已

2、在JTA上使用Hibernate

寫JTA的Transaction代碼,不要寫Hibernate的Transaction代碼,否則程序會報(bào)錯(cuò)

3、在EJB上使用Hibernate

什么Transactioin代碼都不要寫,在EJB的部署描述符里面配置

---CMT(Container Managed Transaction)

---BMT(Bean Managed Transaction)

----JDBC Transaction

----JTA Transaction


--------------------------------------------------------------------------------

提問:

javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction");

Session s1 = sf.openSession();
...
s1.flush();
s1.close();

...

Session s2 = sf.openSession();
...
s2.flush();
s2.close();

tx.commit();

s1不關(guān)閉,使用s2進(jìn)行操作的代碼中使用s1可不可以(我覺得這樣更加節(jié)約資源,不需要反復(fù)的連接、關(guān)閉)

但sf.opengSession()時(shí),并沒有setAutoCommit(false),我想問的是,假如不編寫任何事務(wù)代碼,如:
Session s = sf.openSession();
......
s.close();
數(shù)據(jù)庫會不會有反應(yīng)(此時(shí)應(yīng)該是默認(rèn)AutoCommit為true)。

不會有反應(yīng)。在sf.openSession() 創(chuàng)建Session實(shí)例的時(shí)候,就已經(jīng)調(diào)用了conn.setAutoCommit(false)了。

另外,我想問一下:


1. s.flush()是不是必須的

2. s.close()是不是一定要關(guān)閉


--------------------------------------------------------------------------------

回答:

s.flush不是必須的,s.close()會調(diào)用一次s.flush()

s.close()正常情況下應(yīng)該關(guān)閉,除非你是用ThreadLocal治理Session。

s1不關(guān)閉,使用s2進(jìn)行操作的代碼中使用s1可不可以(我覺得這樣更加節(jié)約資源,不需要反復(fù)的連接、關(guān)閉)

在這個(gè)例子中看不出來JTA的作用。
假設(shè)
Class A {
find() {
Session s1 = sf.openSession();
...
s1.flush();
s1.close();
}
}

Class B {
find() {
Session s2 = sf.openSession();
...
s2.flush();
s2.close();
}
}

Main {

tx = ...;
A.find();
B.find();
tx.commit();
}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
中文字幕在线观看av| 丁香网亚洲国际| 国产精品久久久久aaaa九色| 精品国产一区二区三区在线| 成熟老妇女视频| 国产偷窥女洗浴在线观看亚洲| 麻豆精品在线播放| 日韩视频在线视频| 北岛玲精品视频在线观看| 亚洲视频国产精品| 亚洲AV无码乱码国产精品牛牛| 一本一本久久a久久精品综合妖精| 中文字幕免费不卡在线| 国产精品久久久久久久美男| 婷婷久久综合九色综合99蜜桃| 日韩小视频在线| 国产chinese男男gaygay网站| 亚洲日本视频在线观看| 四虎4hu永久免费入口| 日韩成人av网址| 亚洲风情在线资源| 激情偷拍久久| 大片在线观看网站免费收看| 欧美图片激情小说| 特级毛片在线观看| 亚洲天堂av在线免费| 日韩女优av电影在线观看| 古典武侠综合av第一页| 一本久久a久久免费精品不卡| 日本中文字幕在线视频观看| 欧美特大特白屁股xxxx| 一区二区三区在线视频观看| 最新国产一区二区| 先锋影音av资源在线| 欧美日韩一道本| 蜜桃传媒视频麻豆第一区免费观看| 久久成人福利视频| 国产浮力第一页| 欧美一区国产一区| 精品视频无码一区二区三区| 久久久精品美女| 亚洲三级视频网站| 亚洲精品喷潮一区二区三区| 国产精品初高中害羞小美女文| 你真棒插曲来救救我在线观看| 欧美三级理伦电影| 粉嫩久久99精品久久久久久夜| 国产欧美日韩另类一区| 日韩亚洲视频| 欧美日韩福利在线| 中文字幕人妻一区二区三区在线视频| 精品国精品国产尤物美女| 亚洲av综合色区无码一二三区| 青青草国产精品97视觉盛宴| 香蕉视频在线免费看| 日韩国产在线观看一区| 性久久久久久| 亚洲视频 中文字幕| 日本а中文在线天堂| 国产一区二区欧美日韩| 欧美精品国产一区| 久久社区一区| 亚洲精品xxxx| 亚洲高清激情| 91麻豆国产语对白在线观看| 第一sis亚洲原创| 蜜桃视频在线观看视频| 精品国产一区二区三区日日嗨| 欧美一级淫片aaaaaa| 国产精品一区视频网站| 狠狠操狠狠色| 99视频都是精品热在线播放| 一区二区三区四区精品在线视频| 亚洲av熟女高潮一区二区| 91伊人久久大香线蕉| 国产精品一区二区三区www| 亚洲一区二区三区综合| 中文字幕第五页| 色婷婷狠狠综合| 成人网站免费观看入口| 国产乱码字幕精品高清av| 成人精品中文字幕| 无人区在线高清完整免费版 一区二| 在线日本高清免费不卡| 99热在线成人| 欧美性受xxxx黑人xyx| 精品无人码麻豆乱码1区2区| 91国产在线免费观看| 92久久精品| 午夜欧美一区二区三区在线播放| 成人看片app| 严阵以待中文社区| 欧美日韩高清一区二区三区| 国产欧美123| 国产精品午夜一区二区| 97国产精品久久| 91麻豆精品国产91久久久久久| xxxxwwww欧美| 麻豆久久久久久久久久| www.九色在线| 日韩黄色视屏| 精品人妻一区二区三区麻豆91| 国产成人无码精品久在线观看| 国产色噜噜噜91在线精品| 免费国产阿v视频在线观看| 国产精品久久久久久久久免费相片| 色999国产精品| 在线免费av片| 亚洲熟妇国产熟妇肥婆| 亚洲一级黄色av| 99久久精品国产毛片| 国内精品伊人久久久久av影院| 精品国产无码一区二区| 8888四色奇米在线观看| 黑人与亚洲人色ⅹvideos| 女女色综合影院| 制服丝袜影音先锋| 久草热8精品视频在线观看| 日本在线看片免费人成视1000| 久草在线视频精品| 久草精品视频| 国产亚洲精品久久久久久777| 在线观看日韩一区二区| 日韩新的三级电影| 国产日韩成人内射视频| 小早川怜子痴女在线精品视频| 国产高清精品在线观看| 亚洲精品自拍动漫在线| 亚洲日本护士毛茸茸| 天堂网一区二区三区| 亚洲在线电影| 国产一级二级三级视频| 性色av一区二区三区红粉影视| 日韩精品一区二区在线| 欧美成人午夜电影| 亚洲国产精品中文| 在线不卡一区二区三区| 国产成人综合在线播放| 亚洲三区在线| 国产天堂第一区| 久久天堂成人| 一区二区三区网址| 中国成人在线视频| 波多野结衣在线网址| 国产精品涩涩涩视频网站| 国产在线视频在线观看| 在线观看欧美一区二区| 国产精品夜夜嗨| 国产一区在线视频观看| 18禁免费无码无遮挡不卡网站| av一级在线观看| 在线不卡一区二区三区| 国模无码视频一区二区三区| 色拍拍在线精品视频8848| 一区二区久久精品66国产精品| 成人手机在线电影| 性欧美8khd高清极品| 欧美视频xxxx| 国产精品96久久久久久又黄又硬| 一区二区在线免费观看| av网站免费播放| 免费在线看黄色| 久久久久九九精品影院| 日韩欧美国产系列| 美女扒开大腿让男人桶| 精品国产乱码久久久久久影片| 欧美日韩精品不卡| 国产在线不卡一卡二卡三卡四卡| 91tv亚洲精品香蕉国产一区7ujn| 四色最新网址| 精品国产一区二区三区久久久樱花| 亚洲福利视频网| 午夜国产在线观看| 亚洲免费观看高清完整版在线观看| 成人高清伦理免费影院在线观看| 理论片影音先锋| 北条麻妃国产九九九精品小说| 天天操天天摸天天干| 第四色亚洲色图| 欧洲视频在线免费观看| 精品国产电影| 亚洲欧洲日产国产综合网| 国产在线黄色| 老鸭窝91久久精品色噜噜导演| 欧美亚洲视频在线看网址| 欧美日韩大片免费观看| 日韩不卡在线| 久久久久免费看| 精品视频一区二区观看| 日韩精品视频一二三| www.操操| 91精品综合久久久久久| 欧美激情xxxx| 一本大道综合伊人精品热热| 色天使在线视频| 久久久亚洲国产天美传媒修理工| 欧美裸身视频免费观看| 日韩欧美中文字幕在线视频| 日韩欧美一区二区三区四区| 不卡一区二区三区视频| 日韩黄色a级片| 欧美二区视频| 国产精品一区二区果冻传媒| 成 人 免费 黄 色| 日本精品免费一区二区三区| 一二三四中文在线| 亚洲精品国产精品国自产观看| 国产高清中文字幕在线| 国产女主播视频一区二区| 91成人短视频在线观看| 我要色综合中文字幕| 国产日本一区二区三区| 精品中文字幕一区二区三区| 国产绳艺sm调教室论坛| 精品日韩美女| 在线sese| 97国产一区二区精品久久呦| 无码视频在线观看| 中文字幕制服丝袜成人av| 我家有个日本女人| 91免费在线播放视频| 荡女精品导航| 成人av蜜桃| 免费成人在线视频网站| 日本成人一区二区三区| 亚洲精品久久久久国产| av午夜一区麻豆| 国产精品久久久久天堂| 免费在线观看污网站| 五月天色综合| 亚洲欧美在线免费观看| 日本精品影院| 欧美日韩国产经典色站一区二区三区| av在线播放网站| 国产专区第一页| 九九色在线观看| 国内精品视频一区| 日韩欧美国产骚| 日韩精品一区二区三区视频播放| 一个人看的www视频免费观看| 伊人成年综合网| 久久一区二区三区视频| 日本人视频jizz页码69| 69日小视频在线观看| 黄页在线免费看| 久久成人国产| 欧美肉大捧一进一出免费视频| 7878成人国产在线观看| 欧美日韩视频一区二区三区| 欧美在线三级电影| 黄色无遮挡网站| 日日夜夜亚洲精品| 黑鬼大战白妞高潮喷白浆| 97精品久久久中文字幕免费| 五月婷婷六月丁香综合| 国产精品综合激情| 黄色网页在线免费看| 欧美中文字幕不卡| 亚洲柠檬福利资源导航| 麻豆视频官网| 一个人免费播放在线视频看片| 欧美97人人模人人爽人人喊视频| 美女尤物在线视频| 亚洲一二三区视频在线观看| 国产麻豆永久视频| 国产女主播在线一区二区| 欧美一区三区四区| 5月丁香婷婷综合| 久久在线观看视频| 亚洲国产97在线精品一区| 日本在线播放一区二区| 日本一区二区三区四区在线视频| 欧美色欧美亚洲另类二区| 日日躁夜夜躁白天躁晚上躁91| 久久久久久久九九九九| jizz在线播放| 中文字幕乱码在线| 日本精品一区在线观看| 亚洲精美色品网站| 国产又粗又长又黄的视频| 成人18视频在线播放| 免费在线观看av片| 久久婷婷久久一区二区三区| 亚洲午夜色婷婷在线| 国产福利91精品一区二区三区| 欧洲av一区二区| eeuss影院在线播放| 国产高清自拍视频| 天天综合一区| 日韩小视频在线观看专区| 自拍偷拍亚洲| 欧美va日韩va| 天堂地址在线www| av资源久久| 国产成人精品亚洲精品| 久久九九精品视频| 中文字幕亚洲欧美日韩| 神马影院一区二区| 亚洲第一页在线观看| 中文一区在线观看| 欧美日韩在线一二三| 精品人妻中文无码av在线| 黄色成年人视频在线观看| 欧美精品一区二区三区蜜臀| 日本久久久久久久久久久| 日韩av影片在线观看| 中文字幕精品www乱入免费视频| a级毛片免费| 国产永久av在线| 一区视频网站| 精品在线91| 亚洲综合网狠久久| 日韩不卡一二三区| 久久亚洲一区二区| 国产免费观看av| 国产精品186在线观看在线播放| 国产盗摄女厕一区二区三区| 涩涩视频免费网站| 国内激情视频在线观看| 五月天中文字幕一区二区| 日韩欧美一区二区在线观看| 国产精品福利在线观看网址| 明星乱亚洲合成图.com| 欧美黄色a视频| 亚洲天天在线日亚洲洲精| 中文字幕欧美日韩在线不卡| 欧美精品一区二区蜜臀亚洲| 麻豆tv入口在线看|