hibernate session统一管理的配备

hibernate session统一管理的配置

 

public class FlushedOpenSessionInViewFilter extends OpenSessionInViewFilter {
	protected void doFilterInternal(HttpServletRequest request,
			HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		logger.debug("FIX ME!!!access FlushedOpenSessionInViewFilter");
		SessionFactory sessionFactory = lookupSessionFactory(request);
		Session session = null;
		boolean participate = false;

		if (isSingleSession()) {
			// single session mode
			logger.debug("FIX ME!!!Single Hibernate Session");
			if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
				// Do not modify the Session: just set the participate flag.
				try {
					logger.debug("FIX ME!!!begin unbind sessionFactory");
					TransactionSynchronizationManager
							.unbindResource(sessionFactory);
					logger.debug("FIX ME!!!end unbind sessionFactory");
					
					if (TransactionSynchronizationManager.hasResource(lookupDataSource()))
					{
						logger.debug("FIX ME!!!begin unbind DataSource");
						TransactionSynchronizationManager.unbindResource(lookupDataSource());
						logger.debug("FIX ME!!!end unbind DataSource");
					}
					
					logger.debug("FIX ME!!!begin close hibernate session");
					closeSession(session, sessionFactory);
					logger.debug("FIX ME!!!end close hibernate session");
				} catch (Exception e) {
					logger.error("FIX ME!!!unbind sessionFactory error",e);
				}
			}
			logger.debug("FIX ME!!!begin opening single Hibernate session");
			session = getSession(sessionFactory);
			logger.debug("FIX ME!!!end opening single Hibernate session");
			
			if (!TransactionSynchronizationManager.hasResource(sessionFactory)){
				logger.debug("FIX ME!!!begin binding session");			
				TransactionSynchronizationManager.bindResource(sessionFactory,
					new SessionHolder(session));
				logger.debug("FIX ME!!!end binding session");
			}
		} else {
			// deferred close mode
			logger.debug("FIX ME!!!not single hibernate session");
			if (SessionFactoryUtils.isDeferredCloseActive(sessionFactory)) {
				// Do not modify deferred close: just set the participate flag.
				participate = true;
			} else {
				SessionFactoryUtils.initDeferredClose(sessionFactory);
			}
		}

		try {
			logger.debug("FIX ME!!!Now filter in FlushedOpenSessionInViewFilter");
			filterChain.doFilter(request, response);
			logger.debug("FIX ME!!!FlushedOpenSessionInViewFilter filter OK! ");
		} catch (Exception e) {
			logger.error("FIX ME!!!FlushedOpenSessionInViewFilter error",e);
		}finally {
			logger.debug("FIX ME!!!FlushedOpenSessionInViewFilter clean session ");
			if (!participate) {
				if (isSingleSession()) {
					// single session mode
					try {
						logger.debug("FIX ME!!!unbind sessionFactory in OpenSessionInViewFilter");
						TransactionSynchronizationManager
								.unbindResource(sessionFactory);
						
						/*if (TransactionSynchronizationManager.hasResource(lookupDataSource()))
						{
							logger.debug("FIX ME!!!Unbind DataSource in OpenSessionInViewFilter");
							TransactionSynchronizationManager.unbindResource(lookupDataSource());
						}*/
						
						logger.debug("FIX ME!!!Closing single Hibernate session in OpenSessionInViewFilter");
						closeSession(session, sessionFactory);
					} catch (Exception e) {
						logger.debug("FIX ME!!!unbind sessionFactory error",e);
					}
				} else {
					// deferred close mode
					SessionFactoryUtils.processDeferredClose(sessionFactory);
				}
			}
			logger.debug("FIX ME!!!FlushedOpenSessionInViewFilter END ");
		}
	}

	protected void closeSession(Session arg0, SessionFactory arg1) {
		arg0.flush();
		super.closeSession(arg0, arg1);
	}
	
	protected DataSource lookupDataSource() {
		String dataSourceBeanName = "dataSource";
		WebApplicationContext wac =
				WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
		return (DataSource) wac.getBean(dataSourceBeanName, DataSource.class);
	}
}

 <filter>

		<filter-name>hibernateFilter</filter-name>
		<filter-class>
			cn.com.superv.netmessage.util.FlushedOpenSessionInViewFilter
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>hibernateFilter</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>hibernateFilter</filter-name>
		<url-pattern>/dwr/*</url-pattern>
	</filter-mapping>