程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> openSessionInView的使用原理及性能分析

openSessionInView的使用原理及性能分析

編輯:關於JSP

看到好多項目中用到了openSessionInView,這樣的做法無非是開發方便,可以在JSP頁面中操作數據庫層方面的業務。下邊說下openSessionInView的用法及性能問題。

使用:

1、增加一個Filter,該Filter用來控制事務及數據庫的連接管理,代碼如下:

SessionFactory sessionFactory = lookupSessionFactory(request);  
Session session = null;  
boolean participate = false;  
      
if (isSingleSession()) {  
    // single session mode  
    if (TransactionSynchronizationManager.hasResource(sessionFactory)) {  
    // Do not modify the Session: just set the participate flag.  
    participate = true;  
       }    else {  
    logger.debug("Opening single Hibernate Session in OpenSessionInViewFilter");  
    session = getSession(sessionFactory);  
    TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));  
    }  
} else {  
    // deferred close mode  
    if (SessionFactoryUtils.isDeferredCloseActive(sessionFactory)) {  
// Do not modify deferred close: just set the participate flag.  
    participate = true;  
    } else {  
    SessionFactoryUtils.initDeferredClose(sessionFactory);  
    }  
}  
      
try {  
    filterChain.doFilter(request, response);  
} finally {  
    if (!participate) {  
            if (isSingleSession()) {  
                // single session mode  
        TransactionSynchronizationManager.unbindResource(sessionFactory);  
        logger.debug("Closing single Hibernate Session in OpenSessionInViewFilter");  
        closeSession(session, sessionFactory);  
    }else {  
        // deferred close mode  
        SessionFactoryUtils.processDeferredClose(sessionFactory);  
    }  
}  
}

當前代碼中只是個例子,具體需要參考自己項目中的實際情況(spring配置,hibernate配置等)
2、在web.xml中增加該Filter的配置信息

<filter>  
    <filter-name>OpenSessionInView</filter-name>  
    <filter-class>com....OpenSessionInView</filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>OpenSessionInView</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>

3、在具體的Jsp頁面中取SESSION操作數據

用法到這裡就結束了,下邊我們來簡單討論下性能方面的問題

其實大家根據上邊的配置就可以想到:對於配置了Filter的處理,每次都會攔截到一個請求,在後台處理之前就會開啟一個事物並打開一個數據庫連接(線程安全的),後台處理完成後會關閉當前的連接。攔截到所有的請求都這麼做,大家覺得opensessioninview的方式性能會好到哪去呢?(如果是匹配某些請求,效果會好那麼一點)

畫了張opensessioninview的簡單原理圖,有點簡陋,不喜勿噴:

作者:csdn博客 楓飄瞬間

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved