使用休眠时,数据库连接太多

时间:2012-05-31 05:28:21

标签: java oracle spring hibernate

我是新来的冬眠和春天。我们有一个基于spring的服务,它使用hibernate使用oracle数据库。此服务部署到4台主机。

我们有一个使用我们服务的外部Java客户端。它每秒大约进行约40次服务调用。理想情况下,最多应该有40个(呼叫)* 4个(主机)= 160个开放连接。但由于某种原因,我们服务使用的数据库连接增长甚至超过600.

我们可以设置一些指标来检查数据库连接中的泄漏吗?我们怎样才能找到这些泄漏连接?

任何帮助将不胜感激。

谢谢, 凯文

4 个答案:

答案 0 :(得分:2)

If you are using 3rd party jars for connection polling then you can enable their logging and set logAbandoned property to true. So it will log your all logAbandoned connections.

As shown below - 
<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>

答案 1 :(得分:1)

如果您正在使用具有Hibernate的连接池,那么您的池提供程序可能会保持很多连接,即使它们未被使用。如果是c3po,请检查connection.minPoolSizeconnection.maxPoolSize属性。

答案 2 :(得分: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>

你可以验证吗?

答案 3 :(得分:0)

您可以在log4j.xml中添加以下appender,所有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>