ConnectionPool: пул пуст - увеличьте либо maxPoolSize, или loanConnectionTimeout - PullRequest
0 голосов
/ 27 марта 2020

Я столкнулся с этой проблемой для моего приложения Springboot, которое подключается к БД и MQ и использует диспетчер транзакций Atomikos.

com.atomikos.jms.AtomikosJMSException|Connection pool exhausted - try increasing 'maxPoolSize' and/or 'borrowConnectionTimeout' on the AtomikosConnectionFactoryBean.
com.atomikos.datasource.pool.PoolExhaustedException: ConnectionPool: pool is empty - increase either maxPoolSize or borrowConnectionTimeout
    at com.atomikos.datasource.pool.ConnectionPool.waitForAtLeastOneAvailableConnection(ConnectionPool.java:326)
    at com.atomikos.datasource.pool.ConnectionPool.findOrWaitForAnAvailableConnection(ConnectionPool.java:144)
    at com.atomikos.datasource.pool.ConnectionPool.borrowConnection(ConnectionPool.java:132)
    at com.atomikos.datasource.pool.ConnectionPoolWithSynchronizedValidation.borrowConnection(ConnectionPoolWithSynchronizedValidation.java:23)
    at com.atomikos.jms.AtomikosConnectionFactoryBean.createConnection(AtomikosConnectionFactoryBean.java:601)
    at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:196)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.access$100(AbstractPollingMessageListenerContainer.java:77)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer$MessageListenerContainerResourceFactory.createConnection(AbstractPollingMessageListenerContainer.java:490)
    at org.springframework.jms.connection.ConnectionFactoryUtils.doGetTransactionalSession(ConnectionFactoryUtils.java:325)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:281)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:245)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1189)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1179)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1076)
    at java.lang.Thread.run(Thread.java:748)

Я попытался распечатать maxPoolSize и обнаружил, что это 1. Эта страница пришла между (https://www.atomikos.com/Documentation/ConfiguringJms), и я нашел строку, где они увеличили MaxPoolSize до 5. Я просто попытался установить его на 2, и это сработало.

AtomikosConnectionFactoryBean xaConnectionFactory = new AtomikosConnectionFactoryBean();
        xaConnectionFactory.setXaConnectionFactory(ibmMQXAConnectionFactory);
        xaConnectionFactory.setMaxPoolSize(2);

Может кто-нибудь помочь мне понять, каким должен быть идеальный размер бассейна. что это за эт c?

1 Ответ

0 голосов
/ 18 апреля 2020

Для обработки сообщений Atomikos использует соединения DB и JMS (в вашем случае). Эти соединения берутся из пулов доступных соединений. Чтобы понять, зачем нужны пулы соединений, перейдите по этой ссылке в качестве отправной точки - Connection_pool

Проще говоря - для обработки одного сообщения за раз, Atomikos требуется одна БД и одно соединение / сеанс JMS. Поэтому, если вы планируете обрабатывать 10 сообщений параллельно, размер каждого пула соединений должен быть не менее 10 (10 для БД и 10 для пулов соединений JMS соответственно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...