我们在 Oracle DB 环境中使用 Oracle Advanced Queue 执行了性能测试。我们使用以下脚本创建了队列和队列表:
BEGIN
DBMS_AQADM.create_queue_table(
queue_table => 'verisoft.qt_test',
queue_payload_type => 'SYS.AQ$_JMS_MESSAGE',
sort_list => 'ENQ_TIME',
multiple_consumers => false,
message_grouping => 0,
comment => 'POC Authorizations Queue Table - KK',
compatible => '10.0',
secure => true);
DBMS_AQADM.create_queue(
queue_name => 'verisoft.q_test',
queue_table => 'verisoft.qt_test',
queue_type => dbms_aqadm.NORMAL_QUEUE,
max_retries => 10,
retry_delay => 0,
retention_time => 0,
comment => 'POC Authorizations Queue - KK');
DBMS_AQADM.start_queue('q_test');
END;
/
我们使用 PL/SQL 客户端以 2380 TPS 发布了 1000000 条消息。我们使用 Oracle JMS API 客户端以 292 TPS 消耗了 1000000 条消息。消费者的速度几乎比发布者慢 10 倍,这个速度不符合我们的要求。
下面是我们用来消费消息的一段 Java 代码:
if (q == null) initializeQueue();
System.out.println(listenerID + ": Listening on queue " + q.getQueueName() + "...");
MessageConsumer consumer = sess.createConsumer(q);
for (Message m; (m = consumer.receive()) != null;) {
new Timer().schedule(new QueueExample(m), 0);
}
sess.close();
con.close();
您对我们如何提高消费者端的性能有什么建议吗?