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

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

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

    kapok

    垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      455 隨筆 :: 0 文章 :: 76 評論 :: 0 Trackbacks
    http://forum.javaeye.com/viewtopic.php?t=4588&highlight=threadlocal




    wes109 寫道:
    ThreadLocal可以解決一定的事務問題
    但在Web應用中,我發現在filter里面close連接無疑是最合適的

    如果在其他地方close 連接,后面的調用得到的connection就是isColsed,無法再使用,如果再open一次,就不是以前的連接了,就無法保證事務了

    并且用ThreadLocal實現的也只是粗粒度的事務,尤其是在B/S應用中

    ThreadLocal,雞肋? Question


    你為什么要在其他地方close呢?

    事務的scope是在Session的scope里面的,你都已經close了Session了,當然不會在一個事務里面了。

    你怎么知道是粗粒度,那是你不會用,你就不會把Transaction也放到ThreadLocal里面,實現細粒度的事務控制嗎?貼段代碼給你參考:

    java代碼: 

    /*
    * Created on 2003-11-16
    *
    */

    package com.javaeye.crm;

    import net.sf.hibernate.HibernateException;
    import net.sf.hibernate.Session;
    import net.sf.hibernate.SessionFactory;
    import net.sf.hibernate.Transaction;
    import net.sf.hibernate.cfg.Configuration;
    import net.sf.hibernate.tool.hbm2ddl.SchemaExport;

    /**
    *
    * 獲取Session連接工廠類
    *
    * @author Robbin Fan
    *
    */

    public class HibernateSession {       
           
            private static final ThreadLocal sessionThread = new ThreadLocal();
           
            private static final ThreadLocal transactionThread = new ThreadLocal();
           
            private static SessionFactory sf = null;
           
            /**
            * 獲取當前線程使用的Session
            *
            * @return Session
            * @throws HibernateException
            */

            public static Session currentSession() throws HibernateException {       
                    Session s = (Session) sessionThread.get();               
                    if (s == null) {
                            if (sf == null) sf = new Configuration().configure().buildSessionFactory();       
                            s = sf.openSession();
                            sessionThread.set(s);               
                    }
                    return s;
            }

            /**
            * 獲取一個新的Session
            *
            * @return Session
            * @throws HibernateException
            */

            public static Session newSession() throws HibernateException {       
           
                    if (sf == null) sf = new Configuration().configure().buildSessionFactory();       
                    Session s = sf.openSession();
                    return s;
            }
                   
            /**
            * 啟動或者加入當前Session的Transaction
            *
            * @return Transaction
            * @throws HibernateException
            */

            public static Transaction currentTransaction() throws HibernateException {
                    Transaction tx = (Transaction) transactionThread.get();
                    if (tx == null) {
                            tx = currentSession().beginTransaction();
                            transactionThread.set(tx);
                    }
                    return tx;
            }
           
            /**
            * 提交當前Session的Transaction
            *
            * @throws HibernateException
            */

            public static void commitTransaction() throws HibernateException {
                    Transaction tx = (Transaction) transactionThread.get();
                    transactionThread.set(null);
                    if (tx != null) tx.commit();
            }

            /**
            * 回滾當前事務
            *
            * @throws HibernateException
            */

            public static void rollbackTransaction() throws HibernateException {
                    Transaction tx = (Transaction) transactionThread.get();
                    transactionThread.set(null);
                    if (tx != null) tx.rollback();
            }
                   
            /**
            * 關閉當前線程使用的Session
            *
            * @throws HibernateException
            */

            public static void closeSession() throws HibernateException {                       
                    Session s = (Session) sessionThread.get();               
                    sessionThread.set(null);
                    if (s != null) s.close();
            }

            /**
            * 根據映射文件和持久對象生成數據庫DDL,生成文件為create_table.sql
            *
            * @param args 參數
            */

            public static void main(String[] args) {
                    try {
                            String conf = "hibernate.cfg.xml";
                            if (args.length != 0) conf = args[0];
                            Configuration cfg = new Configuration().configure("/" + conf);
                            SchemaExport se = new SchemaExport(cfg);
                            //se.setOutputFile("create_table.sql");
                            se.create(true,true);
                    } catch (HibernateException e) {                       
                            System.out.println(e.getMessage());
                    }
                   
            }
    }



    在你的DAOImpl中,你直接:

    java代碼: 


    Session session = HibernateSession.currentSession();
    HibernateSession.currentTransaction();
    .....
    session.flush();


    事務的提交和Session的close都在Filter里面完成,Filter里面代碼如下:

    java代碼: 

                    try {
                            HibernateSession.commitTransaction();
                    } catch (HibernateException e) {               
                            try {
                                    HibernateSession.rollbackTransaction();
                            } catch (HibernateException e1) {
                                    System.out.println(e1.getMessage());
                            }       
                            System.out.println(e.getMessage());
                    } finally {
                            try {
                                    HibernateSession.closeSession();
                            } catch (HibernateException e) {
                                    System.out.println(e.getMessage());
                            }
                    }



    這是粗顆粒度的Transaction。

    如果該DAO需要一個細顆粒度的事務的話,那么你就

    java代碼: 


    Session session = HibernateSession.currentSession();
    HibernateSession.currentTransaction();
    .....
    session.flush();
    HibernateSession.commitTransaction();


    這樣就可以實現一個細顆粒度的事務,而且在該線程執行序列中,接下去的另一個方法調用也是類似:

    java代碼: 


    Session session = HibernateSession.currentSession();
    HibernateSession.currentTransaction();
    .....
    session.flush();


    這樣的代碼,而HibernateSession.currentTransaction();會自己檢查當前是否已經啟動事務,如果發現沒有啟動事務,那么就會新啟動一個事務的。

    因此,如果你需要細顆粒度的事務的話,就在你方法里面
    java代碼: 

    HibernateSession.commitTransaction();

    如果你不需要細顆粒度事務的話,就不寫這句代碼就OK了,最后Filter會提交。
    posted on 2005-03-15 20:16 笨笨 閱讀(935) 評論(0)  編輯  收藏 所屬分類: HibernateAndSpringALL
    主站蜘蛛池模板: 国产无遮挡色视频免费视频| 成人黄色免费网站| 国产成人麻豆亚洲综合无码精品| 亚洲日韩亚洲另类激情文学| 国产在线jyzzjyzz免费麻豆| 亚洲视频在线观看免费视频| 精品熟女少妇av免费久久| 亚洲黄色网址在线观看| 永久免费在线观看视频| 亚洲人成片在线观看| 性色av无码免费一区二区三区| 亚洲色偷精品一区二区三区| 国产免费啪嗒啪嗒视频看看| 有码人妻在线免费看片| 亚洲中文字幕在线观看| 一区二区三区四区免费视频| 亚洲精品在线网站| 四虎www免费人成| 特级毛片免费观看视频| 国产亚洲一区区二区在线| 久久精品国产这里是免费| 亚洲国产日韩在线成人蜜芽| 卡一卡二卡三在线入口免费| 一区二区视频在线免费观看| 亚洲大尺度无码无码专区| 一二三四影视在线看片免费| 精品国产日韩亚洲一区91| 亚洲一区AV无码少妇电影☆| ww在线观视频免费观看| 精品国产亚洲一区二区三区在线观看| 亚洲综合无码精品一区二区三区| 久久国产免费观看精品3| 亚洲欧洲无码AV不卡在线| 国产乱辈通伦影片在线播放亚洲| 98精品全国免费观看视频| 亚洲日产乱码一二三区别| 亚洲午夜久久久久久久久电影网| 1区2区3区产品乱码免费| 亚洲av日韩专区在线观看| 久久精品国产亚洲麻豆| 国语成本人片免费av无码|