连接保持空闲状态并增加直至达到最大连接限制

时间:2017-09-07 16:43:52

标签: postgresql apache-camel spring-mybatis

我有一个使用apache-camel的web应用程序来提交执行一些postgresql select和insert的路由。

我没有使用任何DAO,所以我没有开始和关闭连接的代码,我相信连接生命周期是由Spring管理的,但似乎没有用。

问题在于,每次我的路由执行时,我都会看到另外一个仍然是IDLE的连接,因此之前的IDLE连接没有被重用,这会导致“客户端连接问题太多”

在我的路线中,我有:

<bean id="configLocation" class="org.springframework.core.io.FileSystemResource">
        <constructor-arg type="java.lang.String" value="..../src/main/resources/config/test.xml" />
    </bean> 

<bean id="dataSourcePostgres" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
        <property name="driver" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://localhost:5432/postgres" />
        <property name="username" value="postgres" />
        <property name="password" value="postgres" />
    </bean>

<bean id="postgresTrivenetaSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSourcePostgres" />
        <property name="configLocation" ref="configLocation" />
    </bean>

这里是一些示例查询:

<select id="selectTest" resultType="java.util.LinkedHashMap">
        select * from test;
    </select>

    <insert id="insertTest" parameterType="java.util.LinkedHashMap" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
        INSERT INTO test(note,regop_id)
    VALUES (#{note},#{idKey});
    </insert>

我甚至尝试添加这个:

<bean id="transactionManager"  
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSourcePostgresTriveneta" />  
    </bean> 

1 个答案:

答案 0 :(得分:0)

最后我发现了问题,就是DataSource永远不会在Camel路由结束时自动关闭。

因此,每次执行Camel路由时,它都会保留一个开放的数据源,然后所有创建的IDLE连接(它们的数量显然取决于DataSource配置及其用法)会一直存在并累积。

最终的解决方案是在Camel路由的末尾添加一个创建 ad hoc 的bean,将DataSource作为参数并关闭它,就是这样。