java - 如何提高从 Oracle AQ 读取数据的 Spring Batch 的性能?

标签 java performance spring-batch oracle-aq

我有一个 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 有效负载的目的地指定有效负载工厂”,即使我设置了消息监听器,所以我放弃了该配置。

最佳答案

要使用 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

关于java - 如何提高从 Oracle AQ 读取数据的 Spring Batch 的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55656705/

相关文章:

c++ - 乘以零是特例吗?

java - 如何在 Spring Batch Writer 中使用 Hibernate 无状态 session

java - Spring批处理文件访问问题?

Java - 字 rune 件的文件处理

java - 将函数列表应用于 Java 流 .map() 方法

java - 使用适当的 boolean 值将 psql 结果导出到 csv

java - JPQL:在构造函数表达式中接收集合

php - mysql varchar 长度/值

java - 我想用 java 对 solaris 和 linux 进行基准测试

java - Spring Batch事务异常:Existing transaction detected in JobRepository