1

私は冬眠と春に不慣れです。Hibernateを使用してOracleデータベースを使用するSpringベースのサービスがあります。このサービスは4つのホストに展開されます。

サービスを使用している外部Javaクライアントが1つあります。1秒あたり約40回のサービスコールを行います。したがって、理想的には、最大40(呼び出し)* 4(ホスト)=160のオープン接続が存在する必要があります。しかし、何らかの理由で、私たちのサービスで使用されるDB接続は600を超えてさらに増加し​​ます。

DB接続のリークをチェックするためのいくつかのメトリックを設定できますか?これらのリーク接続をどのように見つけることができますか?

どんな助けでもいただければ幸いです。

ありがとう、ケビン

4

4 に答える 4

2

接続ポーリングにサードパーティのjarを使用している場合は、それらのロギングを有効にして、logAbandonedプロパティをtrueに設定できます。したがって、すべてのlogAbandoned接続がログに記録されます。

以下に示すように-

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
        <property name="driverClassName" value="${dataSource.driverClassName}" />
        <property name="url" value="${dataSource.url}" />
        <property name="username" value="${dataSource.username}" />
        <property name="password" value="${dataSource.password}" />
        <property name="validationQuery" value="${datasource.validationQuery}" />
        <property name="maxActive" value="${datasource.maxActive}" />
        <property name="maxIdle" value="${datasource.maxIdle}" />
        <property name="maxWait" value="${datasource.maxWait}" />
        <property name="testOnBorrow" value="true" />
        <property name="testWhileIdle" value="true" />      
        <property name="minIdle" value="${datasource.minIdle}" />
        <property name="initialSize" value="${datasource.initialSize}" />
        <property name="timeBetweenEvictionRunsMillis" value="${datasource.timeBetweenEvictionRunsMillis}" />
        <property name="logAbandoned" value="${datasource.logAbandoned}" />
</bean>
于 2012-05-31T05:40:58.660 に答える
1

Hibernateで接続プールを使用している場合、プールプロバイダーは、使用されていない場合でも、多くの接続を維持している可能性があります。c3poの場合は、connection.minPoolSizeとのconnection.maxPoolSizeプロパティを確認してください。

于 2012-05-31T05:40:41.233 に答える
0

私のデータソース Bean は次のようになります。

<bean id="fssDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass">
         <util:property-path path="FSSConfiguration.driverName"/>
    </property>
    <property name="jdbcUrl">
        <util:property-path path="FSSConfiguration.url" />
    </property>
    <property name="user">
            <util:property-path path="FSSConfiguration.username" />
    </property>
    <property name="password">
            <util:property-path path="FSSConfiguration.password" />
    </property>
    <property name="initialPoolSize" value="1" />
    <property name="minPoolSize" value="1" />
    <property name="maxPoolSize" value="20" />
    <property name="maxIdleTime" value="240" />
    <property name="checkoutTimeout" value="60000" />
    <property name="acquireRetryAttempts" value="0" />
    <property name="acquireRetryDelay" value="1000" />
    <property name="debugUnreturnedConnectionStackTraces" value="true" />
    <property name="unreturnedConnectionTimeout" value="300" />
    <property name="numHelperThreads" value="1" />
    <property name="preferredTestQuery" value="SELECT 1 FROM DUAL" />
</bean>

検証していただけますか?

于 2012-05-31T07:09:38.957 に答える
0

log4j.xml に次のアペンダーを追加すると、すべての c3p0 ログが ${catalina.home}/logs/c3poLog.log ファイルに送られます -

<appender name="c3poLogs" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="Threshold" value="DEBUG"/>
    <param name="Append" value="true"/>
    <param name="File" value="${catalina.home}/logs/c3poLog.log"/>
    <!--<param name="DatePattern" value=".yyyy-MM-dd"/>-->
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"/>
    </layout>
</appender>


<category name="com.mchange.v2" additivity="false">
    <priority value="${log4j.category.com.mchange.v2}"/>
    <appender-ref ref="c3poLogs"/>
</category>
于 2012-05-31T07:21:08.987 に答える