我在Spring Boot中使用Apache Camel。我将我的spring boot应用程序用作不带任何服务器的jar。
在应用程序中,我有一个延迟为1000的Camel-SQL使用者路由。此使用者随后进一步调用了使用拆分器和并行处理的其他路由。
通过Jprofiler,我观察到通过使用者打开的数据库连接没有关闭。
我在application.properties和使用Oracle DB中也有dbcp2设置。我是第一次观察到此连接问题。有没有人在任何时候也面临同样的问题?还是我需要添加任何其他配置。
任何帮助将不胜感激。
答案 0 :(得分:0)
这是我的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>
也许会对您有所帮助。 我认为数据库连接只是没有时间回到查询之间的池中。 您需要配置连接超时和类似的参数(空闲参数, minEvictableIdleTimeMillis , timeBetweenEvictionRunsMillis , numTestsPerEvictionRun )。