我正在使用我们的Java Web应用程序遇到一种奇怪的行为,配置为通过C3p0 ComboPooledDataSource访问PostgreSQL数据库。 首先,PostgreSQL服务器安装有默认参数,我们不需要更改其中的任何变量..
我们使用Spring JdbcTemplate版本3.2.12.RELEASE运行查询。与PostgreSQL一样,它配置了默认参数。 这是我们使用C3p0和Spring的上下文配置;
<bean id="resoilDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<!-- access configuration -->
<property name="driverClass" value="org.postgresql.Driver" />
<property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/*****" />
<property name="user" value="******" />
<property name="password" value="******" />
<!-- pool sizing -->
<property name="initialPoolSize" value="1" />
<property name="minPoolSize" value="1" />
<property name="maxPoolSize" value="6" />
<property name="acquireIncrement" value="3" />
<property name="maxStatements" value="150" />
<!-- refreshing connections -->
<property name="maxIdleTime" value="180" /> <!-- 3min -->
<property name="maxIdleTimeExcessConnections" value="120" /> <!-- 3min -->
<!-- timeouts e testing -->
<property name="idleConnectionTestPeriod" value="120" /> <!-- 60 -->
<property name="testConnectionOnCheckout" value="true" />
<property name="testConnectionOnCheckin" value="false" />
<property name="preferredTestQuery" value="SELECT 1" />
</bean>
<bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="resoilDataSource"></property>
</bean>
让我描述一下我们遇到的问题: 一旦我们达到Postgres端打开的空闲连接的“maxPoolSize”,这个连接永远不会过期,它们仍处于“空闲”状态,并且C3p0无法将其中任何一个连接回来进行池化。 我希望一旦这些打开的连接中的一个超出空闲时间,C3p0就能够重用它,因为“maxIdleTimeExcessConnections”参数。 不幸的是,这从未发生过。 我还尝试用Apache DBCP BasicDataSource替换C3p0 ComboPooledDataSource,但没有任何改变。
在为我们的应用程序使用PostgreSQL数据库之前,我们的客户要求我们安装集成其他流行数据库而不是PostgreSQL(特别是SQL Server和Oracle)的应用程序,我们从未遇到过这种行为。
任何关于它发生了什么的想法都得到了真正的赞赏,提前谢谢。