c3p0+mysql session资源不释放

问题描述

程序正常启动后获得正常的连接数,在设定的时间内也正常释放了,但是一旦用户登录后数据库的连接sleep就超过设置的时间不再释放,程序中opensession的地方也已经手动关闭了,请问各位是属于什么问题? hibernate.cfg.xml配置文件如下:<session-factory><property name="hibernate.hbm2ddl.auto">update</property><property name="hibernate.default_schema">demo_new</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password"></property><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/demo_new</property><property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><!-- 连接池 --><property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property><property name="hibernate.current_session_context_class">thread</property><!-- 间隔多少秒检查空闲的连接,这里为了测试设置为30秒--><property name="hibernate.c3p0.idle_test_period">30</property><!-- hibernate.c3p0.timeout是设置c3p0.maxIdleTime,单位是秒 ,这里为了测试设置为30秒--><property name="hibernate.c3p0.timeout">30</property><!-- 最大连接数--><property name="hibernate.c3p0.max_size">300</property><!-- 保持最小的连接数--><property name="hibernate.c3p0.min_size">15</property><!-- 每次获取连接的数量 --><property name="hibernate.c3p0.acquire_increment">5</property><property name="hibernate.bytecode.use_reflection_optimizer">false</property><!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0--><property name="hibernate.c3p0.max_statements">50</property><!--Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数--><property name="hibernate.jdbc.fetch_size">100</property><!--Batch Size是设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思--><property name="hibernate.jdbc.batch_size">50</property><!--+ | 在数据插入数据库之后,允许使用JDBC3 PreparedStatement.getGeneratedKeys() |来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, | 如果你的数据库驱动在使用Hibernate的标识生成器时遇到问题,请将此值设为false. | 默认情况下将使用连接的元数据来判定驱动的能力. +--><property name="hibernate.jdbc.use_get_generated_keys">true</property><!-- 强制Hibernate按照被更新数据的主键,为SQL更新排序。这么做将减少在高并发系统中事务的死锁。 --><property name="hibernate.order_updates">true</property><property name="hibernate.connection.charSet">utf8</property><property name="hibernate.connection.characterEncoding">utf8</property><property name="hibernate.connection.useUnicode">true</property><property name="hibernate.show_sql">false</property><property name="hibernate.format_sql">false</property><property name="hibernate.use_sql_comments">false</property><mapping package="com.pjgw.assetsys.entity" /> ........ 问题补充:beneo 写道

解决方案

引用timeout是链接在连接池的生命周期,如果超过这个时间,正好在一定的时间去检查了,那么应该释放数据库的连接才对, conn表示你链接到c3p0 ,conneciont表示c3p0链接到dbconn 不是链接数据库的 connection你getConnection函数,获得的只是conn 不表示你真正获得了数据库的connection数据库的connection是在c3p0启动的时候,就链接了(这是可选项吧)也是c3p0管理的timout指阿是conn,而不是connection, 链接池的目的就是复用这些conn引用如果数据库的连接sleep的时间超过了这个,那么是不是就是因为程序没有主动释放这个链接呢? 只能说c3p0收回了这个链接,回收了conn,而不是c3p0把这个链接与数据库断开了connection引用之前我也为了解决这个问题,改了mysql的wait_timeout,但是这个也是治标不治本的方法,还是没用,程序跑一段时间就崩溃了,内存一直往上涨; 我先试试看你说的用spring配置的方式,直接管理c3p0 我也是这么想的。
解决方案二:
<!-- 保持最小的连接数--> <property name="hibernate.c3p0.min_size">15</property> 有15个链接是不释放的啊
解决方案三:
引用一个一个的action类检查,大概1500多个action。。。。。程序写得不好,还是慢慢改吧。 走捷径,就算可以,对以后的改进也不好。
解决方案四:
引用只能说c3p0收回了这个链接,回收了conn,而不是c3p0把这个链接与数据库断开了connection 这句话我说的不对引用如果数据库的连接sleep的时间超过了这个,那么是不是就是因为程序没有主动释放这个链接呢? 应该是的
解决方案五:
我很奇怪,如果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: 0The seconds a Connection can remain pooled but unused before being discarded. Zero means idle connections never expire.你看到的,这个timeout,是在链接池的生存周期,而不是链接到数据库的timeout呵呵,你的测试可能不对
解决方案六:
引用我想要看到具体哪个sql语句没有释放 你说的这个命令直接在ide里面就可以看到 这个是不可能的了,这部分的代码你得自己写了。。。。所以我说引用为什么这么解答你的问题呢?因为链接不释放,是很麻烦的事情 你得记录所有的链接,所有的sql语句,然后根据sql语句来反向推出哪个模块有问题 其实你在数据库的设置+hibernate的配置就能解决问题。或者你用spring来管理hiberante + datasource,这样你就用的就不是hiberante的datasource,用原版的datasource
解决方案七:
mysql> show processlist;
解决方案八:
不释放就在数据库那设置timeoutmysql>set interactive_timeout = 60; //60秒你担心你执行sql语句的时候突然链接被咔嚓掉么?别担心在c3p0里面有<property name="hibernate.c3p0.validate">true</property>每次sql语句执行的时候都验证----------------------为什么这么解答你的问题呢?因为链接不释放,是很麻烦的事情你得记录所有的链接,所有的sql语句,然后根据sql语句来反向推出哪个模块有问题你给出的配置文件,怎么看都是千锤百炼的

时间: 2024-11-28 13:45:12

c3p0+mysql session资源不释放的相关文章

CI框架出现mysql数据库连接资源无法释放的解决方法_php实例

本文实例分析了CI框架出现mysql数据库连接资源无法释放的解决方法.分享给大家供大家参考,具体如下: 使用ci框架提供的类查询数据: $this->load->database(); $query = $this->db->query($sql); 程序运行一段时间之后,报错,告知数据库too many connections 很明显MySQL数据库连接资源超过了 max_connections 设定值.立马在每个查询之后,添加资源释放脚本: $this->db->c

javaDao c3p0 mysql 服务器挂掉!

问题描述 javaDao c3p0 mysql 服务器挂掉! 只有个页面,连接数据库的就是一个getSession(), 一个调用Dao实现类的方法: Dao实现类如下: public class DptDaoImp implements DptDao { public List<Dpt> show_Dpt() { String sql ="SELECT * FROM dpt"; Connection conn=null; List<Dpt> dpt_List=

库-VB.NEt利用水晶报表的API,给Oracle创建session后不能释放session的问题

问题描述 VB.NEt利用水晶报表的API,给Oracle创建session后不能释放session的问题 vb.net2010调用水晶报表的API,先使用PEOpenEngine,然后PEOpenPrintJob,然后使用PESetNthTableLocation后,会自动给Oracle创建一个 session来连接数据库,调用数据库中的数据以打印报表,接着用PEStartPrintJob打印报表,然后用PEClosePrintJob来关闭报表, 然后PECloseEngine关闭水晶报表引擎

C#调用摄像头无法重复启动,点开第一次,没问题,但是如果再点第二次就会报错,怀疑资源没有释放,请高手指点

问题描述 其中这个代码是报错的部分,我在第一次打开视频的时候,一点问题没有,但是当把窗体的子窗口关闭,再次打开的时候就会报出错误,hr就会变为负值,希望大家可以给出解决的办法吧,谢谢了这代码主要是实现显示摄像头的图像显示,自己琢磨了好久了也解决不了,希望大家帮忙吧Guidcat=PinCategory.Preview;//设置媒体类型为视频帧Guidmed=MediaType.Video;//输出视频流hr=capGraph.RenderStream(refcat,refmed,capFilte

简单解决mysql占用资源过大问题

    在 linux 下,经常出现的情况就是使用 VBB 这种论坛系统时,出现缓慢,mysql 假死状态,sleep进程过多等等现像.导致几十个用户,就把系统搞定了.     其实这是 mysql 配置上的问题, 默认的 linux 中, mysql 的配置是 my-large.cnf 配置,该配置适合大型服务器.有高内存,比如2G,4G内存的,适合使用,而一般512M内存 的就不行了.它会占用512M内存来保存系统 mysql 的进程,这些进程长期堆质,并不释放,导致系统缓慢.所以,把配置改

详解MySQL数据库资源不足的错误解决方案

前几天,在管理系统的时候遇到一个奇怪的问题, 今天才有机会安装好MySQL环境来重现此问题,由于不是最原始的环境, 所以未必能够完全重现, 我只能努力重现关键问题了.. 我觉得此问题有点特别, 故在此大概的回想下当时的情景.. 工作时, 执行了一个su – mysql 的命令, 遇到了下面这样一个错误.. view sourceprint?1 [root@dbmain ~]# su - mysql  2 su: cannot set user id: Resource temporarily u

求教,try块中申请的Dataset资源需要释放吗,怎么释放

问题描述 各位:在try中申请了dataset,怎么释放他,代码try{Datasetaaa=GetDT(sql);//获取记录集foreach(DataRowdrinaa.tables[0].rows)listview.items.add(dr["aa"].tostring());aaa.dispose();}catch(Exception){}这里在try最后是释放了datasetaaa但是如果在此之前发生异常就没有办法释放,如果写在catch块中因为Datasetaaa不是他的块

有效利用大数据资源,释放数据隐藏的价值

数据的真实价值就像漂浮在海洋中冰山,第一眼只能看到冰山一角,而绝大部分则隐藏在表面之下.在大数据时代,数据的价值仍然存在,只是处于"休眠"状态,而要解锁这些数据的价值,就必须通过统计人员的不懈努力并借助新一代的方法和工具,来释放数据隐藏的价值. 大数据来袭势不可挡 世界每时每刻都在产生数据,数据又开始以几何级增长,这种增长速度已经不是"爆炸"二字可以形容的了.国际数据公司(IDC)的<数据宇宙>报告显示:2008年全球数据量为0.5ZB,2010年为1.

一个控件调用Dispose()之后,上面的子控件资源会释放吗

问题描述 还有就是在调用:System.Windows.Forms.Control.ControlCollection.Remove(Controlvalue)时,如何释放Controlvalue的资源呢? 解决方案 解决方案二:不使用Dispose(),也会自动回收的.不用担心这解决方案三:不用在意释放,垃圾自动回收解决方案四:引用2楼gxingmin的回复: 不用在意释放,垃圾自动回收 那句柄要如何释放啊,我在测试时有较大数量的控件添加,20分钟左右会报错</StackTrace><