1、Spring+Hibernate+c3p0连接池配置:

<?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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsd"default-autowire="byName"><context:property-placeholder location="classpath:jdbcConfig.properties" /><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"><property name="driverClass" value="${jdbc.driverClassName}" /><property name="jdbcUrl" value="${jdbc.url}" /><property name="user" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /><property name="minPoolSize" value="5" /><property name="maxPoolSize" value="20" /><property name="maxStatements" value="10" /><property name="idleConnectionTestPeriod" value="3000" /><property name="loginTimeout" value="300" /></bean><bean id="sessionFactory"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><property name="dataSource"><ref local="dataSource" /></property><property name="hibernateProperties"><props><prop key="hibernate.show_sql">true</prop><prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop><prop key="hibernate.format_sql">true</prop><prop key="hibernate.use_sql_comments">true</prop></props></property><property name="packagesToScan" value="com" /></bean><context:component-scan base-package="com" /><!-- 事务管理器 --><bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory" /><property name="dataSource"><ref local="dataSource" /></property></bean><!-- 支持事务 @Transactional 标记 --><tx:annotation-driven transaction-manager="transactionManager" />
</beans>

2、遇到的问题:

在项目中使用this.getHibernateTemplate().getSessionFactory().openSession();获得Session进行操作数据库,但是出现当查询多次之后,连接池就满了,不会继续查询数据库,导致整个程序被挂起的情况。

具体代码如下:

public class ArticleDaoImpl implements ArticleDao {private HibernateTemplate hibernateTemplate;public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {this.hibernateTemplate = hibernateTemplate;}public List<article> findAllArticle(int uid) {String sql="select * from article where auid="+uid+" and (asid=1 or asid=3 or asid=5)";/* 使用这种方式得到的线程不会自动关闭,当开启次数过多时,会抛出异常,导致整个程序被挂起*/Session session=hibernateTemplate.getSessionFactory().openSession();SQLQuery query=session.createSQLQuery(sql).addEntity(article.class);List<article> articleList=query.list();    return articleList;}
}

3、报错时候的日志信息:

2014-06-06 15:16:50,654 [btpool0-4] DEBUG AbstractBeanFactory : Returning cached instance of singleton bean 'transactionManager'
2014-06-06 15:16:50,655 [btpool0-4] DEBUG AbstractPlatformTransactionManager : Creating new transaction with name [com.*.*.service.ActivityService.findAllByPage]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
2014-06-06 15:16:50,655 [btpool0-4] DEBUG HibernateTransactionManager : Opened new Session [org.hibernate.impl.SessionImpl@4bdc0bc7] for Hibernate transaction
2014-06-06 15:16:50,655 [btpool0-4] DEBUG HibernateTransactionManager : Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@4bdc0bc7]
2014-06-06 15:16:50,655 [btpool0-4] DEBUG BasicResourcePool : trace com.mchange.v2.resourcepool.BasicResourcePool@7bfbfeae [managed: 20, unused: 0, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@564389b7)
2014-06-06 15:16:50,656 [btpool0-4] DEBUG HibernateTransactionManager : Exposing Hibernate transaction as JDBC transaction [com.mchange.v2.c3p0.impl.NewProxyConnection@6a02938d]
2014-06-06 15:16:50,657 [btpool0-4] DEBUG BasicResourcePool : acquire test -- pool is already maxed out. [managed: 20; max: 20]
2014-06-06 15:16:50,657 [btpool0-4] DEBUG BasicResourcePool : awaitAvailable(): com.mchange.v2.c3p0.impl.NewPooledConnection@564389b7
2014-06-06 15:16:50,658 [btpool0-4] DEBUG BasicResourcePool : trace com.mchange.v2.resourcepool.BasicResourcePool@7bfbfeae [managed: 20, unused: 0, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@564389b7)

原来以this.getHibernateTemplate().getSessionFactory().openSession();这种方式打开的session不会自动关闭,所以查询多次之后连接池就满了,不会继续查询。

4、解决方法:

将获得session的方式从this.getHibernateTemplate().getSessionFactory().openSession();改为this.getHibernateTemplate().getSessionFactory().getCurrentSession();

具体代码如下:

public class ArticleDaoImpl implements ArticleDao {private HibernateTemplate hibernateTemplate;public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {this.hibernateTemplate = hibernateTemplate;}public List<article> findAllArticle(int uid) {String sql="select * from article where auid="+uid+" and (asid=1 or asid=3 or asid=5)";Session session=hibernateTemplate.getSessionFactory().getCurrentSession();/* Session session=hibernateTemplate.getSessionFactory().openSession();* 使用这种方式得到的线程不会自动关闭,当开启次数过多时,会抛出异常,导致整个程序被挂起*/SQLQuery query=session.createSQLQuery(sql).addEntity(article.class);List<article> articleList=query.list();   return articleList;}
}

5、获取session的几种方法的分析:

(1)this.getsession实际上是调用了父类中的方法获得session。使用spring管理hibernate的SessionFactory的时候,这个方法会从session池中拿出一个session。这样做有可能有问题,就是超session池连接数的时候,spring无法自动的关闭session。 不推荐使用。

(2)this.getHibernateTemplate().getSessionFactory().OpenSession。这种方法从spring管理的sessionFactory中创建一个session,此session不是线程绑定的。这种方法不用手动管理事务,但是同一个线程多次的开启和关闭session,浪费系统资源和影响执行效率,正常情况下还是不要用了。(需要手动关闭连接)

(3)this.getHibernateTemplate().getSessionFactory().getCurrentSession()。从spring管理的sessionFactory中创建一个绑定线程的session.,spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭。这样做可以避免手动的管理事务,同时一个线程最多开启和关闭一次session又可以提高程序的性能。 极力推荐使用这种方法。(可以完美解决本博客的问题)

Spring+Hibernate+c3p0连接池配置-连接无法释放的问题解决方案相关推荐

  1. c3p0连接池配置Spring核心配置文件中配置applicationContext.xml

    1.1 配置c3p0.properties属性文件 #c3p0连接池属性文件 # 四大基本信息 c3p0.driverClass=com.mysql.jdbc.Driver #这里需要改成你自己的数据 ...

  2. C3P0连接池配置方式

    c3p0的配置方式分为三种,分别是  1.setters一个个地设置各个配置项  2.类路径下提供一个c3p0.properties文件  3.类路径下提供一个c3p0-config.xml文件 1. ...

  3. Hibernate连接池配置实例

    Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以及DBCP.在Hibernate连接池配置时需要注意的有三点: 一.Apche的DBCP在Hibernate2中受支 ...

  4. Spring Boot中使用MongoDB的连接池配置

    因为今天开发遇到了性能问题,可能与MongoDB的连接有关,所以稍稍深入看了一下,正好搜到原来有人写过这篇相关的内容,所以转载过来.回头有时间可以写个扩展到SpringForAll里,主体思路还是一样 ...

  5. spring mysql 连接池配置_SpringBoot数据库连接池常用配置

    关注公众号:程序猿王国         持续更新,每日分享 在配置文件中添加配置如下(我使用的是多数据源): spring.datasource.primary.url=jdbc\:mysql\:// ...

  6. DBCP,C3P0,druid,HiKariCP连接池配置使用

    Apache DBCP连接池配置 Apache commons-dbcp 需要导入dbcp包和 pool包 ,可以 从spring-framework-3.0.2.RELEASE-dependenci ...

  7. Spring Boot 使用 HikariCP 连接池配置详解

    Spring Boot 使用 HikariCP 连接池配置详解 HikariCP 是一个高性能的 JDBC 连接池组件. Spring Boot 2.x 将其作为默认的连接池组件,项目中添加 spri ...

  8. spring boot 集成 redis spring-boot-starter-data-redis 2.1.7.RELEASE jedis: pool: #连接池配置 及踩坑经验

    目录 先上一些踩坑报错,各类报错 @org.springframework.beans.factory.annotation.Autowired(required=true) Error creati ...

  9. java 连接池配置_java数据库连接池配置的几种方式

    关于java数据库连接池配置的几种方式 今天遇到了关于数据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,(已Mysql数据库为例) 一,Tomcat配置数据源: 方式一:在WebRoot下 ...

最新文章

  1. ssm拼接html,SSM前后端分离 ssm+html+js(ajax) 这种controll层的返回值是结合或者网址...
  2. tensorflow随笔-读取图像文件数据(1)
  3. Docker 的日志相关整理
  4. Floyd Warshall算法
  5. 使用深度学习框架 Tensorflow 实现线性回归 (Linear Model)
  6. ArcGIS API for JavaScript实现分图层显示
  7. 第7章 PCA与梯度上升法 学习笔记中
  8. Unity Qualcomm 3D音频插件
  9. AKKA:大数据下的并发编程模型
  10. 乞讨网站,要饭网,个人要饭网,在线要饭网站;含socket 通信;双端支付源码 ;源码
  11. HTML5七夕情人节表白网页制作【满天星空3D相册】HTML+CSS+JavaScript 3D动态相册网页代码
  12. tomcat自定义错误页面
  13. 都是肿瘤模型,凭什么说肿瘤类器官是“试药替身”?
  14. 蒂芙尼推出由碧昂丝和Jay-Z主演的最新广告宣传片
  15. Caused by: java.sql.SQLException: connection holder is null
  16. sgg-hbase-01
  17. 网友测试:优品拍拍二手交易平台
  18. 一顿操作猛如虎,老罗也要啃老土
  19. 深化学习(RL)概念应用以及基于表格型、神经网络型、策略梯度、连续动作空间求解RL​​​​​​​
  20. 等保2.0.第九章.等保2.0基础知识

热门文章

  1. ELI5 和scikit-learn文本分类管道
  2. 十五、JavaScript进度条的制作
  3. 从Bayesian Deep Learning到Adversarial Robustness新范式
  4. 深度运用LSTM神经网络并与经典时序模型对比
  5. 从4篇最新论文详解NLP新范式——Continuous Prompt
  6. AAAI 2019 Oral | 把Cross Entropy梯度分布拉‘平’,就能轻松超越Focal Loss
  7. 直播预告:GAN在网络特征学习中的应用 | PhD Talk #23
  8. label smoothing(标签平滑)
  9. Codeforces987F AND Graph
  10. Hihocoder 1370 快乐数字