看到好多項目中用到了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配置等)
3、在具體的Jsp頁面中取SESSION操作數據OpenSessionInView com....OpenSessionInView OpenSessionInView /*
用法到這裡就結束了,下邊我們來簡單討論下性能方面的問題
其實大家根據上邊的配置就可以想到:對於配置了Filter的處理,每次都會攔截到一個請求,在後台處理之前就會開啟一個事物並打開一個數據庫連接(線程安全的),後台處理完成後會關閉當前的連接。攔截到所有的請求都這麼做,大家覺得opensessioninview的方式性能會好到哪去呢?(如果是匹配某些請求,效果會好那麼一點)
畫了張opensessioninview的簡單原理圖,有點簡陋,不喜勿噴: