我有一个Spring Batch代码,可以从Oracle AQ中读取(出队)数据。
但是要仅读取100行,则需要4分钟!!
该阅读器可能有什么问题? ¿我如何提高性能?
这是我的自定义阅读器中的数据出队代码:
final String queueOwner = "OWNER";
final String queueName = "QUE_NAME";
try (Connection aqconn = dataSource.getConnection()) {
aqconn.setAutoCommit(false);
Class.forName("oracle.AQ.AQOracleDriver");
AQSession aqSession = AQDriverManager.createAQSession(aqconn);
AQQueue queue;
AQMessage message = null;
AQDequeueOption deqOption = new AQDequeueOption();
AQObjectPayload payload;
Data data= new Data();
queue = aqSession.getQueue(queueOwner, queueName);
message = ((AQOracleQueue) queue).dequeue(deqOption, DataAq.getORADataFactory());
payload = message.getObjectPayload();
DataAq dataAq= (DataAq) payload.getPayloadData();
--Some validation
aqconn.commit();
aqSession.close();
return saldo;
}
我已经尝试使用JmsItemReader,但是即使我设置了消息侦听器,它总是给我这个错误“必须为具有ADT有效负载的目标指定有效负载工厂”,所以我放弃了该配置。 / p>
答案 0 :(得分:0)
要使用SpringBtach从Oracle AQ中读取信息,我正在使用JmsTemplate。
以下是我正在使用的配置示例:
@Bean
public ConnectionFactory connectionFactory() throws JMSException, SQLException {
return AQjmsFactory.getQueueConnectionFactory(dataSource());
}
@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setConnectionFactory(connectionFactory);
SimpleMessageConverter converter = new SimpleMessageConverter();
jmsTemplate.setMessageConverter(converter);
jmsTemplate.setSessionTransacted(true);
jmsTemplate.setDefaultDestinationName("YOUR_QUEUE_NAME");
return jmsTemplate;
}
@Bean
public DataSource dataSource() throws SQLException {
OracleConnectionPoolDataSource dataSource = new OracleConnectionPoolDataSource();
dataSource.setURL("jdbc:oracle:thin:@host:port:database");
dataSource.setUser("usr");
dataSource.setPassword("pwd");
return dataSource;
}
可以从SpringBatch使用JmsItemReader