浏览 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*方法以非事务方式执行, 这样也不会耗光连接池. 为什么会发生这样的状况,请教... 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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> 上面的配置是每次都得到一个新的连接。 |
|
返回顶楼 | |
发表时间:2006-11-04
你的dao查询代码是怎么写的?
|
|
返回顶楼 | |
发表时间: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> 上面的配置是每次都得到一个新的连接。 不用连接池后来测试过,没有问题 |
|
返回顶楼 | |
发表时间:2006-11-04
dwangel 写道 你的dao查询代码是怎么写的?
查询方法就是用JDBCTemplate最简单的queryForList() |
|
返回顶楼 | |
发表时间:2006-11-04
光跑单元测试是否会发生无法释放的问题?
方便的话项目一起打包发上来看看。 |
|
返回顶楼 | |
发表时间:2006-11-05
恩,我觉得应该是配置中对select方法也进行事务声明得原因。
其实没有必要。 <prop key="select*">PROPAGATION_REQUIRED,readOnly</prop> 因为没有调用数据更新部分,估计HibernateTemplate并没有执行commit操作,导致该事务没有被结束,相关得数据库资源也就没有被释放。 单纯读取得操作没有必要用aop添加外包得事务。 各种例子也没有。 楼主对readonly得理解错了吧。 |
|
返回顶楼 | |
发表时间:2006-11-06
晕, 换了个Hibernate3的jar问题就解决了
|
|
返回顶楼 | |
发表时间:2006-12-02
换了个什么Hibernate3的jar?
最新版本? |
|
返回顶楼 | |