0

休止状態を使用すると奇妙な動作が発生します。MySQLデータベースを操作して、休止状態と春を使用するJava Webアプリケーションがあります。

症状: 以下を使用して、SQL で接続されたセッションを確認します。

show processlist;

データソース構成で定義された接続の量を確認できますが、時間が経つと ID が変化し、接続が閉じられてから再接続されていると思われます。この動作は、トラフィックがない場合でも発生します。
プールされた接続がデータベースに ID を保持することを期待しています。

構成:

<bean id="DataSource"
    class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
    <property name="maxWait" value="10" />
    <property name="maxIdle" value="5" />
    <property name="maxActive" value="0" />
    <property name="validationQuery" value="SELECT 1"/>
    <property name="testOnBorrow" value="true" />
    <property name="testOnReturn" value="true"/> 
    <property name="testWhileIdle" value="true"/>
    <property name="timeBetweenEvictionRunsMillis" value="10000"/>
    <property name="minEvictableIdleTimeMillis" value="60000"/>     
</bean>
<bean id="SessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="DataSource"></property>
    <property name="mappingResources">
        <list>
            <value>
                data/entities/entity.hbm.xml
            </value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">
                org.hibernate.dialect.MySQLDialect
            </prop>
        </props>
    </property>
</bean>

<bean id="entityDaoImpl" class="data.dao.EntityDaoImpl">
    <property name="sessionFactory" ref="SessionFactory" />
</bean>

<bean id="SessionFactory2"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="DataSource"></property>
    <property name="mappingResources">
        <list>
            <value>
                data/entities/entity2.hbm.xml
            </value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">
                org.hibernate.dialect.MySQLDialect
            </prop>
        </props>
    </property>
</bean>

<bean id="entity2DaoImpl" class="data.dao.Entity2DaoImpl">
    <property name="sessionFactory" ref="SessionFactory2" />
</bean>

私の推測では、2 つの異なるセッション ファクトリが同じデータソースを使用しているという事実に関連している可能性があります。

また、Tomcat 6で実行されているSpring 2.5とHibernate 3.1.1を使用していることも追加します。多くの場所で、hibernateTemplateの使用を思いとどまらせていることに気づきましたが、コードはそれを使用しています。

編集:

監査を開いて、接続が何をしているかを理解しようとしました。

130806 10:58:43      13 Connect     user@localhost on database
130806 10:58:43      13 Query       SET NAMES hebrew
130806 10:58:43      13 Query       SET character_set_results = NULL
130806 10:58:43      13 Query       SHOW VARIABLES
130806 10:58:43      13 Query       SHOW COLLATION
130806 10:58:43      13 Query       SET autocommit=1
130806 10:58:43      13 Query       SET sql_mode='STRICT_TRANS_TABLES'
130806 10:58:43      13 Query       SELECT 1
130806 10:58:43      13 Query       SET autocommit=1
130806 10:58:54      13 Query       SET autocommit=1
130806 10:58:54      13 Query       SELECT 1
130806 10:58:54      13 Query       SET autocommit=1
130806 10:59:25      13 Query       SET autocommit=1
130806 10:59:25      13 Query       SELECT 1
130806 10:59:25      13 Query       SET autocommit=1
130806 11:00:27      13 Quit

私の理解では、これは、彼が Quit コマンドを取得したため、DB 側に問題がないことを示しています。繰り返しになりますが、データ ソース構成に欠けている keepAlive 構成があるのだろうか?

ありがとう

4

2 に答える 2

1

MySQL は、wait_timeout. 接続プールは、それらが停止していることを検出し、再接続します。

すべてが良いです...

于 2013-08-05T20:35:09.257 に答える
0

この動作の理由がわかりました。ルートはパラメーター minEvictableIdleTimeMillis です。

このパラメーターのドキュメントは次のように述べています。

アイドル状態のオブジェクト Evictor (存在する場合) によるエビクションの対象となる前に、オブジェクトがプール内でアイドル状態のままでいられる最小時間。

私の場合、アイドル状態の場合、60 秒後に接続が削除される可能性があることを意味します。

パラメータ timeBetweenEvictionRunsMillis のドキュメントには次のように記載されています。

アイドル状態のオブジェクト evictor スレッドの実行の間にスリープするミリ秒数。正でない場合、アイドル オブジェクトの Evictor スレッドは実行されません。

私の場合、立ち退きチェックは 10 秒ごとに行われます。私の構成に欠落している別のパラメーターは、文書化された numTestsPerEvictionRun です。

アイドル状態のオブジェクト Evictor スレッド (存在する場合) の各実行中に検査するオブジェクトの数。

私の場合、3 つの接続 (デフォルト) がエビクションのためにチェックされます。

したがって、全体として 10 秒ごとに (アプリケーションがロードされる最初の 1 分間を除く)、10 接続のうち 3 つが削除されます。アイドル状態(testWhileIdleがtrue)のときにvalidationQueryでテストされたとしても。

私は、validationQuery クエリ チェックがアイドル時間カウントをリセットすると考えました (クエリが接続を介して送信されているため)。しかし、私は間違っていました。

したがって、最終的な解決策は、minEvictableIdleTimeMillis を 60000 ではなく 600000 に設定して、アイドル状態の接続を長く維持することでした。

于 2013-08-06T12:26:50.120 に答える