2012-05-31 35 views
1

我是休眠和彈簧的新手。我們有一個基於spring的服務,它使用hibernate的oracle數據庫。該服務部署到4個主機。使用休眠時數據庫連接太多

我們有一個使用我們的服務的外部Java客戶端。這使得每秒約有40次服務呼叫。所以理想情況下,最多應該有40個(呼叫)* 4(主機)= 160個打開的連接。但由於某種原因,我們的服務所使用的數據庫連接數增長超過600個。

我們可以設置一些指標來檢查數據庫連接中的泄漏嗎?我們如何才能找出這些泄漏連接?

任何幫助,將不勝感激。

感謝, 凱文

回答

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> 
+0

如果我啓用logAbandoned,這些日誌將在哪裏? – Kevindra

+0

因爲我使用c3p0.ComboPooledDataSource,它說logAbandoned是無效的屬性。 – Kevindra

+0

我正在使用Tomcat池,所以屬性就在那裏。確實必須有一些財產來記錄被遺棄的連接。您將不得不更多地探索c3p0屬性。 –

1

如果您正在使用與Hibernate的連接池,那麼你的游泳池提供商可能會保持很多連接周圍,即使沒有使用它們。如果是c3po,請檢查connection.minPoolSizeconnection.maxPoolSize屬性。

+0

我最大和最小池的大小設置在我的配置中: Kevindra

+0

嘗試將maxPoolSize設置爲1並查看是否會導致問題遠。 – Jeshurun

0

我的數據源豆看起來是這樣的:

<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> 

能否請你確認?

+0

請將它添加到問題中,而不是回答 –

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>