5

私のプロジェクトのセットアップは-

  1. 永続性のためのSpringJDBC
  2. 接続プール用のApacheDBCP1.4
  3. Linux上のMysql5

これは、データベースとの相互作用をキャプチャする私のアプリケーションのログです。

2013-01-29 15:52:21,549 DEBUG http-bio-8080-exec-3 org.springframework.jdbc.core.JdbcTemplate - Executing SQL query [SELECT id from emp]
2013-01-29 15:52:21,558 DEBUG http-bio-8080-exec-3 org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource
2013-01-29 15:52:31,878  INFO http-bio-8080-exec-3 jdbc.connection - 1. Connection opened  org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
2013-01-29 15:52:31,878 DEBUG http-bio-8080-exec-3 jdbc.connection - open connections:  1 (1)
2013-01-29 15:52:31,895  INFO http-bio-8080-exec-3 jdbc.connection - 1. Connection closed  org.apache.commons.dbcp.DelegatingConnection.close(DelegatingConnection.java:247)
2013-01-29 15:52:31,895 DEBUG http-bio-8080-exec-3 jdbc.connection - open connections:  none
2013-01-29 15:52:41,950  INFO http-bio-8080-exec-3 jdbc.connection - 2. Connection opened  org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
2013-01-29 15:52:41,950 DEBUG http-bio-8080-exec-3 jdbc.connection - open connections:  2 (1)
2013-01-29 15:52:52,001  INFO http-bio-8080-exec-3 jdbc.connection - 3. Connection opened  org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
2013-01-29 15:52:52,002 DEBUG http-bio-8080-exec-3 jdbc.connection - open connections:  2 3 (2)
2013-01-29 15:53:02,058  INFO http-bio-8080-exec-3 jdbc.connection - 4. Connection opened  org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
2013-01-29 15:53:02,058 DEBUG http-bio-8080-exec-3 jdbc.connection - open connections:  2 3 4 (3)
2013-01-29 15:53:03,403 DEBUG http-bio-8080-exec-3 org.springframework.jdbc.core.BeanPropertyRowMapper - Mapping column 'id' to property 'id' of type int
2013-01-29 15:53:04,494 DEBUG http-bio-8080-exec-3 org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource

ログから2つのことが明らかです-

  1. 接続プールは、クエリを実行する最初の要求を受信したときにのみ接続の作成を開始します。
  2. 4つの接続のプールは、初期化に30秒近くかかります。

私の質問は-

  1. 起動時に自動的に初期化するようにDBCPをどのように構成する必要がありますか?
  2. 接続を作成するのに本当に長い時間がかかる必要がありますか?

注:C3P0またはTomcat接続プールへの切り替えを提案しないでください。私はそれらの解決策を知っています。簡単な修正よりも、目前の問題を理解することに興味があります。それに加えて、DBCPでも非常に基本的なことが可能になるはずです。

dbcontextの内容-

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${db.driver}" />
    <property name="url" value="${db.jdbc.url}" />
    <property name="username" value="${db.user}" />
    <property name="password" value="${db.password}" />
    <property name="maxActive" value="20" />
    <property name="initialSize" value="4" />
    <property name="testOnBorrow" value="true" />
    <property name="validationQuery" value="SELECT 1" />
</bean>
4

3 に答える 3

6

initialSize は、最初に接続を要求するまで有効になりません。Java ドキュメントからBasicDataSource#setInitialSizeへ

接続プールの初期サイズを設定します。

注: 現在、このメソッドは、プールが初期化されると効果がありません。プールは、getConnection、setLogwriter、setLoginTimeout、getLoginTimeout、getLogWriter のいずれかのメソッドが最初に呼び出されたときに初期化されます。

init-method="getLoginTimeout"これを確認するには、Bean に追加してみてください。

于 2013-02-02T16:22:28.073 に答える
3

ServletContextListener.contextInitialized()Webアプリケーションの場合、DataAccessレイヤーを使用して、メソッドを実装し、テストクエリ(たとえば、Emp Limit 1からIDを選択)を実行できます。これにより、接続プールが初期化され、アプリケーションがWebから実際のユーザーにサービスを提供し始める前に準備が整います。

于 2013-02-07T13:51:49.163 に答える
2

initialSizeプロパティを見てください-特にプールが初期化されるときについての部分。sbridgesが指摘しているように、init-methodBeanのプロパティを使用して、プールの作成をトリガーするメソッドの1つを呼び出すことができます。

また、接続を作成するのに平均7.5秒かかる理由を調べる必要があります...

乾杯、

于 2013-01-29T11:20:07.253 に答える