Spring c3p0连接池无法释放解决方案

摘要:
于是便更改最大连接池。由于MySQL默认的最大连接数为100,MySQL允许的最大连接数16384。Windows下由于线程数限制MySQL最大连接数为2048。参考博客:http://blog.csdn.net/yonglelaoren/article/details/28886593解决办法:将getSessionFactory().OpenSession()更改为getSessionFactory().getCurrentSession()。getSessionFactory().getCurrentSession()方法从spring管理的sessionFactory中创建一个绑定线程的session.spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭。导致查询多次就会造成toomanyconnects错误。因此删除掉,应该在c3p0的文件配置里面配置。还有可能的原因是没有在service没有在spring管理而报的错。

通过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"/>

免责声明:文章转载自《Spring c3p0连接池无法释放解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysql 安装成功后如何设置密码?Android ---------- TabLayout 实战 (二) 仿京东商品详情页下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C++11 并发指南四(&amp;lt;future&amp;gt; 详解二 std::packaged_task 介绍)

上一讲《C++11 并发指南四(<future> 详解一 std::promise 介绍)》主要介绍了 <future> 头文件中的 std::promise 类,本文主要介绍 std::packaged_task。 std::packaged_task 包装一个可调用的对象,并且允许异步获取该可调用对象产生的结果,从包装可调用对象...

为什么要用Volley中的RequestFuture封装RxJava来用异步请求处理同步请求?

前几天健哥喊我研究一下RvJava,在网络请求用,更简洁更有条理,然后就会抽空研究研究,现在项目里网络库是Volley,就结合项目和网上的demo看,突然脑袋蹦出这个问题,现在看起来这个问题有一点蠢蠢的。 firstly,名词解释一下。 Volley是谷歌爸爸给咱们封装好了的网络请求库,帮我们封装了具体的请求,线程切换以及数据转换,适合短小多并发的网络请求...

Android Looper详解

在Android下面也有多线程的概念,在C/C++中,子线程可以是一个函数, 一般都是一个带有循环的函数,来处理某些数据,优先线程只是一个复杂的运算过程,所以可能不需要while循环,运算完成,函数结束,线程就销毁。对于那 些需要控制的线程,一般我们都是和互斥锁相互关联,从而来控制线程的进度,一般我们创建子线程,一种线程是很常见的,那就是带有消息循环的线程...

IOS多线程--回调主线程

回调主线程 (1)NSThread 1.performSelectorOnMainThread调用主线程的方法、 [self performSelectorOnMainThread:@selector(finish) withObject:self waitUntilDone:NO]; 2.回调其她子线程也是可以的,但是不用 self performSel...

pyqt5学习之QThread

       pyqt的线程的使用非常简单-建立一个自定义的类(如thread),使它继承自QThread,并实现其run()方法即可; 在使用线程时可以直接得到thread实例,调用其start()函数即可启动线程。线程启动后,会自动调用其实现run方法,该方法就是线程的执行函数。        业务的线程任务就写在run()函数中,当run()退出之后...

Hibernate 缓存机制

一、why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库。 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。 缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。 二、what(Hibernate缓存原理是怎样的?)Hi...