首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧引导不松开tomcat.jdbc.pool连接通过Spring集成amqp入站通道适配器

弹簧引导不松开tomcat.jdbc.pool连接通过Spring集成amqp入站通道适配器
EN

Stack Overflow用户
提问于 2015-03-09 00:16:47
回答 1查看 4.4K关注 0票数 2

我只是打赌在这件事上我缺少一些基本的东西,但是对于我的生活,我还没有弄清楚。我试图使用从amqp:入站通道适配器接收,该适配器最终调用一个使用"jdbcTemplate.getDataSource().getConnection().prepareStatement(sql).execute();“调用oracle存储过程的服务。

所有这些都通过一个Spring Boot应用程序运行,该应用程序包括Spring starter-web,因此它引入了嵌入式tomcat,我的Spring应用程序还包括Spring starter、Spring starter-integration、Spring starter,所以让Spring为我做所有的魔术。某人石头!

出于某种原因,为了使用XML,我还必须在我的pom.xml文件中专门包括:

代码语言:javascript
复制
    <!-- Required in order to expose amqp xml schema namespace -->
    <dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-amqp</artifactId>
    </dependency>

一切看起来都很好;但是,通道似乎并没有放弃JDBC连接。我最终得到了一个org.apache.tomcat.jdbc.pool.PoolExhaustedException.这将在通道服务完队列中的‘soon . from ource.max-active’消息时立即发生。我通过使用那个属性来确认这一点,它总是发生在我设置的任何数字上。在使用db调用完成后,我记录在服务-激活器中调用的服务方法,因此我知道它们已经完成,但是db连接显然从未被传递回池.有什么想法吗?下面是我的项目的相关片段:

application.properties:

代码语言:javascript
复制
spring.datasource.url = jdbc:oracle:thin:@[myserver].com:1521:[SID]
spring.datasource.username = scrubbed
spring.datasource.password = scrubbed
spring.datasource.driver-class-name = oracle.jdbc.driver.OracleDriver
spring.datasource.max-active=50 
...
spring.rabbitmq.port = 5672
spring.rabbitmq.addresses = clusered.server1, clusered.server1
spring.rabbitmq.username = scrubbed
spring.rabbitmq.password = scrubbed

服务:

代码语言:javascript
复制
@Autowired
private JdbcTemplate jdbcTemplate;

@Override
public void executeDbJob(String dbProcedureCall) {
    log.info("Executing Job id: {} Database Call: {}", jobId, dbProcedureCall);
    executeStoredProcedure(dbProcedureCall);
    log.info("Finished DB call for job id: {} Database Call: {}", jobId, dbProcedureCall);
}
/**
 * This wraps a stored procedure call just as it is, parameter values included into an anonymous
 * pl/sql block. This could be a pretty big security issue so we will want to scrub the
 * procedure coming in to ensure it doesn't have additional embedded SQL.
 */
private void executeStoredProcedure(final String procedure) {
    final String sql = "begin ".concat(procedure).concat(" end;");
    try {
        jdbcTemplate.getDataSource().getConnection().prepareStatement(sql).execute();
    } catch (SQLException e) {
        log.error("Could not execute procedure call: {} raised: {}", sql, e);
    }
}

XML:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/integration" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:stream="http://www.springframework.org/schema/integration/stream"
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:task="http://www.springframework.org/schema/task" 
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:amqp="http://www.springframework.org/schema/integration/amqp" 
    xmlns:rabbit="http://www.springframework.org/schema/rabbit"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
                http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd
                http://www.springframework.org/schema/integration/amqp http://www.springframework.org/schema/integration/amqp/spring-integration-amqp.xsd
                http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
                http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
                http://www.springframework.org/schema/integration/stream http://www.springframework.org/schema/integration/stream/spring-integration-stream.xsd"
    default-lazy-init="false">

    <beans:description>Recommendation Engine provider account event flow</beans:description>

    <!-- ********** Consumer flows ********** -->

    <!-- Note: The rabbitConnectionFactory is setup automagically just like rabbitTemplate by spring-boot-starter-amqp -->
    <amqp:inbound-channel-adapter id="initiateJobRequest" channel="initiateJobRequestChannel"
        message-converter="jsonMessageConverter" queue-names="bc.initiate" connection-factory="rabbitConnectionFactory"
        auto-startup="true" concurrent-consumers="1" acknowledge-mode="AUTO" error-handler="loggingErrorHandler" task-executor="amqpClientExecutor"/>

    <!-- Add queue capacity to make channel pollable -->
    <channel id="initiateJobRequestChannel">
        <queue capacity="32" />
        <interceptors>
            <wire-tap channel="amqpDebugLogger" />
        </interceptors>
    </channel>

     <service-activator id="initiateJobRequestExtractor" input-channel="initiateJobRequestChannel"
        output-channel="nullChannel" ref="jobExecutorService" method="executeDbJob">
        <poller ref="initiateJobPoller" />
    </service-activator>

    <!-- ********** Loggers ********** -->

     <logging-channel-adapter id="amqpDebugLogger" level="DEBUG" auto-startup="true"
        log-full-message="true" />


    <!-- ********** Executors ********** -->

     <task:executor id="amqpClientExecutor" pool-size="8" queue-capacity="0" rejection-policy="CALLER_RUNS" />

    <poller id="initiateJobPoller" task-executor="initiateJobTaskExecutor" fixed-rate="50" receive-timeout="1000" />
    <task:executor id="initiateJobTaskExecutor" pool-size="16" queue-capacity="0" rejection-policy="CALLER_RUNS" />

</beans:beans>

在有帮助的情况下添加异常blah:

代码语言:javascript
复制
org.apache.tomcat.jdbc.pool.PoolExhaustedException: [initiateJobTaskExecutor-5] Timeout: Pool empty. Unable to fetch a connection in 30 seconds, none available[size:50; busy:50; idle:0; lastwait:30000].
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:672)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:186)
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:127)
    at com.everbridge.bce.jobexecutor.service.impl.JobExecutorServiceImpl.executeStoredProcedure(JobExecutorServiceImpl.java:90)
    at com.everbridge.bce.jobexecutor.service.impl.JobExecutorServiceImpl.executeDbJob(JobExecutorServiceImpl.java:55)
    at sun.reflect.GeneratedMethodAccessor58.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:112)
    at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:102)
    at org.springframework.expression.spel.ast.MethodReference.access$000(MethodReference.java:49)
    at org.springframework.expression.spel.ast.MethodReference$MethodValueRef.getValue(MethodReference.java:342)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:88)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:131)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:330)
    at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:164)
    at org.springframework.integration.util.MessagingMethodInvokerHelper.processInternal(MessagingMethodInvokerHelper.java:276)
    at org.springframework.integration.util.MessagingMethodInvokerHelper.process(MessagingMethodInvokerHelper.java:142)
    at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:75)
    at org.springframework.integration.handler.ServiceActivatingHandler.handleRequestMessage(ServiceActivatingHandler.java:71)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:99)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)
    at org.springframework.integration.endpoint.PollingConsumer.handleMessage(PollingConsumer.java:74)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:219)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.access$000(AbstractPollingEndpoint.java:55)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:149)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:146)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller$1.run(AbstractPollingEndpoint.java:298)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.run(ErrorHandlingTaskExecutor.java:52)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
EN

回答 1

Stack Overflow用户

发布于 2015-04-30 02:01:36

我想出了这个..。帕维尔·霍拉尔回答了马克关于"C3PO连接池-连接不被释放“的问题(马克问了这个问题),这给了我一个关于我的问题和如何解决它的线索。原来,这是因为我要求从JdbcTemplate (jdbcTemplate.getDataSource().getConnection().prepareStatement(sql).execute())获得数据库连接;我用jdbcTemplate.update(sql);替换了它,它成功了!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28933492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档