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

          hibernate 問題_3(鎖)

          Posted on 2007-11-26 18:57 G_G 閱讀(1101) 評論(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();
          ????}

          主站蜘蛛池模板: 华宁县| 博湖县| 牟定县| 苍山县| 阿尔山市| 阳江市| 房产| 广灵县| 前郭尔| 西乌| 盈江县| 九寨沟县| 仁化县| 高密市| 讷河市| 湾仔区| 遵义市| 兴化市| 化德县| 双流县| 长春市| 北碚区| 通化县| 焦作市| 榆中县| 西乌珠穆沁旗| 灵丘县| 塔城市| 峡江县| 嵩明县| 囊谦县| 页游| 绥滨县| 同江市| 本溪市| 清苑县| 秀山| 黄平县| 丹江口市| 临高县| 祁门县|