web-dev-qa-db-ja.com

HibernateはResultSet例外を抽出できませんでした

TomcatサーバーにGWTアプリケーションをデプロイしました。すべてが正常に動作していますが、次の例外が発生することがあります。

org.hibernate.exception.JDBCConnectionException: could not extract ResultSet
        at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.Java:389)
        at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.Java:579)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.Java:265)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.Java:305)
        at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.Java:62)
        at javax.servlet.http.HttpServlet.service(HttpServlet.Java:644)
        at javax.servlet.http.HttpServlet.service(HttpServlet.Java:725)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:301)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
        at org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:239)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
        at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:219)
        at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:106)
        at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:503)
        at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:136)
        at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:74)
        at org.Apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.Java:610)
        at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:88)
        at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:526)
        at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1017)
        at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:652)
        at org.Apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.Java:222)
        at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Java:1575)
        at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.Java:1533)
        at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142)
        at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617)
        at Java.lang.Thread.run(Thread.Java:744)
Caused by: org.hibernate.exception.JDBCConnectionException: could not extract ResultSet
        at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.Java:132)
        at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.Java:49)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.Java:125)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.Java:110)
        at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.Java:61)
        at org.hibernate.loader.Loader.getResultSet(Loader.Java:2040)
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.Java:1837)
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.Java:1816)
        at org.hibernate.loader.Loader.doQuery(Loader.Java:900)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.Java:342)
        at org.hibernate.loader.Loader.doList(Loader.Java:2526)
        at org.hibernate.loader.Loader.doList(Loader.Java:2512)

ご覧のとおり、Hibernateを使用して次の構成でデータベースを管理しています。

<!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <property name="connection.url">jdbc:mysql://server:3306/db</property>
        <property name="connection.username">username</property>

        <property name="connection.password">password</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="hibernate.c3p0.min_size">1</property>
        <property name="hibernate.c3p0.max_size">15</property>
        <property name="hibernate.c3p0.timeout">300</property>
        <property name="hibernate.c3p0.max_statements">50</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>

        <!-- SQL dialect -->
        <property name="dialect">com.ohapp.webtattoon.server.service.Mysql5BitBooleanDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">false</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">validate</property>

これがなぜ起こるか私には手がかりがありません。本当に助かります。

ありがとうございました

7
belyid

j.sは私を正しい方向に向けましたが、私の問題を解決しませんでした。

J.sの回答に基づいて、休止状態の構成を次のように変更しました。

<!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <property name="connection.url">jdbc:mysql://server:3306/db?autoReconnect=true</property>
        <property name="connection.username">user</property>        
        <property name="connection.password">password</property>

        <!-- C3P0 connection pool -->
        <property name="hibernate.c3p0.timeout">600</property>
        <property name="hibernate.c3p0.maxIdleTimeExcessConnections">20</property>

        <!--  Connection testing settings -->
        <property name="hibernate.c3p0.validate">false</property>
        <property name="hibernate.c3p0.idle_test_period">30</property>
        <property name="hibernate.c3p0.automaticTestTable">conTestTable</property>

        <!-- SQL dialect -->
        <property name="dialect">com.ohapp.webtattoon.server.service.Mysql5BitBooleanDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">false</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">validate</property>

主な違いは、プロパティ「hibernate.c3p0.idle_test_period」と「hibernate.c3p0.automaticTestTable」です。私のプール内の接続が引き続き有効であることを保証する設定により、エラーがデッド接続を使用するのを防ぎます。

4
belyid

接続プールの構成が不完全なようです。接続のタイムアウトは300秒に設定されています。

<property name="hibernate.c3p0.timeout">300</property>

したがって、接続が無効になる可能性があります。これらの無効な接続は、これらの接続の処理に関するルールを指定するまで、接続プールから破棄されません。

次の行を追加することにより、すべての接続チェックアウトで接続テストが実行され、接続が有効であることを確認します。

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

接続テストの詳細: c3p0接続テスト

Edit:構成には存在しない、別の非常に重要なプロパティがあります。

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

このプロパティがないと、c3p0はまったく使用されません。わかりませんでした。

5
j.s