我在我的应用程序中使用Spring + Hibernate + JPA。
我需要从Websphere MQ
读取消息并将消息插入DB。有时可能会有连续的消息可用,有时消息的数量也很少,有时我们可以预期Queue
没有消息。
目前我正逐一阅读该消息并将其插入数据库。但它在性能方面没有多大帮助。
我的意思是当我有大量的消息(队列中的示例300k消息)时,我无法更快地插入它们。每秒插入到DB的实体数量不是很高。因为我确实承诺每一个实体。
我想使用hibernate批处理,这样我就可以在一次提交中插入实体列表。 (例如:每次提交30到40条消息)
问题:
目前的实施:
消息监听器:
<bean id="myMessageListener" class="org.mypackage.MyMessageListener">
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destinationName" ref="queue"/>
<property name="messageListener" ref="myMessageListener"/>
<property name ="concurrentConsumers" value ="10"/>
<property name ="maxConcurrentConsumers" value ="50"/>
</bean>
听众课程:
package org.mypackage.MyMessageListener;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import org.mypackage.service.MyService;
public class MyMessageListener implements MessageListener {
@Autowired
private MyService myService;
@Override
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage) message;
// parse the message
// Process the message to DB
} catch (JMSException e1) {
e1.printStackTrace();
}
}
}
目前尚不清楚您的要求是什么。
Spring Batch项目提供了BatchMessageListenerContainer。
消息侦听器容器,适用于通过配置提供的建议拦截消息接收。要在单个事务中启用消息批处理,请使用通知链中的TransactionInterceptor和RepeatOperationsInterceptor(在基类中设置或不设置事务管理器)。然后,容器将使用RepeatOperations在同一线程中接收多条消息,而不是接收单个消息并对其进行处理。与RepeatOperations和事务拦截器一起使用。如果事务拦截器使用XA,则使用XA连接工厂,或者使用TransactionAwareConnectionFactoryProxy将JMS会话与正在进行的事务同步(在失败后打开重复消息的可能性)。在后一种情况下,您不需要在基类中提供事务管理器 - 它只会在路上并阻止JMS会话与数据库事务同步。