我们在春季引导应用程序中使用Bitronix作为jta事务管理器。问题是,它正在建立多个连接,消耗MQ服务器上的资源。我们使用作为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;
}Messagecontainer用于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;
}用于DB连接的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;
}发布于 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%的额外损失。
https://stackoverflow.com/questions/53334069
复制相似问题