首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bitronix PoolingConnectionFactory创建多个不会关闭的连接

Bitronix PoolingConnectionFactory创建多个不会关闭的连接
EN

Stack Overflow用户
提问于 2018-11-16 08:31:59
回答 1查看 609关注 0票数 0

我们在春季引导应用程序中使用Bitronix作为jta事务管理器。问题是,它正在建立多个连接,消耗MQ服务器上的资源。我们使用作为MQ服务器。出于某种原因,Bitronix没有履行我们给出的池大小。另一个观察是,当我们同时接收或发送消息突发时,就会发生连接泄漏。下面是代码中的配置。请建议如何解决连接泄漏问题。

PoolingConnectionFactory:

代码语言:javascript
复制
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吐露:

代码语言:javascript
复制
@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;
    }

Messagecontainer用于SpringIntegrationFlows:

代码语言:javascript
复制
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;
    }

用于DB连接的PoolingDataSource

代码语言:javascript
复制
  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;
}
EN

回答 1

Stack Overflow用户

发布于 2018-11-16 19:22:43

听起来,IBMMQ将连接和会话池从客户端jar中删除,如 technote中所描述的那样。这可以解释高于maxPoolSize连接计数的原因,特别是在没有显式地池xaSession的情况下。BTM maxPoolSize适用于JmsPooledConnection,但这些加载项连接可以来自xaSession,而不是由maxPoolSize控制。

我不熟悉Spring或您设置,但阅读了使用CachingConnectionFactory的建议(例如。参考文献1参2),似乎IBMMQ对此增加了某些支持(github 链接,特别是how部分)。我没有任何使用它们的经验。)

顺便说一句,ShareConversation也可以用来控制连接的数量,服务器端默认为10。IBM (链接)提到了使用它可能造成15%的额外损失。

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

https://stackoverflow.com/questions/53334069

复制
相关文章

相似问题

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