【问题标题】:How to increase the performance of a Spring Batch that read data from an Oracle AQ?如何提高从 Oracle AQ 读取数据的 Spring Batch 的性能?
【发布时间】:2019-04-12 17:17:08
【问题描述】:

我有一个从 Oracle AQ 读取(出列)数据的 Spring Batch 代码。

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

【问题讨论】:

  • 为什么每次读取都打开事务/连接并关闭?

标签: java performance spring-batch oracle-aq


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-12-13
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2013-03-17
    • 1970-01-01
    相关资源
    最近更新 更多