1

私はしばらくTomcatを使用しています。しかし、それが実際にどのように機能するか、特にスレッド プーリングと JDBC 接続プーリングについて十分に理解したことがありません。

たとえば、標準の Spring Web アプリ (c3p0 接続プールを使用) を考えてみましょう。私の質問は

  1. TC の起動時に、それぞれが applicationContext を持つ N 個のスレッドを作成しますか?

  2. もしそうなら、それは各スレッドが作成された Bean インスタンスの独自のリストを持つことを意味しますか?

  3. Bean 定義の 1 つは

<bean id="dataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
  <property name="driverClass" value="${db.driverClassName}"/>
  <property name="jdbcUrl" value="${db.url}"/>
  <property name="user" value="${db.username}"/>
  <property name="password" value="${db.password}"/>
  <property name="minPoolSize" value="5" />
</bean>

これにより、この Bean の作成時に 5 つの JDBC 接続が作成されます。それは私たちがで終わるつもりだということですか

5 接続 x N スレッド = 5N 接続?

これは私には正しく聞こえません。JDBC プールはすべてのスレッドで共有されていると思いました。しかし、JDBC プール (ComboPooledDataSource Bean として定義) は、applicationContext の一部として作成されているようですよね?

4

1 に答える 1

4

TC の起動時に、それぞれが applicationContext を持つ N 個のスレッドを作成しますか?

いいえ、Web アプリケーション内のすべてのスレッドで使用可能なすべての Bean を持つコンテキストを 1 つだけ作成します。つまり、Spring Bean (デフォルトではシングルトン) は通常、複数のスレッドによって同時にアクセスされるため、スレッドセーフである必要があります。通常、Spring Bean はステートレスであり、定義上スレッドセーフであるため、これで問題ありません。

さらに、5 つの接続を保持する JDBC 接続プールは 1 つだけです。すべての Tomcat Web スレッド (および、作成されている場合はその他のスレッド) は、これら 5 つの接続に対して競合します。

したがって、残りの質問はもはや関係ありません。Spring がすべてのスレッドのコンテキストを作成するのはなぜだと思いますか?

于 2012-10-05T20:08:08.813 に答える