5

Web サイトと複数のモバイル クライアントを強化するサーバー側アプリケーションを作成しました。データアクセスにはHibernateを使用しました。後で、アプリが 1 日後に失敗することを発見しました。オンラインで調べたところ、MySQL が 8 時間後に「古い」接続を終了するというよく知られた問題であることがわかりました。これを回避するために、 を含める?autoReconnect=true、 を使用するc3P0などの多くの提案を見つけました。autoReconnectは公式に推奨されていないため (特に運用環境では)、適用しても効果がなかったため、 を選択することにしましたc3p0。残念ながら、c3p0私のファイルに構成を導入した後、アプリケーション は私が呼び出したコードのどこかにhibernate.cfg.xmlスローを開始します。NullPointerExceptiondbSession.close()HibernateUtil.getSessionFactory()null. 必要な jar (c3p0-0.9.2-pre2.jar、hibernate-core-3.3.1.GA.jar、hibernate-c3p0-3.3.2.GA.jar、mchange-commons-java-0.2.1) を追加しました。 .jar および c3p0-oracle-thin-extras-0.9.2-pre2.jar) のすべてが必要だとは思いませんが。この問題について説明している多くのページを確認しましたが、まだ適切に設定できません。c3p0Hibernateをセットアップするための、「初心者に優しい」実装が簡単な段階的な手順を教えてください。私はJDK 1.6、MySQL 5.5でHibernate 3.3.6を使用しており、Netbeans 7.0で開発しています。

これが私のhibernate.cfg.xml

<?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">
<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="hibernate.connection.url">jdbc:mysql://localhost:3306/religion_app</property>
    <property name="hibernate.connection.username">*****</property>
    <property name="hibernate.connection.password">*****</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>

    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
    <property name="connection.autoReconnect">true</property>
    <property name="connection.autoReconnectForPools">true</property>
    <property name="connection.is-connection-validation-required">true</property>

    <!-- configuration pool via c3p0-->
    <property name="c3p0.acquire_increment">1</property> 
    <property name="c3p0.idle_test_period">120</property> <!-- seconds --> 
    <property name="c3p0.max_size">100</property> 
    <property name="c3p0.max_statements">0</property> 
    <property name="c3p0.min_size">10</property> 
    <property name="c3p0.timeout">180</property> <!-- seconds -->
    <property name="c3p0.preferredTestQuery">select 1;</property>

    <!--Mappings go here-->
  </session-factory>
</hibernate-configuration>

c3p0 (slf4j なし) を追加した後に得たものは次のとおりです。

    May 23, 2012 2:42:14 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet LoginChurch threw exception
java.lang.NullPointerException
    at com.pacesolutions.religionapp.services.LoginChurch.processRequest(LoginChurch.java:109)
    at com.pacesolutions.religionapp.services.LoginChurch.doPost(LoginChurch.java:138)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
    at java.lang.Thread.run(Thread.java:722)

May 23, 2012 2:45:13 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet LoginChurch threw exception
java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
    at org.hibernate.connection.C3P0ConnectionProvider.<clinit>(C3P0ConnectionProvider.java:52)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at java.lang.Class.newInstance0(Class.java:372)
    at java.lang.Class.newInstance(Class.java:325)
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:73)
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56)
    at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:414)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)
    at com.pacesolutions.religionapp.HibernateUtil.<clinit>(HibernateUtil.java:23)
    at com.pacesolutions.religionapp.services.LoginChurch.processRequest(LoginChurch.java:68)
    at com.pacesolutions.religionapp.services.LoginChurch.doPost(LoginChurch.java:143)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
    at java.lang.Thread.run(Thread.java:722)


    note The full stack trace of the root cause is available in the Apache Tomcat/6.0.26 logs.

私のHibernate構成ファイルのほとんどは、Netbeansによって生成されました。データベースを地上に置いてから、Netbeans の Hibernate ウィザードを使用して、そこから構成ファイル、エンティティ クラス、およびマッピング ファイルを生成しました。これらは、c3p0 を導入する前は正しく機能していました (ただし、8 時間後には機能しなくなります)。プロジェクトで Mecurial を使用し、プロジェクト全体を c3p0 を導入する前の時点に戻すと、再び動作します (8 時間)。hibernate.cfg.xml のすべての c3p0 構成を手動で削除しても、アプリは再び機能します。私は何が間違っているのでしょうか?

4

3 に答える 3

7

C3P0 構成に必要な jar はc3p0-0.9.2-pre2.jarmchange-commons-java-0.2.1.jarです。また、追加でc3p0.propertiesをクラスパスに入れる必要があります。

以下は、Hibernate で C3P0 を使用しているときに構成する必要があるプロパティです。

hibernate.cfg.xml

<property name="connection.provider_class">
                org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.acquire_increment">1</property> 
<property name="hibernate.c3p0.idle_test_period">100</property>
<property name="hibernate.c3p0.max_size">100</property> 
<property name="hibernate.c3p0.max_statements">100</property> 
<property name="hibernate.c3p0.min_size">10</property> 
<property name="hibernate.c3p0.timeout">180</property>

c3p0.properties

  • 各チェックアウトで接続を検証できますがc3p0.testConnectionOnCheckout=true、これはコストのかかる操作です。

  • それ以外の場合は、定期的に接続を再試行できます。

    c3p0.acquireRetryAttempts = 4
    c3p0.acquireRetryDelay = 5000

    これにより、連続する試行ごとに 5 秒の遅延で 4 回再試行されます。

于 2012-05-22T05:45:37.563 に答える
1

c3p0はSLF4Jに依存しません。そのライブラリをクラスパスに追加することで問題が解決した場合、それは興味深いことですが、説明するのはそれほど簡単ではありません。

問題が発生したときにログに記録された元のNPETomcatのスタックトレースが役立ちます。(私はc3p0の開発者です。)

c3p0.propertiesは、アプリのCLASSPATHの最上位にある必要があることに注意してください。これは、他の構成ファイルが配置されている場所ではない場合があります。c3p0.propertiesは、ClassLoaderリソースとしてロードされます。

于 2012-05-23T17:26:17.963 に答える
0

上記のように、商用プーリング ライブラリを使用してバグを修正できます。@NayanWadekar の提案どおりに c3p0 を使用しました。c3p0 は SLF4J に依存していることに注意してください。したがって、クラスパスに c3p0 jar を含めた後、クラスパスに SLF4J jar も追加する必要があります。このことの秘訣は、それらの SLF4J jar が存在しない場合でも、コンパイラは文句を言わず、アプリのデプロイ後にのみエラーが発生することです。また、Netbeans を使用している場合は、slf4.org にバンドルされているすべての jar から SLF4J ライブラリを作成しないください。その理由は、一部の jar は同じプロジェクトで一緒に使用することを意図していないためです。ライブラリから次の 2 つの jar を単独で使用するだけです: slf4j-api-1.6.4.jar および slf4j-jdk14-1.6.4.jar。詳細については、 www.slf4j.orgをご覧ください。

于 2012-05-23T11:46:16.973 に答える