hibernate连接mysql数据库,总是会在一段时间后显示No operations allowed after connection closed

safewolf 2012-12-16 09:42:07
这里是我的配置文件,到底哪里有问题呢?


<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">
jdbc:mysql://127.0.0.1:3306/health_center?useUnicode=true&characterEncoding=utf8
</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.autocommit">true</property>
<property name="hibernate.connection.useUnicode">true</property>
<property name="hibernate.connection.characterEncoding">UTF-8</property>
<property name="hibernate.show_sql">true</property>
<!-- c3p0在我们使用的Hibernate版本中自带,不用下载,直接使用 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.idle_test_period">900</property>
<property name="hibernate.c3p0.preferredTestQuery">select 1</property>
<property name="hibernate.c3p0.max_statements">50</property>

<property name="hibernate.c3p0.testConnectionOnCheckout">true</property>

</session-factory>

</hibernate-configuration>
...全文
636 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
safewolf 2013-01-08
  • 打赏
  • 举报
回复
从mysql日志看,所有session用过以后没有返还给连接池 比如最开始可以看到mysql日志如下: 130108 17:24:04 614 Query select 1 613 Query select 1 612 Query select 1 如果打开一个页面,执行一句语句的话,可以看到以下日志: 614 Query select user0_.id as id61_, user0_.created_on as created2_61_, user0_.disable as disable61_, user0_.password as password61_, user0_.updated_on as updated5_61_, user0_.user_type as user6_61_, user0_.username as username61_ from health_center.user user0_ where user0_.username='11' 然后无论过多少时间,C3P0保持连接的日志就hi能看到612,613两个连接在执行select 1
safewolf 2013-01-08
  • 打赏
  • 举报
回复
引用 13 楼 tiantian1412 的回复:
引用 12 楼 safewolf 的回复:引用 11 楼 tiantian1412 的回复:我也遇到过类似的问题,貌似hibernate内置c3p0的问题,后来重新加入c3p0的jar包就解决了 你是说不用<property name="hibernate.connection.provider_class">org.hibernate.connection.C……
现在看是C3P0是用上了,mysql的日志能看到
架构师梦 2013-01-08
  • 打赏
  • 举报
回复
引用 12 楼 safewolf 的回复:
引用 11 楼 tiantian1412 的回复:我也遇到过类似的问题,貌似hibernate内置c3p0的问题,后来重新加入c3p0的jar包就解决了 你是说不用<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider……
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 这句也要,另外把c3p0的jar包放到lib下。 我那时候,也是8小时超时的问题 弄了一整天,后来发现Hibernate内置的c3p0貌似没用上,配置是配置了,但是用的还是默认的线程池,最后我把c3p0的jar包放进去就好了,不知道你问题是不是跟我一样
safewolf 2013-01-08
  • 打赏
  • 举报
回复
引用 11 楼 tiantian1412 的回复:
我也遇到过类似的问题,貌似hibernate内置c3p0的问题,后来重新加入c3p0的jar包就解决了
你是说不用<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>?
架构师梦 2013-01-08
  • 打赏
  • 举报
回复
我也遇到过类似的问题,貌似hibernate内置c3p0的问题,后来重新加入c3p0的jar包就解决了
safewolf 2013-01-07
  • 打赏
  • 举报
回复
目前看,所有操作都会有 不管是页面,还是servlet,都可能出现
  • 打赏
  • 举报
回复
能不能去查下是程序中的哪个步骤的操作 出现了No operations allowed after connection closed,虽然说配置了定时900时测试,可是如果能明确的知道程序中是哪个步骤或者说操作时 出现No operations allowed after connection closed,这样也方便看下程序代码。没准还真是程序代码的问题。
safewolf 2013-01-07
  • 打赏
  • 举报
回复
看了下mysql的log <property name="hibernate.c3p0.idle_test_period">900</property> 这个设置是生效的,每900秒hibernate就会使用select 1语句查询数据库,以保持连接 所以就很奇怪什么原因了
heroleader 2013-01-07
  • 打赏
  • 举报
回复
这是数据库设置的连接数问题,数据库打开窗口,访问量大于设置的连接数
郭梧悠 2013-01-07
  • 打赏
  • 举报
回复
打开计算机的服务管理窗口,看看你的mysql启动没有,有时候它会自动关闭的
dxqrr 2013-01-07
  • 打赏
  • 举报
回复
MiceRice 2012-12-16
  • 打赏
  • 举报
回复
引用 2 楼 safewolf 的回复:
我检查过代码,没有发现人为的close hibernate session的情况,还有什么操作可能导致这种问题的发生呢?
似乎很难,因为你的配置中有设置:“testConnectionOnCheckout” 也就意味着如果该连接是刚从连接池中取出的,那么可以肯定该连接是正常的,因为连接池已经测试过了。 基本上只能发生在取出连接直到归还连接之间,而且从现象看起来有可能是绕过了一些机制; 所以,是否有代码从session中get过connection?
safewolf 2012-12-16
  • 打赏
  • 举报
回复
我检查过代码,没有发现人为的close hibernate session的情况,还有什么操作可能导致这种问题的发生呢?
MiceRice 2012-12-16
  • 打赏
  • 举报
回复
从错误来看,不像是连接池的问题,更像是自己代码的Bug。。。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧