使用PostgreSQL的C3p0数据源

时间:2017-06-25 14:10:27

标签: java postgresql spring-jdbc c3p0

我正在使用我们的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)的应用程序,我们从未遇到过这种行为。

任何关于它发生了什么的想法都得到了真正的赞赏,提前谢谢。

0 个答案:

没有答案