Как повысить производительность Spring Batch, который читает данные из Oracle AQ? - PullRequest
1 голос
/ 12 апреля 2019

У меня есть код 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», даже если я установил прослушиватель сообщений, поэтому я отказался от этой конфигурации.

1 Ответ

0 голосов
/ 16 апреля 2019

Для чтения из Oracle AQ с помощью SpringBtach я использую 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;
    }

После того, как вы можете использовать JmsItemReader изSpringBatch

...