Hibernate分页查询频繁操作出现数据库连接池不释放

在使用Hibernate进行分页查询时,遇到数据库连接池(如C3P0)无法释放的问题。尝试调整C3P0配置无效后,更换为Proxool连接池解决了该问题。推荐一篇关于不同数据库连接池性能比较的博客。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

就我所知,SSH框架配置的开源数据库连接池有4种,分别是DBCP、C3P0、Proxool、BoneCP。工作中最先接触使用的是DBCP,之后又使用了C3P0。最近在使用hibernate分页功能时,发现重复频繁的使用分页查询时数据库连接会得不到释放!!!我的分页查询使用的语句是:
Query query = getSession().createQuery(hql);
Pager pager = pageHelper.getPager(getRows(pageHelper.getHql()));
query.setFirstResult(pager.getStartRow());
query.setMaxResults(pager.getPageSize());
return query.list();
在网上查了查,一种方案说是使用getSession()造成的,建议利用HibernateTemplate替换,想想改动太大而且本人习惯传hql,只好舍弃(是否有效还需要验证)。
另外有方案说是在配置C3P0方面有问题,我检查了多遍,也尝试诸多修改方案,未见效果,实在不知道问题出在哪里!如果哪位大虾看到还请帮忙!我的C3P0配置如下:
 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
  <property name="maxPoolSize" value="${c3p0.maxPoolSize}" />
  <property name="minPoolSize" value="${c3p0.minPoolSize}" />
  <property name="maxIdleTime" value="${c3p0.maxIdleTime}" />
  <property name="maxStatements" value="${c3p0.maxStatements}" />
  <property name="acquireIncrement" value="${c3p0.acquireIncrement}" />
  <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}" />
  <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}" />
  <property name="breakAfterAcquireFailure" value="${c3p0.breakAfterAcquireFailure}" />
  <property name="testConnectionOnCheckout" value="${c3p0.testConnectionOnCheckout}" />

  <property name="driverClass" value="${jdbc.driverClassName}" />
  <property name="jdbcUrl" value="${jdbc.url}" />
  <property name="user" value="${jdbc.username}" />
  <property name="password" value="${jdbc.password}" />
 </bean>
 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
     <property name="dataSource">
         <ref local="dataSource" />
     </property>
  <property name="mappingResources">
   <list>
    <value>model/TSysUser.hbm.xml</value>
   </list>
  </property>
     <property name="hibernateProperties">
         <props>
             <prop key="hibernate.dialect">${hibernate.dialect}</prop>
             <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
             <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
             <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
             <prop key="hibernate.connection.release_mode">auto</prop> 
              <prop key="hibernate.autoReconnect">true</prop>
              <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
         </props>
     </property>
 </bean>
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
 <!-- service manager Template-->
    <bean id="transactionProxyTemplate"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true"
        abstract="true">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="transactionAttributes">
            <props>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="delete*">PROPAGATION_REQUIRED</prop>
                <prop key="remove*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
            </props>
        </property>
    </bean>  
 <!-- service manager -->
 <bean id="userService" parent="transactionProxyTemplate">
        <property name="target">
      <bean class="user.service.impl.UserServiceImpl">
       <property name="dao" ref="dao"/>
   </bean>
        </property>
        <property name="proxyInterfaces">
            <value>user.service.IUserService</value>
        </property>
    </bean>   
   
    <bean id="daoTemplate" class="dao.BaseDAO" abstract="true" lazy-init="true">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean> 
    <bean id="dao" class="dao.Dao" parent="daoTemplate"/>
   
不得以根据修改连接池配置这个思路,想想干脆换一个连接池试试,于是找上了Proxool。经过重新配置并作了测试,发现问题解决,不再发现有数据库连接不释放的情况!有机会再试试BoneCP,听说这个性能是最优的!?
在此推荐一篇博客,虽然也是转载的,但里面对这几种连接池介绍的都比较详细,另外还作了测试对比,厉害。
http://ahcaizhiming.blog.163.com/blog/static/136765452201342185929695/
    
    
      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值