3

Linux環境でTomcatを使用して、Java WebアプリケーションでHibernateとSpringをマージするプロジェクトを行っています。Mysql の 8 時間のタイムアウトの問題により、C3P0 を使用して Mysql データベースとの接続プールを管理したいと考えています。しかし、それを使用すると、多数のスレッドが作成されます。リクエストごとに、メモリの増加とその種類のスレッドを示すメモリステータスでそれらすべてを印刷したため、私はそれを理解しました:

  • 名前: C3P0PooledConnectionPoolManager[identityToken->1hged7o8r13kpj7n1h3ycia|39c446]-HelperThread-#0 デーモン: 真のグループ! メイングループの親: システムが稼働中: true 中断: false
  • 名前: C3P0PooledConnectionPoolManager[identityToken->1hged7o8r13kpj7n1h3ycia|17ec0e8]-AdminTaskTimer デーモン: 真のグループ! メイングループの親: システムが稼働中: true 中断: false

十分な時間が経過すると、これらのような 500 を超えるスレッドを生成できます。

ここに私の 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">5</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">5</property>

    <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/myBase</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password"></property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <property name="hibernate.default_schema">myProject</property>
    <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
    <property name="show_sql">false</property>

    <property name="cache.provider_class">
      org.hibernate.cache.NoCacheProvider
    </property>         

C3P0 プロパティ ファイルも追加しようとしましたが、ヘルパー スレッド数を減らす以外は、使用されていないスレッドは削除されません。

    c3p0.maxStatements=5    

c3p0.maxIdleTime=10

c3p0.numHelperThreads=1

c3p0.testConnectionOnCheckout=true
c3p0.preferredTestQuery=SELECT 1

c3p0.initialPoolSize=1
c3p0.minPoolSize=1
c3p0.maxPoolSize=10

c3p0.acquireIncrement=1
c3p0.idleConnectionTestPeriod=1

なぜこれが起こるのか、この問題を解決する方法を知っている人はいますか?

どうもありがとう。

4

3 に答える 3

2

c3p0ヘルパースレッドとタイマースレッドの乗算が表示されている場合は、1つだけにしたいときに、どういうわけか多数のc3p0データソースを作成しています。これは、アプリをホットリロードしているが、リサイクル時に古いc3p0データソースをclose()するのを忘れた場合に発生することがあります。

事実上、データソースを「リーク」しているように見えます。なぜ/どこでこれが起こっているのかを理解する必要があります。いくつかの手がかりについては、INFOレベルでのc3p0DataSource初期化メッセージのログを確認してください。たとえば、文字列「Initializingc3p0pool」を検索します。

幸運を!

于 2012-12-12T19:00:35.787 に答える
2

一度に多くの接続を必要としないことを念頭に置いて、問題を解決するためのプロパティの組み合わせを見つけました。

  • c3p0.maxStatements=5
  • c3p0.maxIdleTime=10
  • c3p0.numHelperThreads=3
  • c3p0.testConnectionOnCheckout=true
  • c3p0.preferredTestQuery=SELECT 1
  • c3p0.initialPoolSize=1
  • c3p0.minPoolSize=1
  • c3p0.maxPoolSize=1 c3p0.acquireIncrement=1
  • c3p0.idleConnectionTestPeriod=1
  • c3p0.maxAdministrativeTaskTime=1

みんなありがとう

于 2012-12-13T09:42:19.217 に答える
1

c3p0.minPoolSize に比例する数のスレッドが作成されると予想されc3p0.maxPoolSize、最大値は 10 です。

http://www.mchange.com/projects/c3p0/#other_ds_configuration " numHelperThreadsおよび maxAdministrativeTaskTime は、DataSource スレッド プールの動作を構成するのに役立ちます。デフォルトでは、各 DataSource には関連付けられたヘルパー スレッドが 3 つだけあります。重い負荷の下でパフォーマンスが低下するように思われる場合または、JMX または PooledDataSource の直接検査を介して、「保留中のタスク」の数が通常 0 より大きいことを確認した場合は、numHelperThreads を増やしてみてください。maxAdministrativeTaskTime は、タスクが無期限にハングし、「APPARENT DEADLOCK」メッセージが表示されるユーザーに役立つ場合があります。 (詳細については、付録 A を参照してください。)"

numHelperThreads は、DataSource ごとに使用されるスレッド数を定義するため、実際にはnumHelperThreads=1.

C3P0 が 1 つのスレッドのみを消費することを確認する唯一の方法は、1 に設定する c3p0.minPoolSize ことc3p0.maxPoolSizeですが、これは接続プーリングの目的を無効にします。

于 2012-12-12T12:56:02.733 に答える