论坛首页 Java企业应用论坛

求助,Spring+Hibernate连接池无法释放问题,贴出详细代码

浏览 13093 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-11-03  
目前在做一项目,用了一些流行的开源框架,
Jdk1.4.2.03, Tomcat4.1.30
Webwork 2.1.7 + Spring 1.2.7 + Hibernate3.1, 但是现在遇到一个非常不解的问题
先附上源代码:

数据源:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
	<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
	<property name="jdbcUrl" value="jdbc:oracle:thin:@10.0.0.5:1521:xxxxxx"/>
	<property name="properties"> 
	<props> 
		<prop key="c3p0.minPoolSize">2</prop> 
		<prop key="hc3p0.maxPoolSize">10</prop> 
		<prop key="user">xxxx</prop> 
		<prop key="password">xxxx</prop> 
	</props> 
	</property> 
</bean>


事务管理器:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	<property name="sessionFactory">
		<ref bean="sessionFactory" />
	</property>
</bean>


事务机制:
<bean id="txProxyTemplate" abstract="true"  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
	<property name="transactionManager">
		<ref bean="transactionManager"/>
	</property>
	<property name="transactionAttributes">
	<props>
		<prop key="create*">PROPAGATION_REQUIRED</prop>
		<prop key="select*">PROPAGATION_REQUIRED,readOnly</prop>
	</props>
	</property>
</bean>


将DataSource注入JdbcDaoSupport:
<bean id="jdbcUtil" class="com.x.ocn.yz.util.JdbcUtil">
	<property name="dataSource" ref="dataSource"/>
</bean>


service注入ServiceLocator
<bean id="setExampleService" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="com.x.example.service.ServiceLocator"/>
<property name="targetMethod"><value>setExampleService</value></property>
<property name="arguments"><ref bean="exampleServiceProxy" /></property>
</bean>



其他WEB层及Service层的配置暂时略去,节省篇幅。
我做了一个列表,方法名为selectXXXX(),URL为XXXListAction.action,发现每次重启Tomcat后执行XXXListAction.action,刷新maxPoolSize+1次后Tomcat就死了.然后查看oracle的DBA Studio发现有10个InActive的线程还在,我的第一反映可能是每次查询都要从连接池得到一个新的Connection而之前Connection的还未释放, 换了个DBCP连接池, 结果一样, 所以我首先排除了连接池的问题.

之后我怀疑是事务管理器的问题, 所以我将HibernateTransactionManager换成DataSourceTransactionManager重新注入txProxyTemplate, 然后重启Tomcat执行XXXListAction.action,连接池无恙,观察DBA Studio发现只有3个InActive的线程, 说明连接池其了作用, DataSource不再是新建一个Connection而是激活原来的Inactive线程,
因为我的项目可能会Hibernate和JDBC混用, 所以必须用HibernateTransactionManager,但是我无法确认是否HibernateTransactionManager的问题

所以现在只能出一下策,暂时将事务策略改了一下<prop key="select*">PROPAGATION_REQUIRED,readOnly</prop>改成
<prop key="select*">PROPAGATION_NOT_SUPPORTED</prop>, select*方法以非事务方式执行, 这样也不会耗光连接池.

为什么会发生这样的状况,请教...
   发表时间:2006-11-04  
c3p0我碰到过在单元测试里进行循环测试时,一对多的关系,插入到第15条时停住了。
但是你说的测试过c3p0与DBCP都是差不多一样的情况,那就试一下不用连接池看是什么情况。

	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName" value="${jdbc.driverClassName}"/>
	<property name="url" value="${jdbc.url}"/>
	<property name="username" value="${jdbc.username}"/>
	<property name="password" value="${jdbc.password}"/>
	</bean>


上面的配置是每次都得到一个新的连接。
0 请登录后投票
   发表时间:2006-11-04  
你的dao查询代码是怎么写的?
0 请登录后投票
   发表时间:2006-11-04  
YuLimin 写道
c3p0我碰到过在单元测试里进行循环测试时,一对多的关系,插入到第15条时停住了。
但是你说的测试过c3p0与DBCP都是差不多一样的情况,那就试一下不用连接池看是什么情况。

	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName" value="${jdbc.driverClassName}"/>
	<property name="url" value="${jdbc.url}"/>
	<property name="username" value="${jdbc.username}"/>
	<property name="password" value="${jdbc.password}"/>
	</bean>


上面的配置是每次都得到一个新的连接。


不用连接池后来测试过,没有问题
0 请登录后投票
   发表时间:2006-11-04  
dwangel 写道
你的dao查询代码是怎么写的?


查询方法就是用JDBCTemplate最简单的queryForList()
0 请登录后投票
   发表时间:2006-11-04  
光跑单元测试是否会发生无法释放的问题?
方便的话项目一起打包发上来看看。
0 请登录后投票
   发表时间:2006-11-05  
恩,我觉得应该是配置中对select方法也进行事务声明得原因。
其实没有必要。
<prop key="select*">PROPAGATION_REQUIRED,readOnly</prop> 
因为没有调用数据更新部分,估计HibernateTemplate并没有执行commit操作,导致该事务没有被结束,相关得数据库资源也就没有被释放。
单纯读取得操作没有必要用aop添加外包得事务。
各种例子也没有。
楼主对readonly得理解错了吧。
0 请登录后投票
   发表时间:2006-11-06  
晕, 换了个Hibernate3的jar问题就解决了
0 请登录后投票
   发表时间:2006-12-02  
换了个什么Hibernate3的jar?
最新版本?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics