【问题标题】:camel-sql consumer DB connection issuecamel-sql 消费者数据库连接问题
【发布时间】:2019-03-15 11:11:24
【问题描述】:

我正在使用带有 Spring 引导的 Apache Camel。我在没有任何服务器的情况下将我的 spring boot 应用程序用作 jar。

在应用程序中,我有一个延迟为 1000 的 Camel-SQL 消费者路由。该消费者然后进一步调用其他使用拆分器和并行处理的路由。

通过 Jprofiler,我观察到我的数据库连接没有关闭,而是通过消费者打开的。

我在 application.properties 中也有 dbcp2 设置并使用 Oracle DB。我第一次观察到这个连接问题。有没有人在任何时候也遇到过同样的问题?还是我需要添加任何其他配置。

任何帮助将不胜感激。

【问题讨论】:

    标签: oracle spring-boot apache-camel camel-sql


    【解决方案1】:

    这是我的 Oracle 配置之一:

    <cm:property-placeholder id="server.placeholder" persistent-id="name.of.company.datasource">
        <cm:default-properties>
            <cm:property name="db.host" value="host"/>
            <cm:property name="db.port" value="1521"/>
            <cm:property name="db.instance" value="dbname"/>
            <cm:property name="db.user" value="user"/>
            <cm:property name="db.password" value="password"/>
            <cm:property name="driverClassName" value="oracle.jdbc.pool.OracleDataSource" />
            <cm:property name="validationQuery" value="SELECT 1 FROM DUAL" />
            <cm:property name="defaultReadOnly" value="false" />
            <cm:property name="defaultAutoCommit" value="true" />
            <cm:property name="maxActive" value="100" />
            <cm:property name="whenExhaustedAction" value="2" />
            <cm:property name="maxWait" value="-1" />
            <cm:property name="maxIdle" value="8" />
            <cm:property name="minIdle" value="1" />
            <cm:property name="testOnBorrow" value="true" />
            <cm:property name="testOnReturn" value="true" />
            <cm:property name="timeBetweenEvictionRunsMillis" value="-1" />
            <cm:property name="numTestsPerEvictionRun" value="3" />
            <cm:property name="minEvictableIdleTimeMillis" value="1800000" />
            <cm:property name="testWhileIdle" value="false" />
            <cm:property name="softMinEvictableIdleTimeMillis" value="-1" />
            <cm:property name="lifo" value="true" />
        </cm:default-properties>
    </cm:property-placeholder>
    
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value= "${driverClassName}" />
      <property name="url" value="jdbc:oracle:thin:@${db.host}:${db.port}:${db.instance}" />
      <property name="username" value="${db.user}" />
      <property name="password" value="${db.password}" />
      <property name="maxIdle" value="1" />
    </bean>
    
    <bean id="connectionFactory" class="org.apache.commons.dbcp.DataSourceConnectionFactory">
      <argument ref="dataSource" />
    </bean>
    
    <bean id="connectionPool" class="org.apache.commons.pool.impl.GenericObjectPool" >
      <argument><null/></argument>
      <argument value="${maxActive}" />
      <argument value="${whenExhaustedAction}" />
      <argument value="${maxWait}" />
      <argument value="${maxIdle}" />
      <argument value="${minIdle}" />
      <argument value="${testOnBorrow}" />
      <argument value="${testOnReturn}" />
      <argument value="${timeBetweenEvictionRunsMillis}" />
      <argument value="${numTestsPerEvictionRun}" />
      <argument value="${minEvictableIdleTimeMillis}" />
      <argument value="${testWhileIdle}" />
      <argument value="${softMinEvictableIdleTimeMillis}" />
      <argument value="${lifo}" />
    </bean>
    
    <bean id="pooledConnectionFactory" class="org.apache.commons.dbcp.PoolableConnectionFactory" >
      <argument ref="connectionFactory" />
      <argument ref="connectionPool" />
      <argument><null/></argument>
      <argument value="${validationQuery}" />
      <argument value="${defaultReadOnly}" />
      <argument value="${defaultAutoCommit}" />
    </bean>
    
    <bean id="poolingDataSource" class="org.apache.commons.dbcp.PoolingDataSource" depends-on="pooledConnectionFactory">
      <argument ref="connectionPool" />
    </bean>
    
    <service interface="javax.sql.DataSource" ref="poolingDataSource"> 
        <service-properties>
            <entry key="osgi.jndi.service.name" value="jdbc/oracle/db"/>
            <entry key="datasource.name" value="jdbc/oracle/db" />
        </service-properties>
    </service>
    

    也许它会帮助你。 我认为数据库连接只是没有时间在查询之间返回池。 您需要配置连接超时和类似参数(idle params、minEvictableIdleTimeMillistimeBetweenEvictionRunsMillisnumTestsPerEvictionRun)。

    【讨论】:

    • 嗨,Alexey,感谢您的回复。我已经有了与 dbcp2 相关的属性。问题是连接没有关闭,因为无法创建新连接。
    • @gomzee,恕我直言,在路线运行期间超出了 maxActive 值。这是因为连接没有时间返回池。
    • Alexey,数据库配置为: spring.datasource.dbcp2.initial-size=30 spring.datasource.dbcp2.max-total=40 spring.datasource.dbcp2.pool-prepared-statements =true spring.datasource.dbcp2.max-idle=8 spring.datasource.dbcp2.min-dle=2 而我的 maxMessagesPerPoll=10。因此,对于处理 396 条记录,我的程序总是在 380 条记录处停止,在处理 380 条记录后它无法获得数据库连接。通过 JProfiler,我可以将所有活动连接视为内存泄漏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 2014-05-22
    • 1970-01-01
    • 2014-09-26
    • 2020-12-03
    • 2016-10-10
    相关资源
    最近更新 更多