HibernateDaoSupport getSession()不能释放资源的问题及解决方法
??? 根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:
??? 第一种方式:每个Bean都有一个代理
- <?xml?version="1.0"?encoding="UTF-8"?>?? <beans?xmlns="http://www.springframework.org/schema/beans"??
- ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?? ????xmlns:context="http://www.springframework.org/schema/context"??
- ????xmlns:aop="http://www.springframework.org/schema/aop"?? ????xsi:schemaLocation="http://www.springframework.org/schema/beans? ??
- ???????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ?? ???????????http://www.springframework.org/schema/context ??
- ???????????http://www.springframework.org/schema/context/spring-context-2.5.xsd ?? ???????????http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">??
- ?? ????<bean?id="sessionFactory"?? ??
- ????????????class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">?? ?? ????????<property?name="configLocation"?value="classpath:hibernate.cfg.xml"?/>?? ??
- ????????<property?name="configurationClass"?value="org.hibernate.cfg.AnnotationConfiguration"?/>?? ????</bean>?? ??
- ?? ????<!--?定义事务管理器(声明式的事务)?-->?? ??
- ????<bean?id="transactionManager"?? ????????class="org.springframework.orm.hibernate3.HibernateTransactionManager">??
- ????????<property?name="sessionFactory"?ref="sessionFactory"?/>?? ????</bean>??
- ???? ?? ????<!--?配置DAO?-->??
- ????<bean?id="userDaoTarget"?class="com.bluesky.spring.dao.UserDaoImpl">?? ????????<property?name="sessionFactory"?ref="sessionFactory"?/>??
- ????</bean>?? ???? ??
- ????<bean?id="userDao"?? ?? ????????class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">?? ??
- ???????????<!--?配置事务管理器?-->?? ?? ???????????<property?name="transactionManager"?ref="transactionManager"?/>????? ??
- ????????<property?name="target"?ref="userDaoTarget"?/>?? ?? ?????????<property?name="proxyInterfaces"?value="com.bluesky.spring.dao.GeneratorDao"?/>??
- ????????<!--?配置事务属性?-->?? ?? ????????<property?name="transactionAttributes">?? ??
- ????????????<props>?? ?? ????????????????<prop?key="*">PROPAGATION_REQUIRED</prop>??
- ????????????</props>?? ?? ????????</property>?? ??
- ????</bean>?? ?? </beans>??
??? 第二种方式:所有Bean共享一个代理基类
- <?xml?version="1.0"?encoding="UTF-8"?>?? <beans?xmlns="http://www.springframework.org/schema/beans"??
- ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?? ????xmlns:context="http://www.springframework.org/schema/context"??
- ????xmlns:aop="http://www.springframework.org/schema/aop"?? ????xsi:schemaLocation="http://www.springframework.org/schema/beans? ??
- ???????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ?? ???????????http://www.springframework.org/schema/context ??
- ???????????http://www.springframework.org/schema/context/spring-context-2.5.xsd ?? ???????????http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">??
- ?? ????<bean?id="sessionFactory"?? ??
- ????????????class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">?? ?? ????????<property?name="configLocation"?value="classpath:hibernate.cfg.xml"?/>?? ??
- ????????<property?name="configurationClass"?value="org.hibernate.cfg.AnnotationConfiguration"?/>?? ????</bean>?? ??
- ?? ????<!--?定义事务管理器(声明式的事务)?-->?? ??
- ????<bean?id="transactionManager"?? ????????class="org.springframework.orm.hibernate3.HibernateTransactionManager">??
- ????????<property?name="sessionFactory"?ref="sessionFactory"?/>?? ????</bean>??
- ???? ?? ????<bean?id="transactionBase"?? ??
- ????????????class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"?? ?? ????????????lazy-init="true"?abstract="true">?? ??
- ????????<!--?配置事务管理器?-->?? ?? ????????<property?name="transactionManager"?ref="transactionManager"?/>?? ??
- ????????<!--?配置事务属性?-->?? ?? ????????<property?name="transactionAttributes">?? ??
- ????????????<props>?? ?? ????????????????<prop?key="*">PROPAGATION_REQUIRED</prop>?? ??
- ????????????</props>?? ?? ????????</property>?? ??
- ????</bean>???? ?? ??? ??
- ????<!--?配置DAO?-->?? ????<bean?id="userDaoTarget"?class="com.bluesky.spring.dao.UserDaoImpl">??
- ????????<property?name="sessionFactory"?ref="sessionFactory"?/>?? ????</bean>??
- ???? ?? ????<bean?id="userDao"?parent="transactionBase"?>?? ??
- ????????<property?name="target"?ref="userDaoTarget"?/>??? ?? ????</bean>??
- </beans>?? ??
第三种方式:使用拦截器
- <?xml?version="1.0"?encoding="UTF-8"?>?? <beans?xmlns="http://www.springframework.org/schema/beans"??
- ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?? ????xmlns:context="http://www.springframework.org/schema/context"??
- ????xmlns:aop="http://www.springframework.org/schema/aop"?? ????xsi:schemaLocation="http://www.springframework.org/schema/beans? ??
- ???????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ?? ???????????http://www.springframework.org/schema/context ??
- ???????????http://www.springframework.org/schema/context/spring-context-2.5.xsd ?? ???????????http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">??
- ?? ????<bean?id="sessionFactory"?? ??
- ????????????class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">?? ?? ????????<property?name="configLocation"?value="classpath:hibernate.cfg.xml"?/>?? ??
- ????????<property?name="configurationClass"?value="org.hibernate.cfg.AnnotationConfiguration"?/>?? ????</bean>?? ??
- ?? ????<!--?定义事务管理器(声明式的事务)?-->?? ??
- ????<bean?id="transactionManager"?? ????????class="org.springframework.orm.hibernate3.HibernateTransactionManager">??
- ????????<property?name="sessionFactory"?ref="sessionFactory"?/>?? ????</bean>? ??
- ??? ?? ????<bean?id="transactionInterceptor"?? ??
- ????????class="org.springframework.transaction.interceptor.TransactionInterceptor">?? ?? ????????<property?name="transactionManager"?ref="transactionManager"?/>?? ??
- ????????<!--?配置事务属性?-->?? ?? ????????<property?name="transactionAttributes">?? ??
- ????????????<props>?? ?? ????????????????<prop?key="*">PROPAGATION_REQUIRED</prop>?? ??
- ????????????</props>?? ?? ????????</property>?? ??
- ????</bean>?? ?????? ??
- ????<bean?class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">?? ?? ????????<property?name="beanNames">?? ??
- ????????????<list>?? ?? ????????????????<value>*Dao</value>??
- ????????????</list>?? ?? ????????</property>?? ??
- ????????<property?name="interceptorNames">?? ?? ????????????<list>?? ??
- ????????????????<value>transactionInterceptor</value>?? ?? ????????????</list>?? ??
- ????????</property>?? ?? ????</bean>?? ??
- ?? ?? ????<!--?配置DAO?-->??
- ????<bean?id="userDao"?class="com.bluesky.spring.dao.UserDaoImpl">?? ????????<property?name="sessionFactory"?ref="sessionFactory"?/>??
- ????</bean>?? </beans>??
- ??
第四种方式:使用tx标签配置的拦截器
- <?xml?version="1.0"?encoding="UTF-8"?>?? <beans?xmlns="http://www.springframework.org/schema/beans"??
- ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?? ????xmlns:context="http://www.springframework.org/schema/context"??
- ????xmlns:aop="http://www.springframework.org/schema/aop"?? ????xmlns:tx="http://www.springframework.org/schema/tx"??
- ????xsi:schemaLocation="http://www.springframework.org/schema/beans? ?? ???????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ??
- ???????????http://www.springframework.org/schema/context ?? ???????????http://www.springframework.org/schema/context/spring-context-2.5.xsd ??
- ???????????http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-2.5.xsd ?? ???????????http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">??
- ?? ????<context:annotation-config?/>??
- ????<context:component-scan?base-package="com.bluesky"?/>?? ??
- ????<bean?id="sessionFactory"?? ?? ????????????class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">?? ??
- ????????<property?name="configLocation"?value="classpath:hibernate.cfg.xml"?/>?? ?? ????????<property?name="configurationClass"?value="org.hibernate.cfg.AnnotationConfiguration"?/>??
- ????</bean>?? ?? ??
- ????<!--?定义事务管理器(声明式的事务)?-->?? ?? ????<bean?id="transactionManager"??
- ????????class="org.springframework.orm.hibernate3.HibernateTransactionManager">?? ????????<property?name="sessionFactory"?ref="sessionFactory"?/>??
- ????</bean>?? ??
- ????<tx:advice?id="txAdvice"?transaction-manager="transactionManager">?? ????????<tx:attributes>??
- ????????????<tx:method?name="*"?propagation="REQUIRED"?/>?? ????????</tx:attributes>??
- ????</tx:advice>?? ???? ??
- ????<aop:config>?? ????????<aop:pointcut?id="interceptorPointCuts"??
- ????????????expression="execution(*?com.bluesky.spring.dao.*.*(..))"?/>?? ????????<aop:advisor?advice-ref="txAdvice"??
- ????????????pointcut-ref="interceptorPointCuts"?/>???????? ?? ????</aop:config>?????? ??
- </beans>?? ??
第五种方式:全注解
- <?xml?version="1.0"?encoding="UTF-8"?>?? <beans?xmlns="http://www.springframework.org/schema/beans"??
- ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?? ????xmlns:context="http://www.springframework.org/schema/context"??
- ????xmlns:aop="http://www.springframework.org/schema/aop"?? ????xmlns:tx="http://www.springframework.org/schema/tx"??
- ????xsi:schemaLocation="http://www.springframework.org/schema/beans? ?? ???????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ??
- ???????????http://www.springframework.org/schema/context ?? ???????????http://www.springframework.org/schema/context/spring-context-2.5.xsd ??
- ???????????http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-2.5.xsd ?? ???????????http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">??
- ?? ????<context:annotation-config?/>??
- ????<context:component-scan?base-package="com.bluesky"?/>?? ??
- ????<tx:annotation-driven?transaction-manager="transactionManager"/>?? ??
- ????<bean?id="sessionFactory"?? ?? ????????????class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">?? ??
- ????????<property?name="configLocation"?value="classpath:hibernate.cfg.xml"?/>?? ?? ????????<property?name="configurationClass"?value="org.hibernate.cfg.AnnotationConfiguration"?/>??
- ????</bean>?? ?? ??
- ????<!--?定义事务管理器(声明式的事务)?-->?? ?? ????<bean?id="transactionManager"??
- ????????class="org.springframework.orm.hibernate3.HibernateTransactionManager">?? ????????<property?name="sessionFactory"?ref="sessionFactory"?/>??
- ????</bean>?? ???? ??
- </beans>?? ??
此时在DAO上需加上@Transactional注解,如下:
- package?com.bluesky.spring.dao; ?? ??
- import?java.util.List; ?? ??
- import?org.hibernate.SessionFactory; ?? import?org.springframework.beans.factory.annotation.Autowired; ??
- import?org.springframework.orm.hibernate3.support.HibernateDaoSupport; ?? import?org.springframework.stereotype.Component; ??
- ?? import?com.bluesky.spring.domain.User; ??
- ?? @Transactional??
- @Component("userDao") ?? public?class?UserDaoImpl?extends?HibernateDaoSupport?implements?UserDao?{ ??
- ?? ????public?List<User>?listUsers()?{ ??
- ????????return?this.getSession().createQuery("from?User").list(); ?? ????} ??
- ???? ?? ???? ??
- } ?? ??