Bitronix PoolingConnectionFactory делает несколько соединений, которые не будут закрыты - PullRequest
0 голосов
/ 16 ноября 2018

Мы используем Bitronix XA в качестве менеджера транзакций jta в нашем весеннем загрузочном приложении. Проблема заключается в том, что он создает несколько соединений, которые поглощают ресурсы на сервере MQ. Мы используем IBM websphere в качестве сервера MQ. По какой-то причине Bitronix не соблюдает размер пула, который мы дали. Другое наблюдение состоит в том, что утечки соединения происходят, когда мы получаем или отправляем пакет сообщений одновременно. Ниже приведены конфигурации в коде. Посоветуйте, пожалуйста, как решить проблему утечки соединения.

PoolingConnectionFactory:

PoolingConnectionFactory connectionFactory = new PoolingConnectionFactory();
        connectionFactory.setClassName("com.ibm.mq.jms.MQXAQueueConnectionFactory");
        connectionFactory.setUniqueName(XA_FACTORY_NAME);
        connectionFactory.setAllowLocalTransactions(false);
        connectionFactory.setTestConnections(true);
        connectionFactory.setUser(user);
        connectionFactory.setPassword(password);
        connectionFactory.setMaxPoolSize(20);
        Properties driverProperties = connectionFactory.getDriverProperties();
        driverProperties.setProperty("port",  ...);
        driverProperties.setProperty("transportType", ...);
        driverProperties.setProperty("channel", ...);
        driverProperties.setProperty("hostName", ...);
        driverProperties.setProperty("queueManager", ...);

Btm конфиги:

@Bean
    @Profile({"cloud", "local"})
    @DependsOn("instanceInfo")
    public bitronix.tm.Configuration btmConfig() {
        bitronix.tm.Configuration btmConfig = TransactionManagerServices.getConfiguration();
        btmConfig.setDisableJmx(true);
        btmConfig.setServerId(instanceInfo);
        return btmConfig;
    }

    @Bean
    @DependsOn("btmConfig")
    public BitronixTransactionManager bitronixTransactionManager() {
        BitronixTransactionManager transactionManager = TransactionManagerServices.getTransactionManager();
        return transactionManager;
    }

Контейнер сообщений используется в SpringIntegrationFlows:

private DefaultMessageListenerContainer createMessageContainer(MessageListenerAdapter messageListenerAdapter,
            ConnectionFactory connectionFactory, String queue, JtaTransactionManager jtaTransactionManager) {
        DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
        container.setMessageListener(messageListenerAdapter);
        container.setConnectionFactory(connectionFactory);
        container.setDestinationName(queue);
        container.setSessionTransacted(true);
        container.setTransactionManager(jtaTransactionManager);
        container.setErrorHandler(containerErrorHandler);
        return container;
    }

PoolingDataSource для подключения к БД:

  public PoolingDataSource createPooledDataSource(String driverClassName, String userName, String password, String jdbcURL, String validationQuery) {      
        PoolingDataSource dataSource = new PoolingDataSource();
        dataSource.setUniqueName("dataSource");
        dataSource.setMaxIdleTime(8);
        dataSource.setMinPoolSize(1);
        dataSource.setMaxPoolSize(20);
        dataSource.setTestQuery(validationQuery);
        dataSource.getDriverProperties().setProperty("user", userName);
        dataSource.getDriverProperties().setProperty("password", password);
        dataSource.getDriverProperties().setProperty("URL", jdbcURL);
        dataSource.setClassName(driverClassName);
        dataSource.setTestQuery(validationQuery);
        dataSource.setAllowLocalTransactions(true);
        dataSource.init();
        return dataSource;
}

1 Ответ

0 голосов
/ 16 ноября 2018

Похоже, IBMMQ извлек соединение и пул сеансов из своей клиентской фляги, как описано в этом техническом замечании. Это может объяснить большее, чем maxPoolSize число подключений, особенно если вы явно не объединяете xaSession s. BTM maxPoolSize относится к JmsPooledConnection, но эти дополнительные соединения могут исходить из xaSession s и не контролироваться maxPoolSize.

Я не знаком с Spring или с вашими настройками, но прочитал рекомендации по использованию CachingConnectionFactory (например, ref-1 , ref-2 ), и похоже, что IBMMQ добавил определенная поддержка для этого (github ссылка , особенно раздел how. У меня нет опыта их использования, хотя ....).

Кстати, ShareConversation также может использоваться для управления количеством соединений, которое по умолчанию равно 10 на стороне сервера. IBM doc ( ссылка ) упоминает потенциальный 15% штраф за перфорирование при его использовании.

...