<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 165, comments - 198, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    hibernate 問題_3(鎖)

    Posted on 2007-11-26 18:57 G_G 閱讀(1099) 評論(0)  編輯  收藏 所屬分類: hibernate
    環境:
    ???? private ?SessionFactory?sessionFactory;

    ????
    protected ? void ?setUp()? throws ?Exception?{
    ????????
    super .setUp();
    ????????
    // 利用java反射得到?HibernateSessionFactory?->
    ????????
    // private??static?org.hibernate.SessionFactory?sessionFactory;
    ????????
    // 要模擬?并發?要?HibernateSessionFactory?得出的?有?threadLocal?不行?
    ????????
    // 要?
    ????????HibernateSessionFactory.currentSession();
    ????????HibernateSessionFactory.closeSession();
    ????????Field?field?
    = ?HibernateSessionFactory. class .getDeclaredField( " sessionFactory " );
    ????????field.setAccessible(
    true );
    ????????sessionFactory?
    = ?(SessionFactory)?field.get(HibernateSessionFactory. class );
    ????}

    ????
    protected ? void ?tearDown()? throws ?Exception?{
    ????????
    super .tearDown();
    ????}

    悲觀鎖:
    ???? /** ?悲觀鎖問題?線程模擬?并發?
    ?????*?Table?->?T1oo(id,name)
    ?????*?????+----+------+
    ?????*????|?id?|?name?|
    ?????*????+----+------+
    ?????*????|??4?|?xx1??|
    ?????*????+----+------+
    ?????
    */
    ????
    public ? void ?ctestLock()? throws ?Exception?{
    ????????
    // ?insert?test?Data 測試數據
    ????????Session?seInsert? = ?sessionFactory.openSession();
    ????????Transaction?tr?
    = ?seInsert.beginTransaction();
    ????????T1oo?testUse?
    = ?testUse? = ? new ?T1oo();
    ????????testUse.setName(
    " liukaiyi_test " );
    ????????seInsert.save(testUse);
    ????????tr.commit();
    ????????System.out.println(?
    " **************Test?Use?Bean?:?insert******************* " ?);
    ????????seInsert.close();
    ????????Integer?testId?
    = ?testUse.getId();
    ????????
    ??????? //并發模擬
    ????????Session?session1?
    = ?sessionFactory.openSession();
    ????????Session?session2?
    = ?sessionFactory.openSession();
    ????????
    ????????
    final ?Transaction?tr1? = ?session1.beginTransaction();
    ????????Transaction?tr2?
    = ?session2.beginTransaction();
    ????????
    ????????Query?qu1?
    = ?session1.createQuery( " ?from?T1oo?t1oo?where?t1oo.name='liukaiyi_test' " );
    ????????Query?qu2?
    = ?session2.createQuery( " ?from?T1oo?t1oo?where?t1oo.name='liukaiyi_test' " );
    ????????
    ??????? //加悲觀鎖
    ????????qu1.setLockMode(
    " t1oo " ,LockMode.UPGRADE);
    ????????
    final ?Object?bean1? = ?qu1.uniqueResult();
    ????????Object?bean2?
    = ?qu2.uniqueResult();

    ????????T1oo?t1oo2?
    = ?(T1oo)bean2;
    ????????
    ????????t1oo2.setName(
    " run1 " );
    ????????
    ????????
    new ?Thread(
    ????????????????
    new ?Runnable(){
    ????????????????????
    public ? void ?run()??{
    ????????????????????????
    try ?{
    ????????????????????????????System.out.println(?
    " ********解鎖準備********* " ?);
    ????????????????????????????Thread.sleep(
    10 * 1000 );
    ????????????????????????????T1oo?t1oo1?
    = ?(T1oo)bean1;
    ????????????????????????????t1oo1.setName(
    " run2 " );
    ????????????????????????????tr1.commit();
    ????????????????????????????System.out.println(?
    " ********解鎖成功t********* " ?);
    ????????????????????????}?
    catch ?(InterruptedException?e)?{e.printStackTrace();}
    ????????????????????}
    ????????????????}
    ????????).start();

    ???????
    / /這里會 等待十秒后 tr1解鎖 /
    ????????tr2.commit();
    ????????
    ????????session1.close();
    ????????session2.close();
    ????????
    ????????
    ????????
    // ?delete?Test?Date 刪除測試數據
    ????????Session?seDelete? = ?sessionFactory.openSession();
    ????????Transaction?trD?
    = ?seDelete.beginTransaction();
    ????????Object?obj?
    = ?seDelete.createQuery( " ?from?T1oo?t?where?t.id=:id? " ).
    ????????????????????????setInteger(
    " id " ,testId.intValue()).
    ????????????????????????uniqueResult();
    ????????seDelete.delete(obj);
    ????????trD.commit();
    ????????System.out.println(?
    " **************Test?Use?Bean?:?delete************** " ?);
    ????????seDelete.close();
    ????}

    樂觀鎖:
    ???? /** ?樂觀鎖問題
    ?????*?Table?->?T1oo(id,name)
    ?????*?T2oo.hbn.xml?<class>?+>?optimistic-lock="version"
    ?????*?id下面?+>?<version?name="version"?type="integer"?column="version"?/>
    ?????*????+---------+---------+------+
    ?????*????|?Field???|?Type????|?Null?|
    ?????*????+---------+---------+------+
    ?????*????|?id??????|?int(11)?|??????|
    ?????*????|?avg?????|?int(11)?|??????|
    ?????*????|?aid?????|?int(11)?|?YES??|
    ?????*????|?version?|?int(11)?|?YES??|
    ?????*????+---------+---------+------+
    ?????*??注意:要在數據庫中多加一列?
    ?????*??mysql>?alter?table?T2OO?add?version?int;
    ?????
    */
    ????
    public ? void ?testOpLock() throws ?Exception{
    ??????? //添加測試數據
    ????????Session?session?
    = ?sessionFactory.openSession();
    ????????Transaction?trI?
    = ?session.beginTransaction();
    ????????Connection?conn?
    = ?session.connection();
    ????????T2oo?t2oo?
    = ? new ?T2oo();
    ????????T1oo?t1oo?
    = new ?T1oo( " t1ooOpLock " );
    ????????t1oo.setT2ooSet(
    new ?HashSet());
    ????????t2oo.setAvg(
    new ?Integer( 23 ));????
    ????????t2oo.setT1oo(t1oo);
    ????????t1oo.getT2ooSet().add(t2oo);
    ????????session.save(t2oo);
    ????????trI.commit();
    ????????session.clear();
    ????????session.close();

    ??????? //并發模擬
    ????????Session?se1?
    = ?sessionFactory.openSession();
    ????????Session?se2?
    = ?sessionFactory.openSession();
    ????????
    ????????Transaction?tr1?
    = ?se1.beginTransaction();
    ????????Transaction?tr2?
    = ?se2.beginTransaction();
    ???????
    ????????T1oo?obj1?
    = ?(T1oo)se1.load(T1oo. class , new ?Integer( 1 ));
    ????????T1oo?obj2?
    = ?(T1oo)se2.load(T1oo. class , new ?Integer( 1 ));
    ????????
    ????????((T2oo)obj1.getT2ooSet().iterator().next()).setAvg(
    new ?Integer( 9 ));
    ????????((T2oo)obj2.getT2ooSet().iterator().next()).setAvg(
    new ?Integer( 10 ));
    ????????????????
    ????????tr1.commit();
    ????????
    ????????
    try ?{
    ????????????tr2.commit();
    ????????}?
    catch ?(Exception?e)?{
    ????????????se2.clear();
    ????????????tr2.commit();
    ????????????
    // tr2報錯
    ????????} finally {
    ????????????se1.close();
    ????????????se2.close();
    ????????}
    ????????
    ????????
    ??????? //測試數據刪除
    ????????Session?dele?
    = ?sessionFactory.openSession();
    ????????Transaction?tr?
    = ?dele.beginTransaction();
    ????????dele.delete(obj1);
    ????????tr.commit();
    ????????dele.close();
    ????????
    ????????HibernateSessionFactory.closeSession();
    ????}

    主站蜘蛛池模板: free哆拍拍免费永久视频| 亚洲日韩国产一区二区三区在线| 特级毛片aaaa级毛片免费| 男女啪啪永久免费观看网站| 亚洲欧美自偷自拍另类视| 在线免费观看中文字幕| 亚洲色欲色欱wwW在线| 卡1卡2卡3卡4卡5免费视频| 亚洲AV无码一区二区乱子仑| 全免费a级毛片免费**视频| 亚洲AV成人无码网站| 日韩亚洲国产综合久久久| 国产免费久久久久久无码| 亚洲中文字幕在线乱码| 99在线观看精品免费99| 亚洲乱码在线观看| 国产成人免费a在线资源| 在线播放国产不卡免费视频| 亚洲gv猛男gv无码男同短文| 84pao国产成视频免费播放| 亚洲a级成人片在线观看| 成年18网站免费视频网站| 青娱乐在线免费观看视频| 自拍偷自拍亚洲精品情侣| 5555在线播放免费播放| 亚洲另类无码一区二区三区| 亚洲精品无码久久久| 久久免费福利视频| 亚洲日韩一区二区三区| 亚洲人成无码网WWW| 4399影视免费观看高清直播| 亚洲天然素人无码专区| 三上悠亚亚洲一区高清| 99久久久国产精品免费无卡顿| 久久无码av亚洲精品色午夜| 亚洲一区AV无码少妇电影☆| 福利免费观看午夜体检区| 久久精品免费网站网| 亚洲日本国产综合高清| 亚洲综合伊人久久大杳蕉| 国拍在线精品视频免费观看|