环境:weblogic 双机集群环境  使用技术: SSH 框架,Proxool 连接池,使用包版本(proxool-0.9.0RC2.jar)  问题:一段时间没操作项目,就会出现连接断开的情况,报如下错误:
org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could n
ot inspect JDBC autocommit mode; uncategorized SQLException for SQL [???]; SQL s
tate [null]; error code [0]; Couldn't perform the operation getAutoCommit: You c
an't perform any operations on this connection. It has been automatically closed
 by Proxool for some reason (see logs).; nested exception is java.sql.SQLExcepti
on: Couldn't perform the operation getAutoCommit: You can't perform any operatio
ns on this connection. It has been automatically closed by Proxool for some reas
on (see logs).
        at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.trans
late(SQLStateSQLExceptionTranslator.java:97)
        at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.t
ranslate(SQLErrorCodeSQLExceptionTranslator.java:258)
        at org.springframework.orm.hibernate3.HibernateAccessor.convertJdbcAcces
sException(HibernateAccessor.java:424)
        at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernate
AccessException(HibernateAccessor.java:411)
        at org.springframework.orm.hibernate3.HibernateTemplate.execute(Hibernat
eTemplate.java:371)
        Truncated. see log file for complete stacktrace
java.sql.SQLException: Couldn't perform the operation getAutoCommit: You can't p
erform any operations on this connection. It has been automatically closed by Pr
oxool for some reason (see logs).
        at org.logicalcobwebs.proxool.WrappedConnection.invoke(WrappedConnection
.java:207)
        at org.logicalcobwebs.proxool.WrappedConnection.intercept(WrappedConnect
ion.java:87)
        at oracle.jdbc.internal.OracleConnection$$EnhancerByCGLIB$$3aeeeeaa.getA
utoCommit(<generated>)
        at org.hibernate.jdbc.ConnectionManager.isAutoCommit(ConnectionManager.j
ava:189)
        at org.hibernate.jdbc.JDBCContext.afterNontransactionalQuery(JDBCContext
.java:239)
        Truncated. see log file for complete stacktrace
>
ERROR [HouseKeeper] (ProxyConnection.java:194) - #0012 encountered errors during
 destruction:
java.sql.SQLException: Io 异常: Connection reset
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java
:112)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java
:146)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java
:255)
        at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:480)
        at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:1
184)
        at org.logicalcobwebs.proxool.ProxyConnection.reallyClose(ProxyConnectio
n.java:192)
        at org.logicalcobwebs.proxool.ConnectionPool.removeProxyConnection(Conne
ctionPool.java:429)
        at org.logicalcobwebs.proxool.ConnectionPool.expireProxyConnection(Conne
ctionPool.java:462)
        at org.logicalcobwebs.proxool.HouseKeeper.sweep(HouseKeeper.java:106)
        at org.logicalcobwebs.proxool.HouseKeeperThread.run(HouseKeeperThread.ja
va:39)
   XML 配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "dtd/spring-beans-2.0.dtd"><beans> <bean id="dataSource1"
class="com.hdkjframe.base.env.ProxoolDataSourceExt">
<property name="driver">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="driverUrl">
<value>jdbc:oracle:thin:@x.x.x.x:1521:x</value>
</property>
<property name="user">
<value>xxxx</value>
</property>
<property name="password">
<value>xxxx</value>
</property>
<property name="delegateProperties">
<value>user=xxxx,password=xxxx</value>
</property>
<property name="alias">
<value>xxxx</value>
</property>
<property name="maximumConnectionCount">
<value>200</value>
</property>
<property name="minimumConnectionCount">
<value>0</value>
</property>
<property name="houseKeepingSleepTime">
<value>30000</value>
</property>
<property name="trace">
<value>true</value>
</property>
<property name="verbose">
<value>true</value>
</property>
<property name="statistics">
<value>1m,15m,1d</value>
</property>
</bean> <bean id="sessionFactory1"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource1" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.OracleDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</prop>
</props>
</property>
</bean>
</beans>

    总结: 网上搜狗了一翻, 大概说的是没有设置最小连接数吧, 我在 xml 里面配置 
                <property name="prototypeCount">
<value>5</value>
       </property>           也没有用, 忘哥哥姐姐们帮下忙, O(∩_∩)O谢谢


解决方案 »

  1.   

    1,从这两个连接中可以估计出,连接池中的某连接被打开后一直没有使用,因此会有个过期操作,然后有个移除操作。
     at org.logicalcobwebs.proxool.ConnectionPool.removeProxyConnection
     at org.logicalcobwebs.proxool.ConnectionPool.expireProxyConnection
    2,由于连接已经被重置,所以,could not inspect JDBC autocommit mode
    java.sql.SQLException: Io 异常: Connection reset希望对你有帮助。
      

  2.   


      问题补充下:  我在 tomcat 和单机 weblogic 环境下一样的代码都没错, 移植到双机 weblogic下就报错了。
      

  3.   

    你把 <property name="minimumConnectionCount">
         <value>0</value>
    </property>
    value 设置成大于0的数试试
      

  4.   

    引用外部xml用
    <proxool:maximum-active-time>value</proxool:maximum-active-time>
    试试
    spring直接配置用
    <property name="maximumActiveTime">
    <value>value</value>
    </property>
    加入sett方法setMaximumActiveTime注入org.logicalcobwebs.proxool.ProxoolDataSource
    试试看行否
      

  5.   

    看你的异常大约是hibernate映射问题。
      

  6.   

    maximum-active-time 
    默认5分钟
    调整后再试试
      

  7.   

    好久没动ssh了!看见都有点晕
      

  8.   


    如果是这样,说明你的配置本身就有问题
    可以使用单独的proxool配置文件来试一下
      

  9.   


       我也觉得是环境的问题, 是双机weblogic集群, 双机oracle 服务器, F5 代理。
      

  10.   


      不是用的 c3p0  用的是 proxool-0.9.0RC2.jar 包
      

  11.   

    我们这里也有个错误,大概30分钟不用连接就全断了,估计是远程访问数据库造成的。用本机的oracle测试就没有问题,多长时间都连着。希望对你有点启发。
    解决方案目前俺们也在想呢。
      

  12.   

    <property name="statistics">
        <value>1m,15m,1d</value>
     </property>
    这样写对的么
      

  13.   

    在hiberante配置连接的地方加上connection.autoReconnectForPools=true试试看
      

  14.   

    楼主,在吗<property name="maximumConnectionCount">
                <value>200</value>
    </property>
    <property name="minimumConnectionCount">
                <value>0</value>
    </property>
    这里才是设置最大和最小连接数的地方吧
    最小连接数为零
    那么这个连接池还有什么性能,大于最小连接数的连接,超时后会自动关闭的。
    你说设置成大于零会报错,请看看是什么错,大于零时正确的配置
      

  15.   

    楼主,懂连接池的原理么,这个跟环境没什么关系,单击环境和双机环境有一样的请求数么?
    没出问题说明测试的连接数太少,不够造成问题。
    首先,出现IO connection问题,很明显,数据库已经开不了连接。
    为什么会这样呢,肯定是开启的连接数过大,且本次访问(指出问题时的操作)
    用的不是连接池内的连接,而是去重新开数据库的连接,才会报io错误。
    很可能是如下原因造成的:
    最小连接数设置太小(貌似你的是零),比如数据库只能支持200个连接
    然后你操作时一下子开启了180,当然这180是放在连接池内的
    短时间内不会被关闭,有个超时时间(假设20分钟),过了超时时间后,连接池会关闭
    大于最小连接数的一部分连接,而这些刚关闭的连接短时间内是不能再开启的(数据库连接不能频繁开关,需要一段时间释放资源,这点很重要),
    而恰巧这时候你又来访问程序,需要180个数据库连接,由于连接池里的连接被刚关闭,于是又要重新去数据库里请求,这时候不巧,大部分连接处在(释放资源阶段),于是出现Io connection异常
      

  16.   


    testConnectionOnCheckout="false"
    autoCommitOnClose="true"
    maxIdleTime="180"
    idleConnectionTestPeriod="180"不知道,能不能在配置文件里,配置这些属性,目的,自动连接连接池。不占用连接数。防止连接池超时。
    LZ看看是否可以帮助你。