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



我们在春季启动应用程序中使用Bitronix XA作为jta事务管理器。问题是它正在进行多个连接,这会占用MQ服务器上的资源。我们使用IBMwebsphere作为MQ服务器。出于某种原因,Bitronix没有遵守我们给出的池大小。另一个观察结果是,当我们同时接收或发送突发消息时,就会发生连接泄漏。以下是代码中的配置。请告知如何解决连接泄漏问题。

池连接工厂:

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:中使用的Messagecontainer

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;
}

听起来像IBMMQ从其客户端jar中提取了连接和会话池,如本技术说明中所述。这可以解释高于maxPoolSize的连接计数,特别是如果您没有显式地池化xaSession。BTMmaxPoolSize适用于JmsPooledConnection,但这些附加连接可能来自xaSessions,而不受maxPoolSize的控制。

我不熟悉Spring或您的设置,但阅读了使用CachingConnectionFactory的建议(例如,ref-1,ref-2(,并且似乎IBMMQ对此添加了一定的支持(github链接,尤其是how部分。不过我没有任何使用它们的经验……(。

顺便说一句,ShareConversation也可以用于控制连接数,在服务器端默认为10。IBM文档(链接(提到使用它可能会导致15%的性能损失。

相关内容

  • 没有找到相关文章

最新更新