Java 冬眠+;c3p0+;由于池而达到mysql最大连接数

Java 冬眠+;c3p0+;由于池而达到mysql最大连接数,java,hibernate,database-connection,connection-pooling,c3p0,Java,Hibernate,Database Connection,Connection Pooling,C3p0,我已经使用以下代码在我的应用程序中配置了c3p0数据源 <bean id="globalDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="${D

我已经使用以下代码在我的应用程序中配置了c3p0数据源

<bean id="globalDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUrl" value="${DbUrl}/${DbName}?useOldAliasMetadataBehavior=true&amp;useSSL=false" />
    <property name="user" value="${DbUserId}" />
    <property name="password" value="${Password}" />
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="100" />
    <property name="idleConnectionTestPeriod" value="14400" />
    <property name="preferredTestQuery" value="select 1" />
 </bean>

我有五个配置相同的不同数据源。在mysql端,我将max_连接配置为300。使用此live code mysql 10天后,所有休眠连接的进程列表如下所示:

  • 数据库1:70个连接
  • 数据库2:70个连接
  • 数据库3:70个连接
  • 数据库4:50个连接
  • 数据库5:40个连接
所有这些连接都处于睡眠状态,mysql已达到290到300个连接的最大限制。有没有办法释放连接,使连接数至少达到最小池大小

关于它的更多信息,我的应用程序非常旧,在许多hibernate事务中连接都没有关闭,因为如果我使用下面的代码,很难找到影响点

<property name="hibernate.connection.release_mode">after_transaction</property>
交易后的

所以我不能在hibernate-cfg.xml中使用上述行,因此我还通过“idleConnectionTestPeriod”来保持连接的活动性,以避免超时问题


请提出最好的解决方案。我正在考虑使用c3p0的“maxIdleTimeExcessConnections”属性。

您应该做的第一件事是检查连接泄漏(这似乎很可能是您的问题)。见例

最好的办法是消除连接泄漏。首先,你应该设置和。另见


如果这是一个古老而粗糙的东西,而您不能或不想处理它,您可以通过设置一个并关闭来解决这个问题。在每次连接签出时收集堆栈跟踪会拖累性能。但首先,要理解这个问题,您应该设置两者。如果您决定不能或不想实际解决问题,但希望解决问题,则取消设置或设置为false
debugUnreturnedConnectionStackTraces

有关详细信息,我注意到了以下几点:1。当一些高性能的7或8查询运行时,并行连接从正常的290个连接变为300个,甚至无法从mysql CLI连接,CPU性能在1个多小时内达到100%的峰值。您是否尝试过使用
maxidletimeout
值来查看这是否有助于睡眠连接?基本上,c3p0驱动程序在默认情况下不会过期并放弃任何连接,因为它使用
0
进行此操作,但是
0
以上的任何值都将允许放弃连接,从而允许队列在非活动期间收缩。我也尝试了MaxIdleTimeOut,它会收缩队列,但我因此面临超时问题。