【问题标题】:Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0"线程“com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0”中的异常
【发布时间】:2015-11-03 06:40:29
【问题描述】:

我最近在我们的日志中收到以下消息,然后是应用程序服务器崩溃。我不知道该怎么做,非常感谢任何指导。

Exception in thread "Task-Thread-for-com.mchange.v2.async.ThreadPerTaskAsynchronousRunner@6a1a2b5b" java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory(Bits.java:658)
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:306)
at com.amazon.jdbc.communications.channels.MessagesSocketChannel.<init>(Unknown Source)
at com.amazon.redshift.client.PGClient.connect(Unknown Source)
at com.amazon.redshift.client.PGClient.<init>(Unknown Source)
at com.amazon.redshift.core.PGJDBCConnection.connect(Unknown Source)
at com.amazon.jdbc.common.BaseConnectionFactory.doConnect(Unknown Source)
at com.amazon.jdbc.common.AbstractDriver.connect(Unknown Source)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
at com.mchange.v2.async.ThreadPerTaskAsynchronousRunner$TaskThread.run(ThreadPerTaskAsynchronousRunner.java:255)

Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2" java.lang.NoClassDefFoundError: com/amazon/redshift/exceptions/PGJDBCMessageKey
at com.amazon.redshift.client.PGClient.connect(Unknown Source)
at com.amazon.redshift.client.PGClient.<init>(Unknown Source)
at com.amazon.redshift.core.PGJDBCConnection.connect(Unknown Source)
at com.amazon.jdbc.common.BaseConnectionFactory.doConnect(Unknown Source)
at com.amazon.jdbc.common.AbstractDriver.connect(Unknown Source)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
atcom.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)

我们正在使用 Spring 、 hibernate 和 c3p0 以及以下配置

<bean id="redShiftDS" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <!-- access -->
    <property name="driverClass" value="com.amazon.redshift.jdbc41.Driver" />
    <property name="user">
            <value>${redshift.user}</value>
        </property>
        <property name="password">
            <value>${redshift.pwd}</value>
        </property>     

        <property name="jdbcUrl">
            <value>${redshift.URL}</value>
        </property>


    <!-- pool sizing -->
    <property name="initialPoolSize" value="3" />
    <property name="minPoolSize" value="6" />
    <property name="maxPoolSize" value="25" />
    <property name="acquireIncrement" value="3" />
    <property name="maxStatements" value="0" />

    <!-- retries -->
    <property name="acquireRetryAttempts" value="30" />
    <property name="acquireRetryDelay" value="1000" /> <!-- 1s -->
    <property name="breakAfterAcquireFailure" value="false" />

    <!-- refreshing connections -->
    <property name="maxIdleTime" value="180" /> <!-- 3min -->
    <property name="maxConnectionAge" value="10" /> <!-- 1h -->

    <!-- timeouts and testing -->
    <property name="checkoutTimeout" value="5000" /> <!-- 5s -->
    <property name="idleConnectionTestPeriod" value="60" /> <!-- 60 -->
    <property name="testConnectionOnCheckout" value="true" />
        <property name="testConnectionOnCheckin" value="true" />
</bean>
        <bean id="redShiftSessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="redShiftDS" />
        </property>
        <property name="packagesToScan" value="com.ghx.mi">
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.auto_close_session">true</prop>
                <prop key="hibernate.connection.autocommit">true</prop>
                <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
                <prop key="hibernate.jdbc.batch_size">30</prop>
                <prop key="hibernate.show_sql">false</prop>
                 <prop key="hibernate.autoReconnect">true</prop>
                <prop key="hibernate.autoReconnectForPools">true</prop>    
                <prop key="hibernate.is-connection-validation-required">true</prop>
            </props>
        </property>
    </bean>

我们使用 Java 7 和 Tomcat 7.0

【问题讨论】:

  • 错误显示缺少类com/amazon/redshift/exceptions/PGJDBCMessageKey。请检查此类缺少的库 jar。
  • @VivekSingh 前一天它工作正常,现在只有我得到这个错误,我将使用哪个 jar 来解决这个错误。这是我最近的错误。它在生产服务器中
  • 这与redshiftjdbc jar有关。您是否有任何机会在您的应用程序中进行了任何配置更改,
  • @VivekSingh 我正在使用 RedshiftJDBC41-1.1.6.1006.jar
  • 这个 jar 是否存在于已部署应用程序的 lib 文件夹中。能不能查一次。还要检查同一个 jar 的两个版本是否不存在

标签: java spring hibernate c3p0


【解决方案1】:

一些建议:

1) 从 CLASSPATH 的角度来看,确保 c3p0 的 jar 文件与应该包含 com.amazon.redshift.exceptions.PGJDBCMessageKey(可能是您的 RedshiftJDBC41-1.1.6.1006.jar)的库位于同一个“位置”。 t 将 redshift jar 放在应用程序服务器 lib 目录中,但将 c3p0 的 jar 文件放在 web 应用程序 lib 目录中,或类似的东西。它们应该在逻辑上相同的 CLASSPATH 中。

2) 将以下属性添加到您的 c3p0 配置中:

<property name="contextClassLoaderSource" value="library" />

这将确保 c3p0 线程尝试使用加载库的相同 ClassLoader 加载类,即与包含 c3p0 的逻辑CLASSPATH 相同。 (见the docs。)

3) 修复此问题,来自

<property name="maxConnectionAge" value="10" /> <!-- 1h -->

到这里

<property name="maxConnectionAge" value="3600" /> <!-- 1h, really this time -->

10 秒太快了,无法让连接过期,这会导致流失、记忆压力和各种不当行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多