1

私はSpringプロジェクトで次のデータベース構成を持っています -

<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="75" />
        <property name="initialSize" value="10" />
        <property name="testOnBorrow" value="true" />
        <property name="validationQuery" value="SELECT 1" />
        <property name="maxWait" value="10000"></property>
    </bean>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
        autowire="byName">
        <property name="dataSource">
            <ref local="dataSource" />
        </property>
    </bean>

アプリケーションはしばらくの間 (30 分から 2 時間まで、場合によって異なります) 実行され、しばらくするとハングし始めます。つまり、ブラウザはサーバーの応答を待ち続けます。ログを確認すると、アプリケーションがデータベース クエリでハングしていることがわかりました -

01/22 16:56:03 3024208 [http-bio-8080-exec-2] DEBUG DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL statement [SELECT * FROM mytable where id = ?]

データベースと対話し、コマンドラインまたは mysql ワークベンチからクエリを実行できるため、データベースへの接続は適切です。

問題の原因は何ですか? この時点で、例外がスローされず、スタックトレースがないため、どの方向を見ればよいか完全に途方に暮れています。この問題に取り組むためにどのようなアプローチを使用しますか?

4

1 に答える 1

0

アプリケーションがハングした瞬間にスレッド ダンプを作成しようとしましたか? Linux を使用している場合は、次のことを試すことができます。

$ kill -3 <pid>

スレッド ダンプは標準出力に書き込まれます。コンソールまたは /logs/stdout または /logs/catalina.out に記録される場合があります。

于 2013-01-22T11:54:07.913 に答える