我是新来的冬眠和春天。我们有一个基于 Spring 的服务,它使用 Oracle 数据库和休眠。此服务部署到 4 个主机。
我们有一个外部 Java 客户端正在使用我们的服务。它每秒进行约 40 次服务调用。所以理想情况下,最多应该有 40(calls)*4(hosts)=160 个打开的连接。但由于某种原因,我们的服务使用的数据库连接数增长了 600 多个。
我们可以设置一些指标来检查数据库连接中的泄漏吗?我们如何才能找出这些泄漏连接?
任何帮助,将不胜感激。
谢谢,凯文
如果您使用 3rd 方 jars 进行连接轮询,则可以启用它们的日志记录并将 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>
如果您在 Hibernate 中使用连接池,那么您的池提供程序可能会保留大量连接,即使它们没有被使用。如果是 c3po,请检查connection.minPoolSize
和connection.maxPoolSize
属性。
我的数据源 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>
你能验证一下吗?
您可以在 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>