(J2EE)关于 proxool 连接池自动断开连接的问题

来源:百度知道 编辑:UC知道 时间:2024/06/22 00:20:42
数据持久层使用 Hibernate 3.1
连接池使用了 Proxool 0.8.3

症状描述: 正常操作没有问题,如果过上一段时间不操作,比较机器闲置半小时(TOMCAT容器正常工作)左右,当你再次操作的时候,报500错误,说connection.close()方法已经被执行。错误详情如下:

ERROR[http-8080-Processor23](StandardWrapperValve.java:253)-Servlet.service() for servlet action threw exception
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:981)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
at com.mysql.jdbc.ConnectionImpl.getMutex
.......

--------------------------------------------------------
下面是proxool的配置文件,贴出来:

<?xml version="1.0" encoding="UTF-8"?>

<something-else-entirely>

<proxool>
<alias>dbpool</alias>
<

楼主问的是: proxool隔一段时间之后自动断开连接的问题,而不是如何使用的问题。所以说 一楼的答案没有切中要害。

ljf113190451 给出的地址,就是演示了在传统的JDBC下如何使用proxool,而且在他这个演示的配置中,也存在和楼主一样的问题,看看他的配置:

<maximum-active-time>30000</maximum-active-time>

在看看楼主的配置:
<maximum-active-time>60000</maximum-active-time>

这个配置的意思就是,house会自动检测每一个线程的连接时间,如果有一个线程的连接时间超过了这个配置的时间(ms),那么house会自动杀掉该线程,不管该线程是不是active的照杀不误。所以楼主隔一段时间之后,在操作就会提示connection.close()方法已经被调用,并返回500错误的提示。因为这个线程已经被杀掉,关闭了和数据库的连接。如果在开辟一个新的线程来访问,就不会出错了。

<house-keeping-sleep-time>90000</house-keeping-sleep-time>
显示proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁
你设置的<maximum-active-time>60000</maximum-active-time>
超过了最大活动时间,出现断开连接的错误。
补充经常出现的问题:
1)<alias>DBPool</alias>这个是给连接池取一个别名,在hibernate配置文件中将引用这个别名。

2)<driver-url>jdbc:mysql://localhost:3306/工程名?useUnicode=true&characterEncoding=UTF-8</driver-url>

这个是驱动的路径,我们的项目采用了mysq