论坛首页 Java版 Spring

Spring在webapp中的声明事务

浏览 2369 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2006-06-28
struts+spring+hibernate+oracle9i,部署在tomcat中。
DataSource使用了dbcp得simple datasource,在spring中配置注射。
使用了spring的declarative transaction demarcation 在business service 的方法上。
transaction attributes使用了PROPAGATION_REQUIRED.

在实际得整合测试中,同样的请求几次之后,就会出现无法打开hibernate session,因为pool中jdbc connection都在占用,这些信息是在打开spring logging看到的。

从log得信息来分析,是每次request过来,spring都没有最终release jdbc connection to pool. 只是做了commit.

可如果把transaction attributes换成PROPAGATION_NOT_SUPPORTED,就不会出现这样的状况。每次都从LOG中看到RETURN THE CONNECTION.

试过其它的propagation,都不work.只有not supported可以的。

这是为什么呢?有人遇到过么?
   
最后更新时间:2006-06-30
花了些时间研究,可是还没有头绪,不清楚为什么最后事务提交的时候没有归还这个connection...
   
0 请登录后投票
最后更新时间:2006-06-30
贴一下目前的部分config . 现在用的是Not_Supported.
[code:1]<!--Data Source -->
<bean id="userDataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="oracle.jdbc.OracleDriver" />
<property name="url"
value="XX" />
<property name="XX" value="XX" />
<property name="XX" value="XX" />
<property name="initialSize" value="10" />
<property name="maxActive" value="15" />
</bean>

<bean id="trackingDataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="oracle.jdbc.OracleDriver" />
<property name="url"
value="XXX" />
<property name="username" value="XX" />
<property name="password" value="XX" />
<property name="initialSize" value="10" />
<property name="maxActive" value="15" />
</bean>

<!-- JNDI DataSource for J2EE environments -->
<!--
<bean id="userDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/devuser"/>
</bean>

-->

<!-- Session Factory -->
<bean id="userSessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="userDataSource" />

<property name="mappingResources">
<list>
<value>FavoriteCategory.hbm.xml</value>
<value>PasswordReminder.hbm.xml</value>
<value>User.hbm.xml</value>

<value>UserFavorites.hbm.xml</value>

<value>UserInfo.hbm.xml</value>
<value>UserPicture.hbm.xml</value>
<value>UserPwdReminder.hbm.xml</value>
</list>
</property>
                                <property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
</props>
</property>
</bean>
                <bean id="userDAO"
class="persistence.dao.hibernate.UserDAOImpl">
<property name="sessionFactory" ref="userSessionFactory" />
</bean>
[/code:1]

[code:1]
<bean id="userTransactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager"
ref="userTransactionManager" />
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_NOT_SUPPORTED</prop>
<prop key="find*">PROPAGATION_NOT_SUPPORTED,readOnly</prop>
</props>
</property>
</bean>

<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>*Service</value>
</property>
<property name="interceptorNames">
<list>
<value>userTransactionInterceptor</value>

</list>
</property>
</bean>
<bean
class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<property name="transactionInterceptor"
ref="userTransactionInterceptor" />
</bean>
<bean id="userService"
class="service.impl.RegistrationServiceImpl" autowire="byName">
<property name="userDAO" ref="userDAO" />

</bean>[/code:1]
[code:1][/code:1]
   
0 请登录后投票
最后更新时间:2006-07-02
猜测可能是spring和hibernate版本间的问题, 准备试试看低版本的hibernate,比如3.0或者spring 1.2.4.或者使用cp30的datasource来试试看.

从log看,session的确是close了,只是session close之后的jdbc connection没有release出来给datasource
   
0 请登录后投票
最后更新时间:2006-07-10
的确是版本的问题,把hibernate 3.1rc2换成3.1.3问题消失...
   
0 请登录后投票
最后更新时间:2006-07-11
声明事务与使用模版的编程事务效率相差不大!前者性能低下!灵活性低!
   
0 请登录后投票
最后更新时间:2006-07-11
说实话,这种第三方开源的东西会给开发工作带来方便,但是有时候确实会带来很“恶心”的兼容性问题,前一段时间我在tomcat下使用dom4j就遇到过这种情况,最后,偶不得不放弃dom4j,自己手工写,唉。
   
0 请登录后投票
论坛首页 Java版 Spring

跳转论坛:
JavaEye推荐