1

C3P0 を使用して接続をプールする Web アプリケーションがあります。C3P0 をデータ ソースとして JdbcTemplate に挿入します。ここでこれを行う方法を確認できます。

<bean id="dataSourceDev" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${databasedev.driver}" />
    <property name="jdbcUrl" value="${databasedev.url}"/>
    <property name="user" value="${databasedev.username}"/>
    <property name="password" value="${databasedev.password}"/>

    <property name="initialPoolSize" value="5" />
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="1000" />
    <property name="acquireIncrement" value="5" />
    <property name="maxStatements" value="1000" />
    <property name="maxStatementsPerConnection" value="1000"/>
    <property name="maxIdleTime" value="10800"/> <!-- 3 hours -->
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg>
         <ref bean="dataSourceDev" />
    </constructor-arg>
</bean>

<bean id="someDaoBean" class="com.gedi.platform.dao.SomeDaoClass">
    <property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>

<bean id="someResourceClass" class="com.gedi.platform.SomeResourceClass">
    <property name="someDao" ref="someDaoBean" />
</bean>

Java EE Web アプリケーションであることがわかります。Jetty をアプリケーション サーバーとして使用します。私の質問は、Jetty が Bean をどのようにインスタンス化し、それが接続プーリングにどのように影響するかです。数十人のユーザーが異なる時間に Web サイトを使用している場合、これらのユーザーはすべて同じ接続プールに配置されますか? それとも、すべての HTTP クライアントが Resource、DAO、JdbcTemplate、および C3P0 の新しいインスタンスを作成する、クライアントごとに 1 つの接続プールしかないのでしょうか?

私は明確ですか?私が必要としているのは、すべての HTTP 要求に対して 1 つの接続プールを用意することです。これらの要求がボストンまたはニュージーランドの Web ブラウザーから送信されたものであるかどうかは関係ありません。このようにして、接続プールは最大の効果を発揮します。ただし、すべての HTTP クライアントに対して新しい接続プールがインスタンス化される場合、プーリングはあまり改善されません。

編集

重要な情報 - JAX-RS の Jersey 参照実装を使用して、RESTful インターフェースを生成します。したがって、サーブレットは、それらを処理する適切な Resource クラス/メソッドを見つける Jersey を介してリクエストをディスパッチします。Jersey はリクエストごとにこれらのクラスを再インスタンス化するのか、それとも常に 1 つのインスタンスを保持するのか疑問に思います。

4

2 に答える 2

1

Spring は を作成してbeansそれらをキャッシュするため、Bean をprototypeスコープ (リクエストごとに新しい Bean を作成する) として指定しない限り、すべての Bean はデフォルトでシングルトンになります。Jetty は干渉しません。

リクエストが着信すると、DispatcherServletはリクエストをキャッチし、適切なハンドラに渡します。Bean として宣言されていない場合、ハンドラーは同じ Bean ですprototype

接続プールを正しく理解しました。これがまさにコンセプトが作成された理由です。リクエストがどこから来たかに関係なく、任意の時点でのデータベースへの最大接続数は、maxPoolSizeプロパティで定義した数になります。

于 2013-02-06T20:36:51.950 に答える
1

ここでは、Jersey も Jetty も関係ありません。ここでは春が重要です。そしてSpringでは、すべてのBean(dataSourceDevjdbcTemplateおよび などsomeDaoBean)はシングルトンです。つまり、Spring アプリケーション コンテキストが開始されると、それぞれのインスタンスが 1 つだけ作成されます。

つまり、何を使用してもDataSource(Web リクエスト、バックグラウンド ジョブなど)、同じインスタンス (つまり、同じ接続プール) が使用されます。リクエストごとに接続プールが作成された場合、それほど改善されなかったことは間違いありません。実際には、はるかに遅くなります。

しかし、あなたの場合 (そしてこれが Web アプリケーションの 99% の動作方法です)、データベース アクセスを必要とするすべてのコードが競合し、同じ接続を再利用します (または、利用できない場合は待機します)。ところで、データベースが実際に 1000 の同時接続を処理できることを確認してください。

于 2013-02-06T20:34:18.903 に答える