程序正常启动后获得正常的连接数,在设定的时间内也正常释放了,但是一旦用户登录后数据库的连接sleep就超过设置的时间不再释放,程序中opensession的地方也已经手动关闭了,请问各位是属于什么问题? hibernate.cfg.xml配置文件如下:

update
demo_new
root
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/demo_new
org.hibernate.dialect.MySQL5Dialect
org.hibernate.connection.C3P0ConnectionProvider
thread
30
30
300
15
5
false
50
100
50
true
true
utf8
utf8
true
false
false
false
........

问题补充:

beneo 写道

不释放就在数据库那设置timeout

mysql>set interactive_timeout = 60; //60秒

你担心你执行sql语句的时候突然链接被咔嚓掉么?别担心

在c3p0里面有

true

每次sql语句执行的时候都验证

----------------------

为什么这么解答你的问题呢?因为链接不释放,是很麻烦的事情

你得记录所有的链接,所有的sql语句,然后根据sql语句来反向推出哪个模块有问题

你给出的配置文件,怎么看都是千锤百炼的

我是做测试才设置的30秒,有没有什么好的方法检测哪些连接不释放呢?

问题补充:

beneo 写道

mysql> show processlist;

我想要看到具体哪个sql语句没有释放

你说的这个命令直接在ide里面就可以看到

mysql 数据库软连接磁盘清理 mysql数据库连接不释放_sql语句

问题补充:

beneo 写道

引用

我想要看到具体哪个sql语句没有释放

你说的这个命令直接在ide里面就可以看到

这个是不可能的了,这部分的代码你得自己写了。。。。

所以我说

引用

为什么这么解答你的问题呢?因为链接不释放,是很麻烦的事情

你得记录所有的链接,所有的sql语句,然后根据sql语句来反向推出哪个模块有问题

其实你在数据库的设置+hibernate的配置就能解决问题。

或者你用spring来管理hiberante + datasource,这样你就用的就不是hiberante的datasource,用原版的datasource

这是一个比较大的应用,用的是webwork+spring+hibernate+c3p0+mysql

以前在登录的时候发现登录一个新用户至少5个链接在设定的时间没有释放,最开始解决办法是加了一个OpenSessionInViewFilter,不释放的问题是解决了,但是引起了其他更多的问题,没办法,只好从代码来排除,首先手动关闭opensession的地方,由于这个项目经手的人比较多,在jsp页面直接getBean,而且还是manager层的bean,就是登录加载权限一系列的地方,把这些bean换成了model层(因为事务配置的入口在model),改了之后发现登录不会再有那么多的连接不释放了,于是检索程序中所有getbean的地方,在action层中有直接调用manager层、甚至是dao层的bean,都改了之后,本地两三个用户测试,目前发现还是有两个连接不释放,。。。。。。

问题补充:

beneo 写道

我很奇怪,如果hibernate的用没有问题的话,为啥会存在connection没有关闭的情况。

bean 调用 dao,dao在获得数据后,应该会释放链接的。。

鉴于你是

引用

spring+hibernate+c3p0+mysql

我非常强烈的推荐你,换一种spring的配置方式,用spring来管理原生的c3p0,而不是用hiberante的delgate的方式来管理。

spring 来产生sessionFactory,spring 来产生datasource

此外,hibernate.c3p0.timeout

引用

timeout Must be set in hibernate.cfg.xml (or hibernate.properties), Hibernate default: 0

The seconds a Connection can remain pooled but unused before being discarded. Zero means idle connections never expire.

你看到的,这个timeout,是在链接池的生存周期,而不是链接到数据库的timeout

呵呵,你的测试可能不对

timeout是链接在连接池的生命周期,如果超过这个时间,正好在一定的时间去检查了,那么应该释放数据库的连接才对,如果数据库的连接sleep的时间超过了这个,那么是不是就是因为程序没有主动释放这个链接呢?

之前我也为了解决这个问题,改了mysql的wait_timeout,但是这个也是治标不治本的方法,还是没用,程序跑一段时间就崩溃了,内存一直往上涨;

我先试试看你说的用spring配置的方式,直接管理c3p0

30

30

问题补充:

beneo 写道

我很奇怪,如果hibernate的用没有问题的话,为啥会存在connection没有关闭的情况。

bean 调用 dao,dao在获得数据后,应该会释放链接的。。

程序是mvc模式的,action、model、manager、dao

有一部分的getbean是在jsp上获得,并且还是获得的是manager层的bean,而事务是声明式的,入口在model层,所以我就怀疑是不是脱离了事务,也就脱离了spring的事务管理,所以连接没有释放,反正这一部分修改了以后,明显到设定时间没有释放的连接减少了,为了排除问题所以我把action层直接调用dao、manager层的也修改了,程序比较大,一个一个的action类检查,大概1500多个action。。。。。

mysql 数据库软连接磁盘清理 mysql数据库连接不释放_sql语句_02

问题补充:

titanaly 写道

15

有15个链接是不释放的啊

我只好轻轻的告诉你,请你看清楚了再回答!

问题补充:

langshao 写道

引用

一个一个的action类检查,大概1500多个action。。。。。

程序写得不好,还是慢慢改吧。 走捷径,就算可以,对以后的改进也不好。

谢谢!