zoukankan      html  css  js  c++  java
  • Spring c3p0连接池无法释放解决方案

    通过c3p0配置连接池的时候,在进行压力测试的时候,日志出现了这样一个错误:Data source rejected establishment of connection, message from server: “Too many connections”
    数据库的连接过多。
    然后查看mysql的最大连接数,为100。
    这里写图片描述
    于是便更改最大连接池。
    由于MySQL默认的最大连接数为100,MySQL允许的最大连接数16384。Windows下由于线程数限制MySQL最大连接数为2048。
    于是更改为2000。但是数据库连接池最大只有这多,如果建立连接数过多,依旧会超载。
    所以要从根本上解决,那么就要释放连接池。
    参考博客:http://blog.csdn.net/yonglelaoren/article/details/28886593

    解决办法:
    将getSessionFactory().OpenSession()更改为getSessionFactory().getCurrentSession()。
    getSessionFactory().OpenSession() 这种方法从spring管理的sessionFactory中创建一个session,此session不是线程绑定的。当执行完一个实务的时候自动关闭session.这种方法不用手动管理实务,但是同一个线程多次的开启和关闭session,浪费系统资源和影响执行效率。而且通过这种方式打开的session不会自动关闭,现象时查询多次之后连接池满了,不会再继续查询了。

    getSessionFactory().getCurrentSession()方法从spring管理的sessionFactory中创建一个绑定线程的session.spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭。这样做可以避免手动的管理实务,同时一个线程最多开启和关闭一次session又可以提高程序的性能。


    还有一种原因可能是每次查询都会初始化连接数:<property name="initialPoolSize" value="3" />。导致查询多次就会造成too many connects错误。因此删除掉,应该在c3p0的文件配置里面配置。


    通过更改session方法后,又出现这种错误:No Hibernate Session bound to thread 。
    解决办法:
    感觉是事务的问题,检查了下Spring配置,的确配置了事务,但是为什么会报这个错呢。于是便在网上找到方法,在dao层加上@Transactional ,于是问题就解决了。
    参考:http://www.cnblogs.com/hanxirensheng/archive/2012/03/28/2422433.html

    还有可能的原因是没有在service没有在 spring管理而报的错。添加这句:<tx:annotation-driven transactionmanager="transactionManager"/>

  • 相关阅读:
    笔试算法题(51):简介
    笔试算法题(50):简介
    笔试算法题(49):简介
    笔试算法题(48):简介
    笔试算法题(47):简介
    笔试算法题(46):简介
    SQL Server 笔记
    SQL Server 2008 安装重启电脑失败
    列举某个目录文件
    Linux LAMP 配置
  • 原文地址:https://www.cnblogs.com/xuwujing/p/7536716.html
Copyright © 2011-2022 走看看