Tim, thanks for writing.

Does AMQ support DB-speciifc queries?  I could likely write the patch
myself if pointed in the right direction.

DefaultJDBCAdapter.doRecoverNextMessages looks like a method that would be
called at start-up, can you verify?
Or, under what circumstances is that invoked?

The default install had an index on ID; we added an index on Container plus
ID that changed the plan:


*Temp Space*

*Plan*

*SELECT STATEMENT *ALL_ROWS Cost: 4

*3 *



*3 **FILTER *

*2 *





*2 **TABLE ACCESS BY INDEX ROWID TABLE *ACTIVEMQ.ACTIVEMQ_MSGS Cost: 4
Bytes: 1,802 Cardinality: 1

*1 *







*1 **INDEX RANGE SCAN INDEX (UNIQUE) *ACTIVEMQ.SYS_C0010280 Cost: 3
Cardinality: 1



*Temp Space*

*Plan*

*SELECT STATEMENT *ALL_ROWS Cost: 7

*4 *



*4 **SORT ORDER BY *Cost: 7 Bytes: 7,208 Cardinality: 4

*3 *





*3 **FILTER *

*2 *







*2 **TABLE ACCESS BY INDEX ROWID BATCHED TABLE *ACTIVEMQ.ACTIVEMQ_MSGS Cost:
6 Bytes: 7,208 Cardinality: 4

*1 *









*1 **INDEX RANGE SCAN INDEX *ACTIVEMQ.ACTIVEMQ_MSGS_CIDX Cost: 4
Cardinality: 4



Thank you
Nathan




On Fri, Feb 2, 2018 at 9:08 AM, Tim Bain <tb...@alumni.duke.edu> wrote:

> I've never heard of this particular problem being reported, but it should
> be fairly straightforward to turn it into a top-N query by doing a
> sub-select as described in
> http://www.oracle.com/technetwork/issue-archive/
> 2006/06-sep/o56asktom-086197.html.
> Would you please submit an enhancement request in JIRA for this change?
>
> BTW, have you had your DBA ensure that an optimal index is in place on the
> table and that it's in good repair (Oracle indexes get cluttered with
> deleted rows over time when your use pattern is frequent insertions and
> deletions, so semi-regular rebuilds may be necessary.)
>
> Tim
>
> On Feb 1, 2018 10:00 AM, "nathanwray" <nw...@detroitsci.com> wrote:
>
> > We recently had over 1M messages back up in a container.
> >
> > For reasons that aren't completely clear, AMQ executed the query found in
> > Statements.getFindNextMessagesStatement mid-morning:
> >
> > SELECT ID, MSG
> >     FROM activemq.ACTIVEMQ_MSGS
> >    WHERE CONTAINER = :1 AND ID > :2 AND ID < :3 AND XID IS NULL
> > ORDER BY ID;
> >
> > With the parameters:
> > 1              queue://generic_createContract
> > 2              -1
> > 3              183893253
> >
> > This call appears to originate from
> > DefaultJDBCAdapter.doRecoverNextMessages, which calls setMaxRows on the
> > PreparedStatement with (apparently) 200 rows.
> >
> > However it appears the Oracle thin driver makes no attempt to limit the
> > result set based on the max rows value; instead it selects and sorts the
> > entire 1M row plus values and makes them available to the client, which
> > stops creating objects after reading the first 200.
> >
> > The net result was that our Oracle server spiked to 90%+ on this one
> query
> > and caused a complete AMQ failure in production, knocking over a number
> of
> > critical systems.
> >
> > We wound up stopping all of our brokers and manually dropping the
> messages
> > in this container in order to resolve the 3 hour outage.
> >
> > Is there a known issue with using Oracle persistence with AMQ that
> > precludes
> > having more than thousands of messages?  If the "max rows" approach with
> > the
> > thin driver works as it appears to, we can't be the first to have seen
> this
> > problem.
> >
> > Any insight would be appreciated.
> >
> > Thank you
> > Nathan
> >
> >
> >
> >
> >
> > --
> > Sent from: http://activemq.2283324.n4.nabble.com/ActiveMQ-User-
> > f2341805.html
> >
>

Reply via email to