我有一个使用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>
答案 0 :(得分:0)
最后我发现了问题,就是DataSource永远不会在Camel路由结束时自动关闭。
因此,每次执行Camel路由时,它都会保留一个开放的数据源,然后所有创建的IDLE连接(它们的数量显然取决于DataSource配置及其用法)会一直存在并累积。
最终的解决方案是在Camel路由的末尾添加一个创建 ad hoc 的bean,将DataSource作为参数并关闭它,就是这样。