2

c3p0 を使用して、MySQL へのデータベース接続を管理しています。問題は、一部の接続が永久に保持されていることです。1000 接続の制限がありますが、なんらかの理由で、1200 の開いている接続があります。それを調査するために、Tomcat サーバー シェルで次のコマンドを実行します。

netstat -n |grep 3306|grep ESTABILISHED|wc -l

そしてそれは1200を返します

ここにc3p0構成がありますcontext.xml

 <Resource name="jdbc/xxxx" auth="Container"
          user="xxxxxx"
          password="xxxxx"
          driverClass="com.mysql.jdbc.Driver"
          jdbcUrl ="jdbc:mysql://xxxx:3306/xxx"
          factory="org.apache.naming.factory.BeanFactory"
          type="com.mchange.v2.c3p0.ComboPooledDataSource"
          maxPoolSize="1000"
          minPoolSize="200"
          numHelperThreads="10"
          acquireIncrement="50"
          maxStatementsPerConnection="0"
          idleConnectionTestPeriod="200"
          maxIdleTime = "1000"
          maxIdleTimeExcessConnections = "180"
          maxStatements="200"
          unreturnedConnectionTimeout="10"
          debugUnreturnedConnectionStackTraces="true"
          />

プールの最大サイズが 1000 の場合、どのようにして 1200 の接続を確立できますか? 私のMySQLサーバーはで構成されています

interactive_timeout 28800
wait_timeout    1300

OBS: このアプリケーションでは休止状態を使用していません (いくつかのクラスでのみ)。ほとんどの接続は、純粋な JDBC コードを介して行われます。

4

1 に答える 1

0

いくつかの可能性があります。

最も可能性が高いのは、この Resource 要素を$CATALINA_BASE/conf/context.xmlそのファイルに配置したことで、すべての Web アプリケーションにデフォルトの context.xml が提供されます。したがって、6 つの Web アプリケーションがある場合は、6 つの接続プールがあります。最小ポーリング サイズは 200 であるため、データベースに対して開かれる接続は最小で 200*6=1200 になります。

もう 1 つの可能性は、Web アプリケーションが再ロードされたことです。新しい接続プールを取得する必要があり、古い接続プールは GC されます。ただし、リロード時にメモリ リークが発生した場合 (気づかずに非常に簡単に実行できます)、開いている接続と共に接続プールがメモリ内に保持され、合計接続数が増加する可能性があります。

定義を に入れるにはserver.xml:

<Server>
  <GlobalNamingResources>
     <Resource name="jdbc/xxxx">...</Resource>
  </GlobalNamingResources>
</Server>

そしてこれでcontext.xml

  <ResourceLink name="jdbc/xxxx"
      global="jdbc/xxxx"
      type="com.mchange.v2.c3p0.ComboPooledDataSource" />
于 2012-05-10T09:05:02.717 に答える